論文や発表が少し落ち着いたので、研究の実装を再開しています。
そこでふと思ったのですが、そういえばngx_mrubyとlua-nginx-moduleのパフォーマンス比較していないなぁと思いました。でも、今検証環境が色々あって揃っていないので微妙だなぁと思いつつも、やっぱり気になると試さずにはいられないたちなので、簡単なhello worldのベンチマーク比較をしてみました。
「ウェブの歴史は人類の歴史の繰り返し」という観点から色々勉強しています。2014年までの人間とウェブの未来の旧ブログです。
論文や発表が少し落ち着いたので、研究の実装を再開しています。
そこでふと思ったのですが、そういえばngx_mrubyとlua-nginx-moduleのパフォーマンス比較していないなぁと思いました。でも、今検証環境が色々あって揃っていないので微妙だなぁと思いつつも、やっぱり気になると試さずにはいられないたちなので、簡単なhello worldのベンチマーク比較をしてみました。
ようやくngx_mrubyでもmod_mrubyのように動的なリバースプロキシ設定ができるようになりました。タイトルは完全に@hibomaさんによる「lua-nginx-module の紹介 ならびに Nginx+Lua+Redisによる動的なリバースプロキシの実装案」をパク … inspireしたものになっています。
今回の工夫点としては、
の3点です。
mrubyにおいて、mrb_stateを共有しているRubyコード間で、userdataを自由に読み書きできるmruby-userdataというmrbgemを作りました。
これは、mrubyの状態遷移情報を格納しているmrb_stateを共有している限り、あるタイミングでコードAが呼ばれて、次に別のタイミングでコードBが呼ばれた場合、コードAでuserdataオブジェクトを保存しておけば、コードBからそのオブジェクトを取り出せる仕組みです。
グローバル変数を使えばコード間でやり取りができますが、なんとなくグローバル変数を使うのは実装上バグを生みそうなので、C側にuserdataを保存しておくハッシュテーブルオブジェクトを作っておいて、そこにRuby側から保存したい時に保存しておき、取り出したい時に取り出すためのRubyメソッドによるインターフェイスを実装しました。
比較的安全にuserdataを保存しておけると思います。
mrubyも少しずつ知られてきていて、WindowsやLinux、MacOSX等マルチプラットフォームで色々遊んでいる人が多いことでしょう。そうなってくると、しばらく弄ってみた後はやっぱりマルチプラットフォームで同じようにHTTPで通信してみたいと思いませんか?
例えば、
ということで、今回はそういうことをするためにはmruby側でどういう準備をして、どう実装すればいいかの導入部分を説明したいと思います。