pubsubのサブスクライバ側でat-only-once対策として過去に受け取ったメッセージはスルーする処理を実装しました。
実装したのでちゃんと動くかテストをしようと思いましたが、同じメッセージが複数送られるまで待つのは現実的ではありません。
同じmessage_idを意図的に再送できないか調べると、どうやらseek機能を使うことで配信済みメッセージを未配達として再度処理できるようです。
gcloud Consoleでポチポチしてseekさせる
- テストしたいメッセージを配信する
- 再送させたいメッセージが配信される以前の時刻を指定してシークさせる
もしくは
- サブスクリプションのスナップショットを作成
- テストしたいメッセージを配信する
- スナップショットまでシークさせる
以上の操作でメッセージが再送されます。
なんで再送されるのか
配信されたメッセージはサブスクリプション側で「確認済み」ステータスになります。
特定の時間までseekさせるとseek時点以前のメッセージは「確認済み」ステータスに、以後のメッセージは「未確認(未配信)」となります。
あるサブスクリプションが
時間 | message_id | ステータス |
---|---|---|
00:00 | 000000000000001 | 確認済み |
00:05 | 000000000000002 | 確認済み |
00:10 | 000000000000003 | 確認済み |
の時に00:03にseekさせると
時間 | message_id | ステータス |
---|---|---|
00:00 | 000000000000001 | 確認済み |
00:05 | 000000000000002 | 未確認 |
00:10 | 000000000000003 | 未確認 |
となり、message_id:000000000000002と000000000000003のmessageが再送されます。
この時message_idは同じものが付与されるため、at-only-once現象を擬似的に再現できました。