---
title: 実運用して分かったRabbit MQの良いところ・気をつけること #jjug
tags:  #jjug  
author: [Yahoo!デベロッパーネットワーク](https://www.docswell.com/user/ydnjp)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/47QX196QJP.jpg?width=480
description: JJUG ナイトセミナー 「メッセージングミドルウェア特集」のRabbitMQの発表資料です。 https://jjug.doorkeeper.jp/events/65028
published: October 02, 17
canonical: https://www.docswell.com/s/ydnjp/Z2YRRZ-2017-10-02-141113
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/47QX196QJP.jpg)

実運用して分かったRabbitMQの
良いところ・気をつけること
2017年9月27日
祖父江 翔
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 2

![Page Image](https://bcdn.docswell.com/page/KE46RX4YJ1.jpg)

自己紹介
祖父江 翔（そぶえ しょう）
マーケティングソリューションズカンパニー開発本部
新卒入社7年目
配属されてからずっと広告関連の開発
入稿→アカウント→開発基盤
2
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 3

![Page Image](https://bcdn.docswell.com/page/L71VQN4NJG.jpg)

本日の内容
• Rabbit MQとは
• 広告システム内でのRabbit MQ
•
•
導入前の課題
動機
•
•
•
構成
プロビジョニング
保守・運用
• 良いところ
• 気をつけること
• まとめ
3
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 4

![Page Image](https://bcdn.docswell.com/page/G7WLM4ZMJ2.jpg)

RabbitMQとは
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 5

![Page Image](https://bcdn.docswell.com/page/4JZMQ21M73.jpg)

RabbitMQ
RabbitMQ is the most widely deployed open source message broker.
With more than 35,000 production deployments of RabbitMQ world-wide at small
startups and large enterprises, RabbitMQ is the most popular open source message
broker.
RabbitMQ is lightweight and easy to deploy on premises and in the cloud. It
supports multiple messaging protocols. RabbitMQ can be deployed in distributed
and federated configurations to meet high-scale, high-availability requirements.
トップページより引用
RabbitMQ - Messaging that just works, https://www.rabbitmq.com/
5
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 6

![Page Image](https://bcdn.docswell.com/page/YE6N6VL5EV.jpg)

要はRabbitMQとは
• オープンソースのメッセージブローカー
• 軽量でデプロイをオンプレミスでも
クラウドでも利用可能
• 複数のメッセージプロトコル対応
• スタンドアローンでもクラスタでも構築可能
6
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 7

![Page Image](https://bcdn.docswell.com/page/GE556D1GE4.jpg)

多言語サポート
• 公式で用意されているのは
Erlang, Java, C#のみ
• Ruby, Python, PHPなど提供
Clients &amp; Developer Tools, https://www.rabbitmq.com/devtools.html
7
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 8

![Page Image](https://bcdn.docswell.com/page/972NM81DJR.jpg)

PluginやAPI
• Pluginが豊富
•
•
•
基本機能以外の付け足しが可能
プロトコルや認証機能の追加が可能
管理画面の導入で運用負荷の軽減も可能
• APIが用意されている
•
リソースやトラフィックの監視が可能
Plugins, https://www.rabbitmq.com/plugins.html
8
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 9

![Page Image](https://bcdn.docswell.com/page/DJYPX6ZMJM.jpg)

Management Plugin
9
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 10

![Page Image](https://bcdn.docswell.com/page/V7N51Z33E8.jpg)

広告システム内での
Rabbit MQ
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 11

![Page Image](https://bcdn.docswell.com/page/YJ9Y5Z9P73.jpg)

広告システム
BEサーバ群
広告主が出稿
配信面
FE
広告配信システム
非同期化部分
11
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 12

![Page Image](https://bcdn.docswell.com/page/GJ86Y19XED.jpg)

RabbitMQ導入前の課題
• ブローカーのないキュー管理の仕組みを利用
接続の管理が面倒
•
•
•
12
接続設定の修正が職人芸(気軽にできない)
ProducerとConsumerを気軽に追加できない
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 13

![Page Image](https://bcdn.docswell.com/page/LJL94QWN7R.jpg)

導入前(設定つらい…)
BE APIサーバ
13
配信システム連携バッチ
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 14

![Page Image](https://bcdn.docswell.com/page/47MZK19QJW.jpg)

キュー管理の仕組みに求めたこと
•
•
•
•
PHPとJavaで同時に運用できること
耐障害性があること
ConsumerやProducerを容易に追加できること
スループットが高いこと
•
•
14
広告入稿のリクエストに耐えられること
処理単位でルーティングができること
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 15

![Page Image](https://bcdn.docswell.com/page/P7R6XLGKE9.jpg)

RabbitMQを採用
• AMQPで動作する
• クライアントライブラリがある
• JavaでもPHPでも動作するため、並行期間を設けられる
• クラスタを容易に構築できる
• ブローカーのスケールアウトができる
• ProducerとConsumerが容易に追加できる
• トピックとキーでルーティングが可能
15
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 16

![Page Image](https://bcdn.docswell.com/page/PJXM6WX5EX.jpg)

広告システム
BEサーバ群
広告主が出稿
配信面
FE
16
Co p y rig ht © 2 0 1 7
広告配信システム
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 17

![Page Image](https://bcdn.docswell.com/page/3JKG1VWR7D.jpg)

BEサーバ群の構成
BE APIサーバ
17
RabbitMQクラスタ
(3台構成)
Co p y rig ht © 2 0 1 7
配信システム連携バッチ
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 18

![Page Image](https://bcdn.docswell.com/page/LE3NQM1GE5.jpg)

良いところ
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 19

![Page Image](https://bcdn.docswell.com/page/8EDW96XN7G.jpg)

言語が混在しても問題なく動作
• JavaからPHPへメッセージの受け渡し
• 並行運用しても問題なく動作
19
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 20

![Page Image](https://bcdn.docswell.com/page/V7P9ZYPNJ8.jpg)

耐障害性、クライアント設定
• クラスタのノードが1台ダウンしても
サービス継続
• クライアントはRabbitMQクラスタを
接続先にすればいい
20
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 21

![Page Image](https://bcdn.docswell.com/page/2JVMWG2YJQ.jpg)

高いスループット
• VM3台で1クラスタの構成
• vCPU: 8
• Mem: 16G
• Disc: 120G
• 1000万msg/dayをConsumerが処理
21
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 22

![Page Image](https://bcdn.docswell.com/page/5EGGD8RWEL.jpg)

気をつけること
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 23

![Page Image](https://bcdn.docswell.com/page/4JQX19VQEP.jpg)

構成
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 24

![Page Image](https://bcdn.docswell.com/page/K746RXMYE1.jpg)

LBを使った構成の罠
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 25

![Page Image](https://bcdn.docswell.com/page/LJ1VQN8NEG.jpg)

複数ノード構成なのでLBを配備してみた
• HTTPサーバみたいに
LB経由でバランシングする構成に
BE APIサーバ
RabbitMQクラスタ
LB
25
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 26

![Page Image](https://bcdn.docswell.com/page/GJWLM4GME2.jpg)

メッセージが見つからない
• システム内で整合性が取れない
• ただ、何が消えたのかわからない
• リカバリ頑張る、運用でカバー
26
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 27

![Page Image](https://bcdn.docswell.com/page/4EZMQ2LMJ3.jpg)

LBを入れてリッチな構成にしたことが仇
• LBがセッション維持しない設定(変更不可)
• LBがセッションを定期的に破棄していることが発覚
• JavaのRabbitMQクライアントで
LBを使わなくてもクラスタを考慮した接続や
障害時の接続のリカバリが実装されていた
27
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 28

![Page Image](https://bcdn.docswell.com/page/Y76N6VW57V.jpg)

LBいらない
• ノードを全部列挙する
BE APIサーバ
RabbitMQクラスタ
Host1,Host2,Host3
28
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 29

![Page Image](https://bcdn.docswell.com/page/G7556DMG74.jpg)

プロビジョニング
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 30

![Page Image](https://bcdn.docswell.com/page/9J2NM89DER.jpg)

クラスタ止まった
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 31

![Page Image](https://bcdn.docswell.com/page/DEYPX64MEM.jpg)

クラスタが応答しなくなった
大量のメッセージがあると応答しない
PublishもConsumeもできない状態
処理が遅延してシステムが止まるような事態に…
31
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 32

![Page Image](https://bcdn.docswell.com/page/VJN51ZY378.jpg)

原因その１: ディスクI/O
メモリ上で扱わず
すべてディスクに書き込む設定 (デフォルト)
設定変更してメモリで扱うように
※マスタ1台のみディスク、スレーブ2台をメモリ
信頼性よりパフォーマンスを重視した設定
32
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 33

![Page Image](https://bcdn.docswell.com/page/YE9Y5ZPPJ3.jpg)

ただし、通常はディスク推奨
A node can be a disk node or a RAM node. (Note: disk and disc are used
interchangeably).
In most cases you want all your nodes to be disk nodes; RAM nodes are a
special case that can be used to improve the performance clusters with
high queue, exchange, or binding churn.
When in doubt, use disk nodes only.
Clustering Guideより引用
→通常はディスクのみ、メモリは特殊ケース
Clustering Guide: https://www.rabbitmq.com/clustering.html
33
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 34

![Page Image](https://bcdn.docswell.com/page/GE86Y1DX7D.jpg)

原因その2:トラッフィク統計の設定
• Message ratesの設定(rates_mode)
• 管理プラグインを入れるとデフォルトBasicモード
• メッセージの転送レートを表示するための設定
• メッセージの流量を観測するには有用な設定
Management Plugin: https://www.rabbitmq.com/management.html
34
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 35

![Page Image](https://bcdn.docswell.com/page/LEL94QMNJR.jpg)

Message ratesの設定あり
35
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 36

![Page Image](https://bcdn.docswell.com/page/4JMZK1YQEW.jpg)

Message ratesの設定なし
36
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 37

![Page Image](https://bcdn.docswell.com/page/PJR6XL9K79.jpg)

高スループット環境では無効にするべき
• このオプションを無効にした途端に
スループットが向上
• メトリック監視とパフォーマンスはトレードオフ
• 公式でも
Alternatively, the message rates can be disabled altogether.
This can help get the best possible performance out of a CPU-bound server.
Management Pluginより引用
Management Plugin: https://www.rabbitmq.com/management.html
37
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 38

![Page Image](https://bcdn.docswell.com/page/PEXM6WQ57X.jpg)

保守・運用
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 39

![Page Image](https://bcdn.docswell.com/page/3EKG1V9RJD.jpg)

無停止で
バージョンアップする
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 40

![Page Image](https://bcdn.docswell.com/page/L73NQMWG75.jpg)

サービス停止するわけにいかない
• 24時間絶え間なく広告入稿のリクエスト
• ミドルウェアのバージョンアップで
サービス停止できない
40
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 41

![Page Image](https://bcdn.docswell.com/page/87DW96KNJG.jpg)

切り替え Step1
旧RabbitMQクラスタ
Consumer
FE
41
BE
Co p y rig ht © 2 0 1 7
広告配信システム
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 42

![Page Image](https://bcdn.docswell.com/page/VJP9ZYKNE8.jpg)

切り替え Step2
旧RabbitMQクラスタ
Consumer
FE
広告配信システム
BE
新RabbitMQクラスタ
42
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 43

![Page Image](https://bcdn.docswell.com/page/2EVMWGVYEQ.jpg)

切り替え Step3
旧RabbitMQクラスタ
FE
BE
メッセージを
捌き切る
広告配信システム
Consumer
新RabbitMQクラスタ
43
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 44

![Page Image](https://bcdn.docswell.com/page/57GGD8LW7L.jpg)

切り替え Step4
旧RabbitMQクラスタ
FE
広告配信システム
BE
Consumer
新RabbitMQクラスタ
44
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 45

![Page Image](https://bcdn.docswell.com/page/4EQX19YQ7P.jpg)

ネットワーク
パーティション
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 46

![Page Image](https://bcdn.docswell.com/page/KJ46RXWY71.jpg)

ネットワーク障害！
• ある日、ネットワーク障害発生
• 管理画面開くと…
46
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 47

![Page Image](https://bcdn.docswell.com/page/LE1VQNYN7G.jpg)

再起動するしかない
• 公式のドキュメントによると…
It may be simpler to stop the whole cluster and start it again; if
so make sure that the first node you start is from the trusted
partition.
Clustering and Network Partitionsより引用
Clustering and Network Partitions: https://www.rabbitmq.com/partitions.html
47
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 48

![Page Image](https://bcdn.docswell.com/page/GEWLM41M72.jpg)

まとめ
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


# Page. 49

![Page Image](https://bcdn.docswell.com/page/47ZMQ2PME3.jpg)

まとめ
• 良いところ
•
•
•
高スループット
耐障害性があり、クライアント設定はシンプル
多言語対応していて、混在でも並行運用可
• 気をつけること
•
•
49
特に高スループットが要求される場合は
プロビジョニングに注意
公式ドキュメントは読み込むべし
Co p y rig ht © 2 0 1 7
Ya ho o Ja p a n Co rp o ra tio n. A ll R ig hts R eserv ed .


