「ウェブの歴史は人類の歴史の繰り返し」という観点から色々勉強しています。mrubyでRedisを操作するmruby-redisは以前から開発していたのですが、最近Pipelining対応のPRを頂きPipelining対応したのでそれの性能を確認してみました。その結果簡単に作れるようになった分散型インメモリジョブキューであるDisqueのmrubyクライアントであるmruby-disqueの紹介をします。github.comgithub.comRedisとhiredisのPipeliningmruby-redisはhiredisというCライブラリを利用しており、hiredisでは効率的にRedisとIOできるようにPipelining機能をサポートしています。通常のRedisアクセスはクライアントからメソッドを発行するとRedisプロトコルを通じてReplyを待つPipeliningの場合は、クライアントからメソッド発行するとRedisへのinputバッファにRedisのAPIをキューイングするReply用のAPIを叩くと、inputバッファにキューイングしたメソッドをまとめてRedisに投げることでソケットwrite()をまとめるwrite()後はread()しながらreplyを待ち結果をバッファに貯めこむ事によりソケットのread()をまとめられる上記のような動作によりRedisとのソケットI/Oのためのシステムコール数を少なくし効率化できる機能がPipeliningという動きになります。これによって、ソケットI/Oが効率化されて高速化される事が予想されます。Pipeliningのベンチマークということで、早速ngx_mrubyを経由してベンチマークをとってみましょう。以下のようにngx_mrubyを設定します。DDR3nginxのworkerは一つになるように以下のようなnginx.confを設定し、Redisはbrewでいれたものをデフォルトで起動しましたベンチマーク結果は以下となります。(mean)pipeliningを使った方が倍ぐらい速いことがわかりました。replyメソッドは結果が来るまでまつような処理になっており、queueはひたすらタスクを内部的にキューイングしています。この例で行くと、/redis2へのアクセスはsocketに対するread()とwrite()がメソッド単位で実行されているのに対し、/redis1ではPipeliningにより、メソッド自体は4つ呼ばれていますが、内部的にRedisと通信しているソケットにおいてはread()とwrite()がそれぞれ1回しか実行されていないと考えられます(システムコールの数は確認していないので間違えているかも...)Disqueのクライアントも作ってみたこの流れでRedisと同じ作者が作られているDisqueという、分散型in-memoryジョブキューというのがあり、これはRedisプロトコルによってDisqueとお喋りができるので大変便利なミドルウェアです。クライアント的には、Redisのプロトコルを喋る汎用的なクライアントを実装しておけば、それがそのままDisqueと通信することができるという事になります。API毎にメソッドを定義しておらず、APIと引数のstringをそのままhiredisのライブラリを経由してRedisと通信するような汎用的な実装になっているため、Disqueへの通信も簡単にできることになります。いうことで、mruby-redisを使えばRubyだけでmruby-disqueを使ってみました。job_idendDisqueを起動後に、Disque#addjobでジョブを追加し、Disque#getjobでジョブを取得する、というのが基本的な使い方です。"q1"などとすると、キューq1にあるキューの数を取得するQLENAPIを実行することができます。まとめということで、今回はmrubyのRedisクライアントmruby-redisのPipelining対応と、その結果簡単に作る事ができたmruby-disqueの紹介でした。今後は、Redisクライアントの非同期(コールバック)対応等によってより多くの面で使えるように改善していきたいと思っております。はてなブログPro研究者と技術者をやっています。詳しくはリンクの「研究・開発業績ページ」を御覧ください。さくらインターネットに入社して1年が経ちました非厳密計算で確率的に解釈するコンピューティングへの流れラストオーサーとしての国際会議投稿やジャーナル執筆のサポートについてviを:wqや:q!、あるいはZZで終了するのとではどちらが効率的か自分の研究開発に自信を持つためには月別アーカイブリンク研究・開発業績ページ旧ブログ検索はてなブログをはじめよう!matsumoto_rさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。