トラブルシューティング - 音声読み上げ

LINE のボットによる音声読み上げの多数同時実行によりシラサギが過負荷となる事例が増えてきました。音声読み上げの多数同時実行の対策方法を解説します。

なお、音声読み上げの <a> タグには rel="nofollow" を設定しており、Google のボットはこれを尊重してくれるので、Google ボットによる被害は今のところありません。

対策案1-1. v1.14.0 以降へバージョンアップ

v1.14.0 で、ボット対策を強化し、LINE のボットを含め、ボット全般による音声読み上げの実行を防止しました。 なお、ボットの判定は “browser” GEM を利用していますので、新種のボットの場合は防御をすり抜けてくる可能性があります。

対策案1-2. nginx や apache httpd などの HTTP サーバーによるアクセス制限

対策案1-1を実施するのが困難な場合の対策です。また対策案1-1を実施したけどボットが防御をすり抜けてくる場合にも有効な対策となります。

音声読み上げをクリックすると URL “/.voice/” へアクセスします。 ボットの場合に “/.voice/” へのアクセスをブロックするように HTTP サーバーを構成します。

対策案2. ジョブを service モードにする

シラサギの既定では、ジョブが on demand モードに設定されており、on demand モードではリクエスト一つにつきプロセスを一つ起動します。同時に多数のリクエストがあるとその分だけプロセスを起動しますので、限度を超えて同時に多数の音声読み上げのリクエストがあるとメモリ不足となりシラサギの動作が不安定となります。

非同期実行 / バッググラウンドジョブ を参考に、ジョブを service モードに設定してください。

対策案3. 音声読み上げリクエストを定期的に削除する

ジョブを service モードにすると音声読み上げリクエストがキューに溜まっていきます。 キューに多数のリクエストがたまると、書き出しやリンクチェックなど他のジョブの実行が大きく遅延する可能性があります。 そこで、キューに溜まった音声読み上げリクエストを定期的に削除してやります。

まず、キューに溜まった音声読み上げリクエストを削除するには、シラサギディレクトリで次のコマンドを実行します。

bundle exec rails runner 'Voice::SynthesisJob.purge_pending_tasks'

このコマンドを cron などに設定してやり、定期的にキューに溜まった音声読み上げリクエストを削除するようにします。