Q&A

時間をあけて実行した時にLINEBOTが反応しない(LINEBOTが100%動作するようにしたい)

前提・実現したいこと

LINE firestore GCP Node.js(v10.23.0)

を利用しています。 LINEメッセージ画面上で、actionが設定された画像がタップされた時、GCPにデプロイしたfunctionsからpostbackアクションを受信して、次の画像を送信する、といった機能などを開発しています。 この機能が、ほぼ100%確実に動作するようにしたいと考えています。

発生している問題・エラーメッセージ

上記の機能は基本的に問題なく動作します。 しかし、前の実行から数十分程度置いて実行すると、画像が送信されないことがあります。

一度実行すると何も起きず、数分後再実行しても何も起きない。 一度実行後、数十秒程度以内に再実行すると画像が二回送信されてきます。

##エラーメッセージ TypeError: Cannot read property 'forEach' of undefined at exports.linebot.functions.region.runWith.https.onRequest (/workspace/lib/index.js:199:21)

##該当行 req.body.events.forEach((event) => {

試したこと

失敗した実行では、どうやらGCPにundefinedが送信されているため、上記エラーが表示されているらしい、と考えています。 GCP、firestoreのコールドスタートに問題があると考え、cloud schedulerを使って毎分毎にLINEからのpostbackイベントを模したJSONを受信し、関数を定期実行させることで、コールドスタート対策としています。 上記はレスポンスの高速化と成功率の向上についてある程度の効果がありましたが、完全な解決とは至りませんでした。

上記現象の解決について、ご教示いただけると幸いです。よろしくお願いします。

  • 0
  • 1
  • 4540
  • X(旧Twitter) facebook

Webhook の replyToken は、一定時間 (たぶん、数十秒程度) で失効します。 もし画像を postback の reply で送信している場合で、cold start 時に replyToken の失効時間以上に startup に時間がかかっている場合には、cold start のオーバーヘッドを短縮するか push を使うかしか方法がないと思います。

しかし、エラーを見る限り、なにか違う原因があるのではないでしょうか。 まずは、req.body にどのようなリクエストが到着しているか確認してみてはいかがでしょう。

  • 0

関連する質問

    関連する質問はありません

本当によろしいですか? question.vm