2017-09-28 3 views
1

SQL Serverを遅延メッセージストレージとして使用してカスタムリトライポリシーを作成できました。しかし今、スケーラビリティの理由から、私は複数のワーカー(メッセージハンドラタスク)を異なるマシンに展開して実行したいと考えています。その理由のために、私はSQL Serverから読み込むのではなく、待ち行列のような遅延メッセージを読む中心的な場所を持っていたいと思っています。Rebusでカスタムリトライメッセージのキューを設定する

遅延メッセージをキューに格納する方法はありますか。それはより良いアプローチですか?これを行うより良いアプローチは何でしょうか?

答えて

1

遅延メッセージをキューに格納する方法はありますか。それはより良いアプローチですか?

ない遅延はメッセージごとに異なることができる点で遅延メッセージと競合私は fifoで本当に良いです:)ほとんどのキューに精通しています任意のキュー、と(少なくとも一般的な場合)。

送信された順序とはまったく異なる順序で並べ替えられたメッセージにアクセスしたい場合、2次インデックスを持つデータベースは、遅延メッセージを格納するための非常に優れたテクノロジになります。

これを行うにはどうすればよいでしょうか?

SQL Serverに遅延メッセージを格納するのが間違っているとは私は理解していません。もちろん

、あなたがメッセージを延期多くのエンドポイントを持っている場合は、あなたの代わりに、個々のエンドポイントの世論調査にデータベースを持つの「外部のタイムアウトマネージャ」を使用することがあります - これはあなたのエンドポイントでこれを行うことであったことができます:

Configure.With(...) 
    .(...) 
    .Timeouts(t => t.UseExternalTimeoutManager("timeouts")) 
    .Start(); 

を入力し、構成されたタイムアウト記憶域と入力キューtimeoutsでエンドポイントを開始するだけです。

+0

私は外部タイムアウトマネージャを持つソリューションが好きです。これは(各作業者のポーリングデータベースではなく)私が探していたものです。しかし、この外部タイムアウトマネージャがどこで動作しているのか分かりますか?タイムアウトマネージャがクラッシュした場合、残りの作業者は別のタイムアウトマネージャを選択しますか? –

+0

タイムアウトマネージャが再起動せずに停止またはクラッシュした場合、エンドポイントは遅延メッセージを受信しません。新しい遅延メッセージは 'timeouts'キューにキューイングされます。タイムアウトマネージャーは通常のRebusエンドポイントであり、これを行う必要があります。 – mookid8000

+0

中央データベースを使用している場合(例: SQL Serverを使用していて、何らかの種類のブローカベースのキューイングシステム(RabbitMQなど)を使用している場合、冗長性を実装するために2つの異なるマシンに2つのタイムアウトマネージャインスタンスを配置するのはかなり簡単です – mookid8000

関連する問題