Firestoreを利用した Cloud run jobの重複実行排除(Slack Appでの利用例) - なんかいろいろと

Firestoreを利用した Cloud run jobの重複実行排除(Slack Appでの利用例)

Slack Appの機能にeventsという 特定のイベントを指定URLにpostする機能がある。

この機能は、3秒タイムアウトで3回リトライするようになっている。

これをcloud runでいい感じに扱いたい。という話

平時は特に問題ないのだけれど、cloud runがcold startする場合、3秒で返せないのでretryが発生してeventが多重に来る。

cloud runで起動したアプリケーションには3回来てしまうので、重複排除しないと、最大3回同じイベントが発火してしまうことになる。

これでは困るので、firestoreなどを使って、起きたイベントを記録して重複排除する。 などのちょっとした小細工が必要になる。

イベントの発火頻度によっては、 cloud runのminimum instanceを1にするという手もあるが、これをすると、cloud runの費用が嵩むため避けた方が良い。

という話

具体的には、slack eventのユニークなIDで createして、成功したら後続処理を行う。という形です

firestoreのtransactionを使うことで lockして多重実行を防げる。レコードがあれば実行しないことで多重実行を防げる。

ほっとくとデータがどんどんたまっていってしまうが、

firestoreにはTTL設定があり、TTL超えたら(ベストエフォートで)削除してくれる機能があるため、この機能を使うとfirestoreのデータがどんどん増えることも防げる。

ストレージを利用して多重実行を止めるのはよくある手で、Slack Appに関わらず利用できるが、たまたまSlack Appでこの事象に出会ったので記録しておく。