0

最近、私のSymfonyプロジェクトを手動でスケーリングするEC2環境からElastic Beanstalkに移動しましたが、問題に遭遇しました。Amazon ElasticBeanstalkのシングルインスタンスcronjob

私はCronジョブを持っており、期限が切れている注文を集め、注文を作成して料金を請求しようとしていますが、このジョブはバッチで1つのサーバーで実行されるため、 Cronが重複して実行されている場合、同じサブスクリプションで複数の料金が発生します。

手動スケーリング環境では、私はちょうどcrontabを持っていてプライマリを走らせていたプライマリサーバを持っていましたが、ここで実行可能ではないようです。

プライマリサーバを使用しない自動スケーリング環境でこれを設定する方法に関する提案はありますか?

JMSJobQueueBundleを調べましたが、スーパーバイザだけがcrontabのインスタンスを1つだけ実行しているように見えますが、これは自動スケーリング環境では重複しています。

x分ごとに外部サーバーにAPIをpingして、pingする1つのインスタンスでジョブを起動することをお勧めしますか?これはもう一つの失敗の原因となるようです。

答えて

2

警告として、あなたが解決しようとしている問題は簡単なものではありません。

いくつかのオプション:あなたはMySQLデータベースに接続する場合は、トランザクションの開始時にロック(https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_get-lock)を取得し、最後にロックを解除

  1. 。これにより、同時に複数のcronジョブがコードを実行するのを防ぐことができます。 SQL内ですべてが処理される場合にのみ機能します。

  2. あなたが言及したように、AWS Lambda + CloudWatch Eventsを使用してx分ごとにLambda関数をトリガーし、Lambdaがhttpを介してスクリプトをトリガすることができます。しかしラムダはそれがまったく一回であることを保証しないので、これは安全ではありません。

  3. 分散ロック(例:etcd、consul、redis、...)を取得し、MySQLデータベースにはない1と同様の方法で実装できるサービスを使用します。それでも、あなたは本当にこれを一度も拒否することはできません。

  4. あなたはそれがexsistsが1回だけであることを知っている別のec2のインスタンスにcronjobを入れます(このec2インスタンスが実行されない場合は何も実行されませんが、 15分後に実行して、まだすべての作業に追いつくことができます。

分散システムで、より「現代」のアプローチは、あなたの行動の冪等を行うことであろう。

+0

私は、労働者を設定しようとします。 –

関連する問題