AMQPでは、キューからコンシューマーにメッセージが配信されても、コンシューマーがそのメッセージを正しく受け取ったことをブローカー(RabbitMQ)に通知(acknowledge)しないといけない。
subscribeメソッドを引数なしで使うと、自動的にacknowledgeされるが、:ack => trueを指定すると手動で設定することになる(最初、逆かと思った)。
# 自動 ack queue.bind(exchange, :routing_key => 'tasks').subscribe do |headers, payload| # do some process end
# 手動 ack queue.bind(exchange, :routing_key => 'tasks').subscribe(:ack => true) do |headers, payload| # do some process headers.ack endメッセージ内容に応じてackするか決める場合は後者を使う。headers.ackメソッドでブローカーにacknowledgeしている。これをしないとメッセージはキューから削除されず、例えばこのコンシューマーがブローカーに再接続すると前回受け取ったメッセージが再送される。
No comments:
Post a Comment