GASでは簡単にLINE Messaging APIとともにLINE Botを構築できます。
しかし、自分で作ったLINE Botが大規模に利用されるにつれてある問題が発生しています。
そもそも大規模なLINEBotをGASで運用する知見がそもそもネット上には共有されていません。
そのため、この事象にたいしての知見を投稿して、警鐘を鳴らすこととしました。
GASで対処できないLINEBot規模とはどのくらいか
あるLINE Botがプチバズり、現在友達総追加数は2900名ほどになり、GASによれば3万回/週ほどwebhookがコールされます。
時間帯にもよりますが、リアルタイムログだと10秒から1秒間の感覚でコールされたり、頻度の高い時は1秒よりも短い間隔のうちに数回コールされます。
このLINE Botは、与えられたメッセージを解析して、一つのメッセージを返答するものであり、必ず返信が求められます。
しかしながら、LINE側の管理画面では受信に対してwebhookは成功していることとなっていますが、その実行量はGASのログに対して20%ほどの乖離がありました。
**すなわち、20%のwebhookはGoogle Apps Script側で返信を取りこぼしている可能性が示唆されています。**また、エラー率は一定しているため、極めてランダムな自然言語の受信メッセージに20%ほどの一定のエラーを引き起こす要素が分布しているとも考えにくいです。
その仮説を元にGASログを見ると、確かに20%ものwebhookが何らかの理由により失敗していることがわかります。
GASの実行ログの概要
さらに、GAS側で問題が起きていることの原因に対して「極めて短い間隔で連続してwebhookがコールされたためにエラーが発生しているのでは?」と仮説を立て、GASの実行ログを見ると以下の知見を得ました。
1秒よりも短いインターバルでの連続webhookが失敗することがある
GASログを眺めると、エラー発生には
1秒よりも短い、または同程度のインターバルでの連続webhookコールは失敗しやすい
という知見が得られました。
なお、具体的なエラーログの中身は通常収集できません。
これは、GASではwebhookでトリガーした処理はLogger.log()などで出力することはできない仕様になっているためです。
今後GASにtry,catch分でエラー内容をSpreadsheetなどにリダイレクトして確認するなどもできますが、今回のような極めて短い間隔でwebhookがコールされる状況では、正常にSpreadsheet操作ができるかは疑わしいです。この点に関しては、また調査した結果をQiitaに投稿するつもりです。
GASのLINE Botに運用するときのAvailabilityに関して
今回のLINE Botは入力に対して返信をする必要がある場合が多いため、高いavailabilityが求められます。
幸い、20%の増加するエラー率に対して、今のところはブロック数などの増加は見られませんが、長期的に見てサービスの品質にユーザーが不満を持つ可能性が大いにあります。
GASでは同時実行回数が30回までとありますが、webhookで今回のようなユースケースでは実用に耐えない場合がある可能性が示唆されました。この点に関してはまだ検証が必要ですが、LINE Botの利用者の増加及び、利用頻度の増加に対応するには、Google CloudやAWSなどへの切り替えが必要なのかもしれません。
大規模なLINE BotへのGASの利用に関する情報が不足しているため、何か知っている方がいましたらぜひコメントで知見を共有いただければ幸いです。
ここまでお読みいただきありがとうございました。😊