mrubyやっていってる
ワタクシ動画広告配信のお仕事してまして、配信ロジックの一部をngx_mrubyでアレしてるわけです。
現職は5月からで、まだngx_mrubyで動いてる部分は触ってなかったんだけど、先週から一部改修を担当することになって、ハマった点があったので書いておく
mruby-1.3.0でSocketErrorが出るぞい?
mrubyからDynamoDBにアクセスする必要があり、まだ誰もクライアント公開してなかったっぽいので、自作し始めたんですが、http通信するところでどうやってもSocketErrorが出て困っていた。
どうもバグらしい。
(mruby本体のものか、mruby-socketのものか分かってないけど)
mruby-1.2.0だと発生しないようなので、バージョンを下げて対応した。
(つーかproductionで動いてるの1.2だった。。。。)
そもそも1.3は先月リリースされたばかりなので、まだproductionで動かすのはちと怖いですね。
mrubyのhttpクライアント、KeepAlive対応してなくね?
前述の通り、DynamoDBのクライアントを書いてました。
DynamoDBとはhttpで通信するので、KeepAliveが有効になっていないとレイテンシが大きくなります。
mruby-s3とかでmruby-simplehttp使ってたから、とりあえず真似して使ってたんですが、ソース見てみたらHeaderのConnectionのとこ、Closeで決め打ちされてるでねーか。。。
どうも下記のエントリを見た感じだと、KeepAliveの実装は結構めんどうくさいらしい??(←ちゃんと分かってない)
libcurlのラッパーであるところの、mruby-curlだといけそうだったので、それを使うことにした。
tcpdumpでちょろっと覗いた感じだと大丈夫そうだった。
(http/1.1だと、connectionはcloseを指定しない限り、デフォルトでKeepAliveとなるらしいんだけど、DynamoDBはConnectionにCloseしてもKeepAliveと応答するんだよね。。。サーバ側の振る舞いはそれがhttp/1.1の仕様通りなのか?)
mgemでライブラリ管理したら、mrdbコマンドが消えた??
mgem config default > build_connfig.rb
とかしたあとに、mrubyをビルドしなおしたらデバッガであるmrdbコマンドが消えて困惑したという話。
上記のコマンドだと、以下の行は消えるんですねー
conf.cc.defines << %w(MRB_ENABLE_DEBUG_HOOK)
なんか、mgemじゃなくてbuild_config.rbを直接管理したほうがよくない??って気がしてる
感想
まだドキュメント充実してない感はある。
(それをコントリビュートオポチュニティと捉えるかどうかだな)
既存のrubyのgemが使えないというのは結構大きい
移植しろっつー話になると思うんだけど、aws-sdkは結構重量級だしなー
とりあえず、今回作ったDynamoDBクライアントのawsのv4署名の部分は切り出して公開したい感じ
(v4署名地味にめんどくさくって、公式sdkマジ神だと思った)