AP4R,Rubyで非同期メッセージング

第4回 システムは稼働してからがはじまり

この記事を読むのに必要な時間:およそ 7 分

dispatchersとURL変換フィルタ

より細かく,メッセージの種類により処理するサーバーを分散させたい場合にはどのような方法があるでしょうか。現状のAP4Rでは,キューの名前で分散させることが可能です。dispatchers の初期設定を見るとこのようになっています。

dispatchers:
  -
    targets: queue.*
    threads: 1

これは,targets で指定されるキュー(アスタリスクは前方一致)から1本のスレッドでメッセージを取得する,という設定になっています。非同期処理のなかに,非常に数の多い処理と,非常に時間のかかる処理があるとしましょう。それぞれを別サーバで処理したいとします。この場合,次のような設定で分割する方法があります。

dispatchers:
  -
    targets: queue.very_busy.*
    threads: 10
    modify_rules:
      url: proc {|url| url.host = "busy.async.host"}
  -
    targets: queue.very_heavy.*
    threads: 1
    modify_rules:
      url: proc {|url| url.host = "heavy.async.host"}

数の多い処理は,busy.async.host にて処理をさせ,時間のかかる処理は,heavy.async.host に流れるようにしています。また,数の多い処理を捌くスレッドは数を調整する必要もあるでしょう。あくまで参考の設定ですが,このような柔軟性があります。

メッセージ送信の分散

ここからは,AP4Rのプロセスが複数ある場合を考えます。

これまでの例では,ひとつのRailsプロセスからは,ひとつのAP4Rプロセスへメッセージを送信していました。Railsプロセスから複数のAP4Rプロセスへ送信できると,大量の非同期メッセージが発生する場合には,負荷分散ができます。また,AP4Rプロセスが止まってしまった場合にも,非同期メッセージの送信が出来るため,耐障害性の向上にもつながります。この機能は現在実装中で,近々リリースの予定です。

図4 メッセージ送信を複数のAP4Rプロセスへ分散させる

図4 メッセージ送信を複数のAP4Rプロセスへ分散させる

AP4R プロセス間のメッセージ転送

複数のAP4Rプロセスを実行している場合,とても忙しくてメッセージが溜ってしまうものがいる一方で,暇なものが出てくるかもしれません。そのような場合に,溜っているメッセージを暇なプロセスへ転送することが出来ます。設定ファイル中,carriers という項目がこの機能にあたります。

(注)
この機能は,設定方法によっては,AP4Rプロセス間でメッセージのキャッチボールが起きたり,メッセージDBの負荷が増えたりする難点もあります。必要な設定項目,アルゴリズムなどを考慮する余地があるため,現状は「実験的」な機能と位置付けています。

設定例は以下のようになります。

carriers:
  - 
    source_uri: druby://another.ap4r.host:6438
    threads: 1

どのAP4Rプロセスsource_uri )から,何本のスレッドthreads )でメッセージを転送するかを設定しています。各スレッドは,自プロセス内の dispatchers が処理できるキューからメッセージを取得し,自プロセス内のキューに保存しなおします。

図5 メッセージの転送

図5 メッセージの転送

(注)
複数のAP4Rプロセスを利用する場合には,サーバソケットを開くアドレスとポートの指定で注意する点があります。バージョン1.1のreliable-msgには,デフォルトポート(6438)以外でのLISTENが出来ないバグがあります。またlocalhost以外でのLISTENが出来ません。AP4RのWiki: FAQに修正方法を書いています。

以上のように,メッセージの送信と処理を複数プロセスに分散させたり,簡単な流量の制御により,システム運用における非同期処理の円滑な実行をサポートします。

著者プロフィール

加藤究(かとうきわむ)

フューチャーアーキテクト株式会社,シニアコンサルタント。土木専攻だった大学時代には,道路や橋の建設について学んできたが,社会に出てからは Javaのメッセージングミドルウェアの開発/保守などに従事。昨年,Rubyで書いたメッセージングライブラリ,AP4Rでオーンソースの世界に仲間入り。現在は,AP4Rの開発/導入サポート中。

URLhttp://d.hatena.ne.jp/kiwamu/


篠原俊一(しのはらしゅんいち)

フューチャーアーキテクト株式会社,シニアコンサルタント。大学時代は物理学を専攻,素粒子論を研究,10次元の世界に住んでいた。入社後まもなく,Martin FowlerのblikiでRubyを知り,"The Ruby Way"に学ぶ。 Rubyとオープンソースが大好きなプログラマとして,AP4Rを開発中。

URLhttp://d.hatena.ne.jp/ita-wasa/