DevDevデブ!!

プログラミングのこととか書きます。多分。。。

mrubyやっていってる

ワタクシ動画広告配信のお仕事してまして、配信ロジックの一部をngx_mrubyでアレしてるわけです。

現職は5月からで、まだngx_mrubyで動いてる部分は触ってなかったんだけど、先週から一部改修を担当することになって、ハマった点があったので書いておく

mruby-1.3.0でSocketErrorが出るぞい?

mrubyからDynamoDBにアクセスする必要があり、まだ誰もクライアント公開してなかったっぽいので、自作し始めたんですが、http通信するところでどうやってもSocketErrorが出て困っていた。

github.com

どうもバグらしい。

(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で決め打ちされてるでねーか。。。

github.com

どうも下記のエントリを見た感じだと、KeepAliveの実装は結構めんどうくさいらしい??(←ちゃんと分かってない)

abrakatabura.hatenablog.com

libcurlのラッパーであるところの、mruby-curlだといけそうだったので、それを使うことにした。

github.com

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マジ神だと思った)