KafkaMeetup Japan#1 で発表しました

Apache Kafka Meetup Japan #1 at Yahoo! JAPAN - connpass

www.slideshare.net

ザクザクとした発表になりましたが、これからKafkaを導入しようとか今導入してますという人たちにとって役立つ情報になると良いなと思っています。

RAIDについては、カーネルパニックにしちゃえば良いのではという意見も頂き色々進捗しそうです。 Brokerのヘルスチェックと組み合わせてやりたい・・メトリクスの可視化もしたい・・。

Scala研修テキストも公開されているので、 今回のも含めて、お仕事でやっていることが大体外部に公開できていることになりました。

こういう感じでオープンに仕事できるというのは良いことですね₍₍ (ง´・_・`)ว ⁾⁾

ansible.cfgにask_vault_pass = Trueを設定したいけど毎回パスワード聞かれたくないとき

ansible.cfgにask_vault_pass = Trueを設定したいけどそうすると必要なとき以外もvaultパスを聞かれてつらいのをなんとか回避する

ansible-vaultで暗号化したファイルをansible-playbookコマンドなどで使いたい場合は

ansible-playbook --ask-vault-pass -i ... site.yml

のように--ask-vault-pass を指定する必要がありますが、人類なので容易に指定を忘れ、 ERROR: A vault password must be specified to decrypt のように追い返されたりします。

このようなミスを防ぐためにAnsible Vault を賢く使うで紹介されているようなテクニックが利用できます。

具体的には、ansible.cfg

[defaults]
ask_vault_pass = True

と書くことで、--ask-vault-pass を指定しなくてもvault passwordが聞かれるようになります。

(vault_password_file=/path/to/password/fileを書くとpassword入力自体もショートカットできますが、 機密情報ファイル管理という別の問題が発生するので今のところ使っていません。)

ところが上記のansible.cfgを設定すると

ansible -i ... all -a "echo hello"

のような暗号化ファイルの復号化が必要ないコマンドに対しても毎回vault-passが聞かれるようになります。 (聞かれるが、decrypt自体は行わないので、"a"とか空白とか入れてもコマンドが実行されるという仕様・・・。)

これが少し面倒なのでansible.cfgに上記設定をいれるか迷っていましたが、

ANSIBLE_ASK_VAULT_PASS= ansible -i ... all -a "echo hello"

のようにansbile.cfgの設定を上書きしてask_vault_pass指定を一時的になかったコトにできるらしいので、暗号化が必要ないコマンドではこれを実行することにしました(若干面倒だけど・・・。)

super.preRestartの位置でライフサイクルメソッドの呼ばれる順番は変わる - akka

akka 2.3.13です。

preRestartの中のどの位置でsuper.preRestart(..) を呼ぶかによって微妙に処理の順番が変わって辛かったのでメモします。

gist.github.com

コメントのとおりですが、

最初にsuper.preRestartを呼ぶとpreStart -> postStop -> preRestart 最後にsuper.preRestartを呼ぶとpreStart -> preRestart -> postStop の順番で処理されるようです。

これはclass ActorのpreRestartの実装の中でpostStopメソッドを呼んでいることが原因です。 つまり下記コメントの一でpostStopが呼ばれています。

override def preRestart(reason: Throwable, message: Option[Any]): Unit = {
    super.preRestart(reason, message) // <-- ここでpostStopが呼ばれている
    println("preRestart")

当然super.preRestart(..) の位置をずらしてしまったら先にpreRestartの処理が走ってしまいます(◞‸◟)

さらに選択肢としてはsuper.preRestartを呼ばないことにより「postStopを処理しない」みたいなことも可能です。 postStopを呼ばない動機はよく分かりませんが、前回の記事で super.postRestartを呼ばないことによりpreStartを処理しないみたいなパターンが出てきたので、それと同じような応用法があるかもしれません。

言われてみれば当たり前ですがちょっと柔軟すぎる気がするんですがなれたらいい感じなんですかね(´;ω;`)

actor内で特定のExceptionが投げられることをテストしたいときはEventFilterを使おう - akka

akka 2.3.13です

KillされたことをテストしたくなったのでググったらEventFilterなるものが出てきました。

Testing Actor Systems — Akka Documentation

なんとログを見て特定の例外ログが出ているかどうかを見るもののようです。ゴリ押してますね。 使い方は公式のとおりなので書くまでもないですが、下のように書けます。

import akka.testkit.EventFilter
import com.typesafe.config.ConfigFactory
 
implicit val system = ActorSystem("testsystem", ConfigFactory.parseString("""
  akka.loggers = ["akka.testkit.TestEventListener"]
  """))
try {
  val actor = system.actorOf(Props.empty)
  EventFilter[ActorKilledException](occurrences = 1) intercept {
    actor ! Kill
  }
} finally {
  shutdown(system)
}

ログの設定を設定ファイルでやりたい時はtest/resources/application.conf などでやればOKです。

TestProbeでも良い?

Killされたことがテストできたら最高だったのですが、よく考えたら止まっていることがわかればまあいい感じだと気づいたので Testing Actor Systems — Akka Documentationにあるように TestProbe経由でTerminatedを観測してやれば良さそうでした。

val p = TestProbe()
probe watch target
target ! Kill
probe.expectTerminated(target)

歌舞伎座.tech#9でPonyについて発表しました

歌舞伎座.tech#9「異種プログラミング言語格闘勉強会」 - connpass で発表しました。
オープンな勉強会で発表したのは初めてだったので胃に穴が空きそうでしたが、なんとか乗り越えられました・・死にそう・・・(◞‸◟)
ponyの知名度がちょっとでも上がれば幸いです。

www.slideshare.net

erlangのメッセージパッシングは全てデータコピーが発生すると表現したところがありましたが、誤りでした。 http://www.ponylang.org/papers/fast-cheap.pdfのイントロから引用したのですが、もう少し調べたほうが良かったですね。(論文に書いてあるからといって安心してはいけない的な教訓・・)*1

erlangでは特定のバイト数以上のBynaryは特別扱いされて参照が渡されるとの指摘をいただきました。 https://twitter.com/voluntas/status/711485494454919169 Erlang -- Constructing and Matching Binaries

これを踏まえると大きめなデータ構造をローコストで渡せるのような表現のほうが適切になりそうです。(多分・・)isoやtrnの存在によって、mutableにデータ構造を組み立てて他のアクターにパスみたいなパターンが書きたくなると思うので、ponyで書く際は有用な性質のはずだと思います。

erlang/OTPは実績も既にあって、設計的にも優れている部分がたくさんあるのでPonyが乗り越えられるかどうか不明ですが、後発ですし公式もerlangをかなり見て作っているようなので(少なくとも特定分野では活躍できる?みたいな)期待しても良さそうという淡い気持ちがあります。

自分の発表をタイムシフトで見返して、JVMだからデータ共有できるとかもかなり無理やりやらないと(ActorRef越しじゃさわれないから、他の場所に置いたり、いろいろわけわからないことしたりしないと)できないから何か危ないこといってるなーみたいなところがあったりして発表するの難しいなと思いました・・。( Futureと組み合わせた時にsender()がみたいな話はあるので、そういうの含めればセーフ?・・・)あとGC関連もcausal consistentなメッセージングシステムを前提にしている部分もかなりあって、それ抜きに分散GCが〜とか言い出すのはアリだったんだろうか・・みたいな時間と発表内容との兼ね合いみたいなところも難しいですね・・。

みたいな色々学びがあったので良かったです。ponyはまだ生まれたばかりの言語なので色々足りない部分がまだまだあります。がんがん埋めていくか、akkaかerlangを使いましょう。erlangは神。(ただ、ponyの型システムなどponyを学ぶ意味自体はあると思うので気になったらぜひ!)

*1:論文が間違っているというか自分が変に拡大解釈してしまったみたいな感じだと思います