autoscaling AWS ElasticBeanstalk環境でCeleryを使用して非同期タスクやスケジュールされたタスクを処理するDjangoアプリケーションを構築する最適な方法を解明しようとしています。elasticbeanstalkのautoscaled djangoアプリケーション用セロリビットの複数のインスタンス
これまでのところ、私はCelery + CelerybeatでElastic Beanstalk環境を1つしか使用していませんでしたが、これは問題なく動作しました。しかし、私は自分の環境で複数のインスタンスを稼働させたいと思っています。インスタンスがクラッシュし、インスタンスがバックアップされるまでに多くの時間がかかるためです。しかし、現在のアーキテクチャを複数のインスタンスに拡張することはできません。 Celerybeatは、すべてのインスタンスで1回だけ実行されるはずです。そうしないと、Celerybeatによってスケジュールされたすべてのタスクが複数回(環境内のすべてのEC2インスタンスに対して1回)送信されます。
私は、複数のソリューションについて読んだことがあるが、それらのすべては、それが私のために働くことはありません問題があるようです:
- Djangoのキャッシュ+ロックを使用する:このアプローチは、より簡単な修正のようなものです本当の解決策です。スケジュールされたタスクがたくさんあり、すべてのタスクのキャッシュをチェックするコードを追加する必要がある場合、これは解決策にはなりません。また、タスクは複数回送信されますが、この方法では重複の実行が停止することが確認されます。
- ebextensionsでのleader_onlyオプションの使用:最初はうまく動作しますが、環境内のEC2インスタンスがクラッシュしたり置き換えられたりすると、リーダは作成時に一度しか定義されないため、Celerybeatが実行されていない状況になります環境の
- Elastic Beanstalkワーカー層で非同期タスク用の新しいDjangoアプリケーションを作成する:Webサーバーとワーカーを個別にスケーリングすることができ、ワーカーが実行する膨大な非同期作業負荷の影響を受けないためです。ただし、この方法はCeleryでは機能しません。これは、ワーカー層のSQSデーモンがメッセージを削除し、メッセージ本文を定義済みのURLに投稿するためです。さらに、メインアプリケーションからモデルをインポートする必要がある完全な追加のDjangoアプリケーションを持っていて、メインアプリケーションでタスクが変更されている場合は、個別に更新して配備する必要があるという考えは嫌いです。
タスクの重複がない分散Elastic Beanstalk環境でスケジュールされたタスクでCeleryを使用するにはどうすればいいですか?例えば。 Elastic Beanstalk環境で(たとえ現在のインスタンスがCelerybeatでクラッシュしたとしても)常に1つのインスタンスがすべてのインスタンスにわたって実行されていることを確認するにはどうすればよいですか?
これを達成する他の方法はありますか? DjangoでElastic BeanstalkのWorker Tier Environmentを使用する最良の方法は何ですか?
ソリューションを見つけましたか?私は同じ問題を抱えていた –