前書き
このセクションのトピックを見ると、なぜ繰り返しメッセージを消費するシーンに遭遇するのか不思議に思うかもしれません。
プロデューサーはそれを1回だけ送信するか、メッセージキューが重複メッセージを自動的に破棄します。
プロデューサーがブローカーにメッセージを正常に送信したが応答がない場合、プロデューサーはメッセージをブローカーに再送信します。このとき、ブローカーには重複したメッセージがあります。再試行しないと、メッセージが失われる可能性があります。
MQTTプロトコルは、メッセージ配信の3つのサービス品質を明確にし、低から高までの3つのサービス品質は次のとおりです。
- 最大1回:最大1回、メッセージが配信されると、最大1回配信されます
- 少なくとも1回:少なくとも1回、メッセージが配信されると、少なくとも1回配信されます
- 正確に1回:正確に1回、メッセージが配信されると、たまたま1回配信されます
メッセージキューは重複メッセージを破棄できますが、実装コストは高くなりますが、メリットは非常に低くなります。
例を挙げましょう。コンシューマーがメッセージの消費に成功したが、ackが失敗した場合でも、ブローカーはこの時点で繰り返しメッセージをコンシューマーに送信し、コンシューマーはメソッドがべき等であることを確認する必要があります。
したがって、メッセージキューでは少量の繰り返しメッセージが許可され、ビジネスレベルでべき等を実装するための最良の方法です。RabbitMQ、RocketMQ、Kafkaなどの一般的に使用されるメッセージキューには、少なくとも1回のサービス品質があります。
メソッドがべき等であることを確認するにはどうすればよいですか?
一意のインデックスを使用する
ビジネスの一意のフィールドに一意のインデックスを追加して、データが繰り返されたときに挿入回数が増えるようにします。