2

私はgearmanを使用して、さまざまな異なるジョブをキューに入れています。その中には、いつでもすぐにサービスを提供できるものと、信頼性の低い外部サービスを必要とするために「失敗」するものがあります。(たとえば、電子メールを送信するには、頻繁に使用できないSMTPサーバーが必要になる場合があります。)

外部サービスがダウンした場合、そのサービスを必要とするすべてのジョブをキューに残し、サービスが再び利用可能になるまで1つのジョブをときどき(たとえば、数分ごとに)再試行したいと思います。(サービスが何時間も利用できなかった場合は、オプションで電子メールを送信することもできます。)

ただし、失敗したサービスを必要としない仕事をできるだけ早く労働者に引き継いでほしい。これはどのように達成できますか?(必要に応じて、ロジックの一部をワーカーに配置できてうれしいですが、ワーカー側でスロットルするのは少し「遅い」ようです。)

4

1 に答える 1

2

ギアマンはすでにこれを処理しているはずです。信頼性の低い依存関係のあるジョブの処理を専門とし、他のジョブを処理しないワーカーと、すべてのジョブを実行するワーカー、または信頼性の低い依存関係のないジョブのみを処理するワーカーがいる限り。

必要なのは、信頼性の低い依存関係ワーカーのコードを追加して、依存関係のあるサービスが実行されていることを確認したジョブのみを受け入れるようにすることです。サービスがダウンしている場合は、少し待ってからサービスを再テストします(続行します)。 ad infinitum)、サービスが起動したら、ギアマンドサーバーに参加させ、仕事をし、仕事を返し、サービスを再テストします。

依存サービスがダウンしている間、サービスを必要とするジョブを処理しないワーカーは、他のジョブのジョブキューを探し続けます。他のジョブタイプを処理できるワーカーが存在する場合、Gearmandは1つのジョブタイプのジョブキュー(またはワーカー)全体をブロックしません。

重要なのは、職種と労働者をどのように定義するかについて賢明であることです。

編集 -

ああ、私は自分の考えが少し外れていることを知っていました(私は約1年前にギアマンシステムを作成しましたが、それ以来実際には触れていません)。このタイプの問題に対する私の解決策は、依存サービスで障害が検出されたら、通常は依存ジョブを処理するすべてのワーカーに、依存ジョブ処理機能をギアマンサーバーに登録解除させることでした。(そして、現在そのジョブを完了しようとしているすべてのワーカーは失敗を返す必要があります。)サービスがバックアップされたら、同じワーカーにそのジョブを処理する能力を再登録してもらいます。これには、依存サービスのステータスをワーカーに通知するための別の通信チャネルが必要であることに注意してください。

お役に立てれば

于 2011-11-20T14:08:34.323 に答える