RabbitMQ 4 + pika メッセージの永続化
RabbitMQ、そういえばサーバーを再移動するをキューが消えるんでした。RabbitMQでキューの内容を永続化する
pikaだと永続化の指定はどうなるのか。
durableとdelivery_mode
こちらを参考にさせていただきました。
RabbitMQでのメッセージ消失の対策
queue_declareでdurable=Trueを指定。
basic_publishでpropertiesにpika.DeliveryMode.Persistentを指定すればOKでした。
なお、pika.DeliveryModeは
pika.DeliveryMode.Transient
pika.DeliveryMode.Persistent
の2つで、デフォルトがTransient(永続化なし)のようです
また、durable=Trueの指定は受信側にも必要でした。
・send.py
- import pika
- # ユーザー名とパスワード
- credentials= pika.PlainCredentials('symfo', 'P@ssw0rd')
- # 接続パラメーター作成
- connect_param = pika.ConnectionParameters(
- host='192.168.11.202',
- credentials=credentials)
- # コネクション作成
- connection = pika.BlockingConnection(connect_param)
- channel = connection.channel()
- # durable=Trueで永続化してい
- channel.queue_declare(queue='hello', durable=True)
- #
- channel.basic_publish(exchange='',
- routing_key='hello',
- body='Hello World!',
- properties=pika.BasicProperties(delivery_mode=pika.DeliveryMode.Persistent))
- print("[x] Sent 'Hello World!")
・recive.py
- import pika, sys, os
- def main():
- # ユーザー名とパスワード
- credentials= pika.PlainCredentials('symfo', 'P@ssw0rd')
- # 接続パラメーター作成
- connect_param = pika.ConnectionParameters(
- host='192.168.11.202',
- credentials=credentials)
- connection = pika.BlockingConnection(connect_param)
- channel = connection.channel()
- # durable=Trueを追加
- channel.queue_declare(queue='hello', durable=True)
- def callback(ch, method, properties, body):
- print(f" [x] Received {body}")
- channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=True)
- print(' [*] Waiting for messages. To exit press CTRL+C')
- channel.start_consuming()
- if __name__ == '__main__':
- try:
- main()
- except KeyboardInterrupt:
- print('Interrupted')
- try:
- sys.exit(0)
- except SystemExit:
- os._exit(0)
これでサーバーを再起動してもキューの内容が保持されていました。
コメント