8

メッセージキューと Redis MQ、優れたフレームワークについて頭を悩ませています。

メッセージキューにあるメッセージ/イベントのタイプを処理するハンドラーを決定するには、.RegisterHandler(...) を使用する必要があることを理解しています。

したがって、EventA、EventB などがある場合、次のように、これらの各イベントを処理する 1 つのサービスが必要です。

public class DomainService : Service {

    public object Any(EventA eventA) {...}
    public object Any(EventB eventA) {...}
}

それで、これらは作成されたキュー/redisリストだけであるべきですか?

また、イベントのチェーンを発生させたい場合はどうすればよいでしょうか。たとえば、タイプ EventA のメッセージにも電子メールを送信するハンドラーがあり、チェーンの早い段階でハンドラーを提供すると成功しますか?

4

1 に答える 1

15

ServiceStackは、MQ、REST、HTML、またはSOAPサービス用に作成されたサービスを区別せず、同じものです。つまり、それぞれがリクエストDTOを受け入れ、オプションでレスポンスDTOを返します。同じサービスで、HTML、REST、SOAP、MQなどの任意のエンドポイントまたは形式からの呼び出しを処理できます。

MQがどのように適合するかについては、 ServiceStackのアーキテクチャ図を参照してください。

制限事項

覚えておく必要があるのは次のとおりです。

  • SOAPと同様に、MQは1つの動詞のみをサポートするため、メソッドにはPostまたはAnyという名前を付ける必要があります。
  • アクションフィルターのみが実行されます(つまり、グローバルフィルターまたは属性フィルターは実行されません)
  • IHttpRequest、の代わりにMqRequestおよびMqResponseスタブを取得しますIHttpResponse。リクエストパイプラインを介してデータを渡すために引き続き使用できます.Itemsが、CookieやHTTPヘッダーの設定などのHTTPアクションは無害です。

RedisMQホストの構成

MQホスト自体は、ServiceStackフレームワークの残りの部分から完全に切り離されています。ServiceStackフレームワークは、メッセージをServiceStackに自分で渡すまで、MQが存在することを認識しません。これは、通常、登録済みハンドラー内で行われます。

var redisFactory = new PooledRedisClientManager("localhost:6379");
var mqHost = new RedisMqServer(redisFactory, retryCount:2);

mqHost.RegisterHandler<Hello>(m => {
    return this.ServiceController.ExecuteMessage(m);
});

//shorter version:
//mqHost.RegisterHandler<Hello>(ServiceController.ExecuteMessage);


mqHost.Start(); //Starts listening for messages

RegisterHandler<T>で、リッスンするリクエストのタイプを指定します。

デフォルトでは、メッセージごとに1つのハンドラーのみを登録でき、ServiceStackでは、リクエストは既知のサービス実装に関連付けられます。MQの場合、最初に一致するメソッドシグネチャを探します。Post(Hello)それが存在しない場合は、フォールバックAny(Hello)

メッセージごとに複数のハンドラーを自分で追加できます

複数のハンドラーを呼び出したい場合は、独自のハンドラーを維持List<Handler>し、要求が発生したときにそれらすべてを実行して実行します。

さまざまなサービスを呼び出す

別のサービスを呼び出したい場合は、それを別のRequest DTOに変換し、代わりにServiceControllerに渡します。

MQリクエストが誰かによって送信された場合、例:

mqClient.Publish(new Hello { Name = "Client" });

ハンドラーは、RequestDTOがBodyプロパティに含まれているタイプIMessageのインスタンスで呼び出されます。その時点で、メッセージを破棄するか、検証するか、変更するかを選択できます。

MQリクエストは、他のサービスリクエストと同じです

ほとんどの場合、通常はメッセージをServiceControllerに転送して処理します。その実装は、次のとおりです。

public object ExecuteMessage<T>(IMessage<T> mqMsg)
{
    return Execute(mqMsg.Body, new MqRequestContext(this.Resolver, mqMsg));
}

実装は、 mqMsg.BodyからRequest DTOを抽出し、そのメッセージを、MQ IHttpRequest、IHttpResponseスタブを含むMqRequestContextを使用して、その時点からC#RequestDTOに渡される通常のサービスとして処理します。

于 2012-12-13T06:13:10.347 に答える