ServiceStack.Redisの理解を求めています:IRedisClient.PublishMessageとIMessageQueueClient.Publish
とを分離するのに苦労していてIRedisClient.PublishMessage
、IMessageQueueClient.Publish
何かを混ぜ合わせているに違いないことに気づきました。
ServiceStackには、次のようなpub / subブロードキャストをリッスンするオプションがあります。
static IRedisSubscription _subscription;
static IRedisClient redisClientSub;
static int received = 0;
static void ReadFromQueue()
{
redisClientSub = redisClientManager.GetClient();
_subscription = redisClientSub.CreateSubscription();
_subscription.OnMessage = (channel, msg) =>
{
try
{
received++;
}
catch (Exception ex)
{
}
};
Task.Run(() => _subscription.SubscribeToChannels("Test"));
}
素晴らしく、簡単に見えます。しかし、プロデューサーはどうですか?
利用可能なクラスを見ると、IRedisClient.PublishMessage(string toChannel, string message)
またはを使用できると思いましたIMessageQueueClient.Publish(string queueName, IMessage message)
。
redisClient.PublishMessage("Test", json);
// or:
myMessageQueueClient.Publish("Test", new Message<CoreEvent>(testReq));
どちらの場合も、チャネル名は自分で指定します。これは私が見ている動作です:
- 上記のサブスクライバーは、使用
IRedisClient.PublishMessage(string toChannel, string message)
した場合にのみメッセージを受信し、使用した場合は受信しません。IMessageQueueClient.Publish(string queueName, IMessage message)
- を使用して公開する場合
IRedisClient.PublishMessage
、「テスト」チャネルにデータが入力されることを期待していましたが(Redisブラウザーで表示する場合)、そうではありません。キューの痕跡がまったく表示されません(サブスクリプションを開始しないが、プロデューサーがメッセージを追加するとします) - を使用して公開する
IMessageQueueClient.Publish(string queueName, IMessage message)
と、チャネル「テスト」が作成され、メッセージはそこに保持されますが、ポップ/フェッチおよび削除されることはありません。
両者の違いを理解したい。私はソースコードを見て、それについてできる限り読みましたが、に関するドキュメントは見つかりませんでしたIRedisClient.PublishMessage
。
回答
Mythzは、ServiceStackフォーラム(ここ)でこれに回答しました。
彼は書く:
これらのクライアントを同じ意味で使用しないでください。ServiceStackMQクライアントを使用してMQメッセージまたはメッセージMQメッセージラッパーのみを送信する必要があります。
redisサブスクリプションはRedisPub / Subサブスクリプションを作成するための低レベルAPIです。より便利な高レベルAPIは、マネージスレッドの背後にpub / subサブスクリプションをラップするマネージドPub / Subサーバーです。
いずれにせよ、MQサーバーはMQクライアントからのメッセージを処理するようにのみ設計されています。独自のメッセージング実装を実装する場合は、MQクライアントやMQメッセージクラスではなく、独自のメッセージとRedisクライアントを使用してください。
そして
IRedisClient(&ServiceStack.Redis)APIはRedisサーバー用ではありません。PublishMessageAPIはredisPUBLISHコマンドを送信します。IRedisSubscriptionはRedisPub / Subサブスクリプションを作成します。RedisPub/ Subの動作については、Redisのドキュメントを参照してください。ServiceStack.RedisライブラリとそのすべてのAPIはRedisサーバー専用であり、ServiceStack.Messaging MQAPIは含まれていません。
したがって、カスタムRedis Pub / Subサブスクリプションの実装にはServiceStack.Redisを使用するだけです。つまり、ServiceStackMQ専用のServiceStack.MessagingAPIは使用しないでください。