2017-02-18 8 views
0

私は以下のシナリオを処理するための最良の方法を探しています:Heroku、RabbitMQなど多くの労働者。最高のアーキテクチャとは何ですか?

センサーデータをRabbitMqブローカーに公開する複数のエッジデバイスがあります。ブローカは1秒あたり〜500メッセージの全体的な作業負荷を経験します。次に、一度に1つのセンサーの読み取り値を消費し、フィルターを適用して(最大5〜15msかかることがあります)、その結果を別のトピックにパブリッシュするPythonワーカーdynoがあります。

もちろん、1人のワーカーがすべてのリクエストを処理するには十分ではないため、適切なスケーリングが必要です。キューを使用して、各センサーの読み取り値が1回だけ消費されることを確認します。

私の質問は以下のとおりです。

  1. は私が水平に拡張し、ちょうどRabbitMQのキュー内のすべての要求を処理するのに必要な数のdynosを開始しますか?シンプルだが高価だと思われる。

  2. ダイノスは少なくても、各ダイノーにはさらに多くのスレッドが搭載されている方がよいでしょう。セロリ?

  3. または、キューから1つのアイテムを消費し、動的にdynoをスケジュールするロードバランサがありますか?

  4. 全く何か?

答えて

2

オプション1または2には、あなたの最高の賭け

ある私はオプション3は、HerokuののAPIに直接結び、そしてあなた自身のためのコードのトンを記述することなく存在しているとは思わない...しかし、それはやり過ぎですあなたのニーズに合わせて、IMO

と1 & 2の間では、コードを再配布せずにさらに多くのメッセージを処理できるようにするかどうかによって決まります。

私はちょうど新しいdynoインスタンスを追加して完了することができるので、オプション1は一般に私の好みです。 10秒かかります。

オプション2は、コードを調整して再デプロイしても問題ありません。それはコストのトレードオフのために余分な時間と労力を追加します。

しかし、ある時点では、オプション2はオプションの1に変わる必要があります。まず、dynoで多くの作業を行うことができます。あなたはダイノスを使ってスレッドの制限に遭遇します。あなたはダイノスでスケールアウトします。

+0

短期間のPythonプロセスを実行している単一のDynoを持つのは無駄なことではありませんか?現時点では、ブローカーとしてのRabbitMQは、キューを管理し、各メッセージをコンシューマに均等に配信する責任があり、コンシューマは同じメッセージを受け取ることはありません。そのため、ロードバランサがその権利を守る必要はありませんか? – binaryguy

+0

RabbitMQは負荷分散を行います。同じキュー/ダイレクト交換に複数のコンシューマを配置することで、デフォルトでロードバランシングが実現します。短期間のPythonプロセスを実行しているDynoについては、処理のために新しいメッセージを継続的に消費するワーカーであるため、ユースケースを誤解しない限り、常に動作します。 – metame

+0

はい、あなたは正しいです。セロリの必要はないと思う。私はそのようなシンプルなpythonプロセスがDynosを無駄にするかもしれないと心配していました。結局のところ、このアプローチは、より多くのDynosを並行して実行する必要があるため、保守は容易ですが、適切に高価になる可能性があります。 – binaryguy

関連する問題