SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

RabbitMQ 3.6の新機能「Lazy Queues」の概要と検証

  • X ポスト
  • このエントリーをはてなブックマークに追加

 はじめまして。DMM.comラボでインフラエンジニアをしております大山裕泰です。今回は、世の中にあまたある分散システムを支えるMQの雄の一つ「RabbitMQ」と、昨年12月にリリースされたv3.6.0において組み込まれた新機能「Lazy Queues」について、いったいどういうもので、どのように実装して、どんな結果になるのかをマルッと解説してしまおうと思います。本稿によって、読者の皆さまが携わる分散システムの開発・運用に少しでも役立てばと思います。

  • X ポスト
  • このエントリーをはてなブックマークに追加

RabbitMQについて

 今回フォーカスするRabbitMQは、AMQPという柔軟性と信頼性に富んだメッセージ転送を実現するプロトコルの実装になります。AMQPは、2003年にJPMorgan Chaseで開発されたメッセージ転送プロトコルで、柔軟なメッセージルーティングの実現に加え、送信元から送られたメッセージのキューへの格納、およびキューから宛先へのメッセージの送信処理をトランザクション処理させること、またメッセージの永続化機能によって信頼性の高いメッセージ転送処理を実現できます。

 何より、金融系で10年近くメッセージ転送ミドルウェアとしての実績があるプロトコルということで、エンタープライズシステムを含む多くのシステムで利用されてきています。

 RabbitMQはそんな信頼と実績のAMQPの実装として、有名どころとしてはOpenStackやSensu、その他Mozilla PulseやGoogle rocksteadyなど、分散コンピューティングを実現する多くのOSSから支持されてきました。またOSSだけでなくVMware NSXなどのエンタープライズ製品などでも広く利用されています。

 さらにRabbitMQが提供するプラグイン機構によって、MQTTSTOMPなど、さまざまなMQプロトコルをサポートしています(これらについては、また別の機会に紹介したいと思います)。

Kafkaについて

 信頼と実績のAMQPはその後、Goldman SachsやJPMorgan Chaseなどの金融系、MicrosoftやCiscoなどのエンタープライズ系の頑張りによって、2014年にAMQP 1.0がISOで標準化されました。

 これに対して「AMQPだから良いってわけじゃねーから("What are the differences between Apache Kafka and RabbitMQ?"より)」と異を唱えるWeb屋さん「LinkedIn」がリアルタイム性にこだわった独自のMQシステムを開発し、その後OSSとして「Apache Kafka」を公開します。

 Apache Kafkaでは、大量のイベントストリームに対して、高いスループットが出せるようにし、加えて定常的にデーモンがメッセージを取得し続けるシステムだけでなく、定期的に実行されるバッチシステムによってメッセージが消費されるケース(Kafkaでは「オフラインシステム(Offline System)」と呼称)などにおいて大容量のデータがキューに滞在できるように設計されています。

 パフォーマンスについては、Kafkaが毎秒で数十万メッセージのスループットが得られていることが知られています。また、Kafkaではファイルシステムを介してメッセージのやりとりを行います。後述するRabbitMQやRedisではメモリを介してデータのやりとりを行いますが、Kafkaでは取得したメッセージをファイルに書き出し、コンシューマ(Kafkaが預かっているメッセージを取得するアプリケーション)からのメッセージ取得要求に対してファイルからデータを取り出します。一般的に、メモリアクセスよりもストレージアクセスの方がスループットが低いことが知られていますが、Kafkaではシーケンシャルなストレージアクセスがランダムなメモリアクセスよりも早いという性質を生かして高いスループットを出しています。

 また、KafkaはRabbitMQと比べて、実績が浅いですが、YahooTwitterのリアルタイム解析システムにおいて利用されており、また国内のエンタープライズの領域でもKafkaが使われている事例が存在します。

RabbitMQはどうなの?

 ここまでの話だと「なんだ、時代はApache Kafkaじゃん」と思われるかもしれませんが、パフォーマンスと信頼性はおおむねトレードオフの関係にあり、冒頭で述べたようにRabbitMQではAMQPで規定されているシステム側でトランザクション処理をサポートするなど、パフォーマンスを犠牲にする一方で、システム側で高信頼なメッセージ転送機能を抽象化してくれています。

 どちらか一方が良いというよりかは、どちらにも良い面と弱い面があり、MQミドルウェアの選定ではシステムの要件と妥協できるポイントを考えて選択するのが良いと思います。

 なお、RabbitMQのパフォーマンスに関しては、メッセージサイズにもよりますが、おおむねノードあたり数万メッセージ/秒程度であればさばける模様です。

Lazy Queuesについて

 さて。ここでようやく本題ですが、冒頭で簡単に説明したようにRabbitMQでは、受け取ったメッセージをインメモリのデータベースに保存します。もちろん、メモリだけに保存されている場合には当該ノードで障害が発生した際にメッセージが失われてしまうため、キューに対してメッセージを永続化させるように設定できます。また、メモリ容量が逼迫(ひっぱく)してきた際にはRabbitMQはメッセージをストレージに書き出す処理(ページアウト処理)を実行します。ページアウト処理中はキューをブロックしてしまうため、その間RabbitMQはメッセージを受け取ることができません。このためKafkaでできるようなオフラインシステムからの利用など、大容量のデータがキューに滞在するようなユースケースでの利用では大きな制限がありました。

 この問題を解決する仕組みとして2015年12月にリリースされたRabbitMQ v3.6.0「Lazy Queues」という機能が追加されました。Lazy Queuesが設定されたキューでは、Kafkaと同じようにキューに到着したメッセージはすべてファイルに書き出されます。これにより、キューによって消費されるメモリ容量が劇的に減り、大容量のデータがキューに滞在するようなユースケースにも対応できるようになりました。

次のページ
どうやって使うの?

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

大山 裕泰(株式会社DMM.comラボ)(オオヤマ ヒロヤス)

DMM.com ラボ所属ソフトウェアエンジニア。アリエル・ネットワーク株式会社、グリー株式会社を経て現在に至る。最近は主にインフラ基盤の構築、運用、機能開発を行う。共著書に「次世代ネットワーク制御技術 OpenFlow入門」がある。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/9288 2016/03/18 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング