私は以下のシナリオを処理するための最良の方法を探しています:Heroku、RabbitMQなど多くの労働者。最高のアーキテクチャとは何ですか?
センサーデータをRabbitMqブローカーに公開する複数のエッジデバイスがあります。ブローカは1秒あたり〜500メッセージの全体的な作業負荷を経験します。次に、一度に1つのセンサーの読み取り値を消費し、フィルターを適用して(最大5〜15msかかることがあります)、その結果を別のトピックにパブリッシュするPythonワーカーdynoがあります。
もちろん、1人のワーカーがすべてのリクエストを処理するには十分ではないため、適切なスケーリングが必要です。キューを使用して、各センサーの読み取り値が1回だけ消費されることを確認します。
私の質問は以下のとおりです。
は私が水平に拡張し、ちょうどRabbitMQのキュー内のすべての要求を処理するのに必要な数のdynosを開始しますか?シンプルだが高価だと思われる。
ダイノスは少なくても、各ダイノーにはさらに多くのスレッドが搭載されている方がよいでしょう。セロリ?
または、キューから1つのアイテムを消費し、動的にdynoをスケジュールするロードバランサがありますか?
全く何か?
短期間のPythonプロセスを実行している単一のDynoを持つのは無駄なことではありませんか?現時点では、ブローカーとしてのRabbitMQは、キューを管理し、各メッセージをコンシューマに均等に配信する責任があり、コンシューマは同じメッセージを受け取ることはありません。そのため、ロードバランサがその権利を守る必要はありませんか? – binaryguy
RabbitMQは負荷分散を行います。同じキュー/ダイレクト交換に複数のコンシューマを配置することで、デフォルトでロードバランシングが実現します。短期間のPythonプロセスを実行しているDynoについては、処理のために新しいメッセージを継続的に消費するワーカーであるため、ユースケースを誤解しない限り、常に動作します。 – metame
はい、あなたは正しいです。セロリの必要はないと思う。私はそのようなシンプルなpythonプロセスがDynosを無駄にするかもしれないと心配していました。結局のところ、このアプローチは、より多くのDynosを並行して実行する必要があるため、保守は容易ですが、適切に高価になる可能性があります。 – binaryguy