はじめに
実務で経験した課題を記事で記録します。
サーバ1台で稼働している環境での記述です。
スケーラブルなサーバ環境では今回の記事を参考すると想定外の動作につながる可能性が高いです⚠️
背景
他社の広告を配信した際は、他社にImpressionを通知する必要があります。
外部Apiをコールするため、通信に時間がかかるためLarvel Jobを利用してバックグラウンドで実行する設計をしました。
課題
- 外部apiをコールするJobなのでボトルネックになる可能性が高い
- LaravelのJobを並列処理すると同時実行問題が発生する(同じJobを複数回実行してしまう)
工夫:並列処理の設定をする
php artisan queue:work --queue=send_impression
php artisan queue:work --queue=send_impression
php artisan queue:work --queue=send_impression
上記のようにキューワーカーを複数実行することで並列処理ができます。
ですが、同時に同じJobを同時実行する問題が発生します。
そもそもキューワーカーが各々異なるキューを参照するようにすればどうかな?
という考えからキューを分割する設計を考案しました。
php artisan queue:work --queue=send_impression1
php artisan queue:work --queue=send_impression2
php artisan queue:work --queue=send_impression3
上記のように設定することで同時に同じJobを取得する可能性を0にすることができました。
処理のイメージ
キュー分割前
キュー分割後
キュー分散で達成できたこと
- 並列処理によるパフォーマンス向上
- スケーラビリティの向上
- 同時処理問題の解消