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でこの事象に出会ったので記録しておく。