6

私は、断続的な3G(または同様の)接続を介して「現場」で数百の小さなシステムを管理するソフトウェアを書いています。

ホームベースは、フィールド内のシステムにジョブを送信する必要があり(たとえば、「ステータスのレポート」、「ソフトウェアの更新」など)、フィールド内のシステムは、サーバーにジョブを送り返す必要があります(たとえば、 「障害が検出されました」、「ここにいくつかのデータがあります」など)。

私はCeleryをしばらく見てきました、これはぴったりのようです。celerydホームベースで実行するとフィールド内のcelerydシステムのジョブを収集でき、フィールドシステムで実行するとサーバーのジョブを収集できます。これらのジョブは次のようになります。クライアントが利用可能になると交換されます。

それで、セロリはこの問題にぴったりですか?具体的には:

  • タスクの大部分は個々のワーカーに向けられます(たとえば、「get_status」ジョブを「system51」に送信します)—これは問題になりますか?
  • 不利なネットワーク状態(接続の切断など)を適切に処理しますか?
  • RabbitMQがバックエンドとして使用されている場合にのみ使用できる機能は何ですか?(フィールドシステムでRabbitMQを実行したくない)
  • 私が説明したようにセロリを使用した場合、セロリが私の人生を困難にする可能性がある他の理由はありますか?

ありがとう!

(セロリがやり過ぎだと示唆するのは妥当ですが、それが私の人生を楽にする他の理由があるので、それを検討したいと思います)

4

2 に答える 2

12

タスクの大部分は個々のワーカーに向けられます(たとえば、「get_status」ジョブを「system51」に送信します)—これは問題になりますか?

全くない。ワーカーごとにキューを作成するだけです。たとえば、default各ノードが呼び出されたラウンドロビンキューをリッスンし、各ノードにノード名にちなんで名付けられた独自のキューがあるとします。

(a)$ celeryd -n a.example.com -Q default,a.example.com
(b)$ celeryd -n b.example.com -Q default,b.example.com
(c)$ celeryd -n c.example.com -Q default,c.example.com

タスクをノードに直接ルーティングするのは簡単です。

$ get_status.apply_async(args, kwargs, queue="a.example.com")

またはRouter:を使用した構成

# Always route "app.get_status" to "a.example.com"
CELERY_ROUTES = {"app.get_status": {"queue": "a.example.com"}}

不利なネットワーク状態(接続の切断など)を適切に処理しますか?

ワーカーは、ブローカー接続の障害から正常に回復します。(少なくともRabbitMQからは、他のすべてのバックエンドについてはわかりませんが、これはテストと修正が簡単です(関連する例外をリストに追加するだけで済みます)

クライアントの場合、接続がダウンしている場合はいつでもタスクの送信を再試行できます。または、RabbitMQを使用してHAを設定できます:http ://www.rabbitmq.com/pacemaker.html

RabbitMQがバックエンドとして使用されている場合にのみ使用できる機能は何ですか?(フィールドシステムでRabbitMQを実行したくない)

リモートコントロールコマンド、および「直接」交換のみがサポートされています(「トピック」または「ファンアウト」はサポートされていません)。ただし、これは昆布(http://github.com/ask/kombu)でサポートされます。

RabbitMQの使用を真剣に再考します。なぜそれがうまく合わないと思いますか?私見私はこのようなシステムを他の場所で探すことはありません(システムが一時的でメッセージの永続性を必要としない場合はZeroMQを除いて)。

私が説明したようにセロリを使用した場合、セロリが私の人生を困難にする可能性がある他の理由はありますか?

あなたが上で述べたことから私は何も考えられません。同時実行モデルはマルチプロセッシングであるため、ある程度のメモリが必要です(スレッドプールとイベントレットプールのサポートの追加に取り組んでいます。これは場合によっては役立つ可能性があります)。

セロリがやり過ぎだと示唆するのは妥当ですが、それが私の人生を楽にする他の理由があるので、それを検討したいと思います)

その場合、あなたは「やり過ぎ」という言葉を軽く使うと思います。それは本当にあなたがそれなしで書く必要があるコードとテストの量に依存します。既存の一般的なソリューションを改善する方が良いと思います。理論的には、アプリケーションでうまく機能するはずです。

于 2010-10-03T11:30:15.393 に答える
1

リクエストを受け入れるように(django)Webサービスをセットアップするでしょう。Web サービスは、リクエストを検証し、不正なリクエストをそらす作業を行うことができます。その後、セロリはただ仕事をすることができます.

これには、リモート デバイスが Web サービスをポーリングして、ジョブが完了したかどうかを確認する必要があります。正確に何をしているかに応じて、それが適切である場合とそうでない場合があります。

于 2010-10-03T00:47:28.870 に答える