2017-02-22 27 views
1

私は最近、私のアプリをAmazonに移動させて自動スケーリングを使用するように強制されましたが、私はcronジョブと自動スケーリングの問題に遭遇しました。水平スケーリングとcronジョブ

15分ごとに実行されるcronジョブがあり、サブスクリプションを請求するかどうかを確認し、期限が過ぎているすべてのサブスクリプションを選択して料金請求を試みます。一度処理されると状態が変わりますが、バッチでフェッチされ、プロセスには1〜3分かかります。

同じcronジョブで複数のインスタンスがある場合、simutanoislyを起動してサブスクリプションに複数回請求する可能性があります。これは実際には一度起こりました。

ここで最善のアプローチは何ですか?どういうわけかテーブルをロックするか?

私はAmazonの弾力のある豆の茎とsymfony3を使用しています。

+0

ベストなアプローチを持っているキューおよびサブスクリプションの充電要求ごとに1つのキュージョブです。 RabbitMQ、AMQP、Pheanstalkなどを参照してください。そうでない場合は、一意のパス/名前を持つtmpロックファイルを設定します。ファイルが存在する場合、他のcronは起動しません。それ以外の場合は、tmpファイルが作成され( 'touch( '/ tmp/uniquely.lock')')、終了時または例外/スクリプト終了時にtmpファイルを削除します。後者の問題は、実行中かどうかを監視する必要があることです。そうでなければ、まったく動かない可能性があります。 –

+0

http://queues.io/ Amazonの関連タグを質問に追加することもできます。 –

+0

しかし、一時的な映画はどのようにAmazonのインスタンスで共有されますか?これらは別々のサーバーです – user3908531

答えて

1

最低でも、サブスクリプション課金用に専用のマイクロインスタンスを使用することはできますが(オートスケールはもちろんありません)、cronジョブを使用することができます。最も単純で安全です(フロントエンドサーバーからサブスクリプション処理ロジックを移動して、グローバルネットワークからは入手できないVPCサブネットの背後にあるサーバーに潜在的にハッキングされる可能性があることは明らかです)。

しかし、お望みでない場合でも、別の方法を使用することはできます。あなたはBeanstalkを使用すると述べました。 Beanstalk遅延ジョブを使用できるようにします。

だから、可能なアプローチは次のとおりです。

1)サブスクリプションを作成するときに、あなたはそれを充電する必要があるとき計算し、その後、Beanstalkチューブに算出した遅延で仕事をプッシュすることができます。

2)その後、作業者は(予約付きで)ジョブを取得します。 1人の作業者だけが特定の仕事を得るため、自動縮尺を使用するとうまくいきます。

3)ワーカーでは、定期購入をチェックします(おそらく削除または無効にすることができます)。充電する準備ができたら、充電コードを実行してください。次に、次の課金時間を計算し、新しい遅延ジョブ(サブスクリプション付き)をキューにプッシュします。

BeanstalkSymfony bundlepowerful PHP library