今まで開発していたアプリケーションを本番用に調整しているのですが、実装方法が良い実装方法が思い付かず相談に乗っていいただけないでしょうか?
構成
現在、下記のようなサーバー構成になっています。
ALBがロードバランサーになっており、EC2の冗長化をしています。
便宜上、mainとsubと言う名前にしています。
どちらにも同じプログラムが載っています。
また、時限処理を行いますので、それぞれcronを実行しています。
処理の内容
メッセージをメールで送るアプリケーションを作っています。
ユーザーが指定した時間に、cronでメッセージを送信します。
cronの設定は、laravelで登録したスケジュールを使っています。
お伺いしたい事
開発しているアプリケーションは時限処理を行なっています。
そのため、複数構成のサーバーに同じアプリケーションを置く場合、それぞれの環境でcronが実行されてしまいます。
そのため、重複してスケジュールを実行してしまいます。
場合によっては、2重送信される事も考えられます。
この場合、プログラム側、もしくはサーバー側でどのような対策を取るのが良いでしょうか?
まだ構築している最中ですので、サーバーの構成も、プログラムの構成も変える余地はあります。
私なりに考えられる方法
数点考え付きますが、それぞれ懸念点があり決めかねています。
1. 片方だけ実行できるように調整する
上記の構成で言う、mainインスタンスのプログラムにスケジューラーを設定して、subでは実行しない方法です。
しかし、これではmainが落ちてしまった時に機能しなくなってしまいます。
2. スケジューラー用にインスタンスを作る
スケジューラー機能だけのサーバーを立てて、スケジューラを動かします。
上記のようにインスタンス毎の違いが出ないので構成がわかりやすくなります。
ただ、この案もサーバーが落ちてしまうとスケジューラーが機能しません。
また、サーバー代も余分にかかります。
3. データベース側で送信ずみのフラグを用意する
スケジュールが2回実行されることは諦めて、送信済みかどうかをフラグで処理するようにします。
今後サーバーが増える場合、重複した処理が増えることになりますので、パフォーマンスが落ちる可能性もあります。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/10 12:52