Laravel Cached Database Stickiness

OVERVIEW

Laravel においてデータベースのレプリケーション遅延を解決するためのライブラリ

YEAR 2019


概要

AWS で Aurora のような分散型データベースを使用した場合, Writer に書き込んだ直後に Reader 側で結果を読み出すと, Writer から Reader への同期が完了しておらず,不整合な結果を読み出してしまうことがある。 Laravel デフォルトでも同一リクエスト中は "sticky" というオプションを設定することにより Writer からの読み出しを強制することができるが,場合によっては次のリクエストまで同期が完了していないこともあり,実際の現場でこれに起因する不具合に遭遇した。この問題を解決するために,最終リクエストから数秒間の間に拡張して Writer からの読み出しを強制できるライブラリを開発した。

機能

  • Nginx + php-fpm + Laravel 構成の HTTP サーバがリクエストを受けるとき,あるユーザに関して最終リクエストから直近 5 秒間の間は,常に Writer を参照させるようにする。
  • php-cli + Laravel 構成の Queue Worker が,デフォルトで Writer を参照するようにする。
  • php-cli + Laravel 構成の Queue Worker が ShouldAssumeFresh インタフェースを実装した Queueable(Job, Listener, Notification, Mailable)を処理するとき,デフォルトで Reader を参照するようにする。


WEBSITE