🐰

RabbitMQ のメッセージを永続化するポイント

に公開

docker 環境だけでお手軽に確認することができます

ポイントまとめ

  • 永続化しないとサービス停止時にメッセージが失われてしまう
  • キュー作成時に永続化する (デフォルトで永続化するが明示しておいたほうがよい)
  • publish 時にもメッセージを永続化する

compose.yml

services:
  mq:
    hostname: rabbitmq
    container_name: rabbitmq
    image: rabbitmq:management
    ports:
      - 5672:5672
      - 15672:15672
    volumes:
      - data:/var/lib/rabbitmq

volumes:
  data:

volumes で永続化する準備をしています

サービス起動

docker compose up -d

ブラウザで localhost:15672 にアクセス
Username:guest Password:guest で管理画面にログイン

キューの作成

test.q という名前の永続化キューを作成

$ docker compose exec mq rabbitmqadmin declare queue name=test.q durable=true auto_delete=false

管理画面にキューに test.q が作成されたことを確認

Messages 0 0 0 0

※ Messages.Persistent は +/- で増やしておく

動作確認

キューにメッセージをpub

docker compose exec mq rabbitmqadmin publish routing_key=test.q payload="hello this is not durable"

Messages 1 0 0 1

キューに永続化メッセージをpub

docker compose exec mq rabbitmqadmin publish routing_key=test.q payload="hello this is durable" properties='{"delivery_mode":2}'

Messages 2 0 1 2
Message.Persistentが1に

キューの内容をを確認

確認のため ack はしない

$ docker compose exec mq rabbitmqadmin get queue=test.q count=2
+-------------+----------+---------------+---------------------------+---------------+------------------+------------+-------------+
| routing_key | exchange | message_count |          payload          | payload_bytes | payload_encoding | properties | redelivered |
+-------------+----------+---------------+---------------------------+---------------+------------------+------------+-------------+
| test.q      |          | 1             | hello this is not durable | 25            | string           |            | False       |
| test.q      |          | 0             | hello this is durable     | 21            | string           |            | False       |
+-------------+----------+---------------+---------------------------+---------------+------------------+------------+-------------+

pub したメッセージがそれぞれ入っていることが確認できる

サービス再起動

docker compose restart

再度キューを確認

$ docker compose exec mq rabbitmqadmin list queues
+--------+----------+
|  name  | messages |
+--------+----------+
| test.q | 1        |
+--------+----------+

メッセージが減っている

再度キューの内容を確認

$ docker compose exec mq rabbitmqadmin get queue=test.q count=2
+-------------+----------+---------------+-----------------------+---------------+------------------+-------------+
| routing_key | exchange | message_count |        payload        | payload_bytes | payload_encoding | redelivered |
+-------------+----------+---------------+-----------------------+---------------+------------------+-------------+
| test.q      |          | 0             | hello this is durable | 21            | string           | False       |
+-------------+----------+---------------+-----------------------+---------------+------------------+-------------+

永続化したメッセージはサービスを再起動してもキューに残っていることが確認できる

確認まとめ

これでサービス再起動を気にせず気軽にメッセージキューにタスクを入れることができます

Enjoy!!

Discussion