寻求对ServiceStack.Redis的理解:IRedisClient.PublishMessage与IMessageQueueClient.Publish

问题描述

我在分离IRedisClient.PublishMessageIMessageQueueClient.Publish时遇到了困难,意识到必须将某些东西混在一起。

ServiceStack使我们可以选择以下方式收听发布/订阅广播:

    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)进行发布,则会创建频道“ Test”,并且消息将在那里持久保存,但是永远不会弹出/提取删除

我想了解两者之间的区别。我查看了源代码,并阅读了所有相关内容,但是我没有找到有关IRedisClient.PublishMessage的任何文档。

解决方法

Mythz在ServiceStack论坛here上回答了这个问题。

他写道:

这些客户端不应互换使用,您只能 使用ServiceStack MQ客户端发送MQ消息或消息MQ 邮件包装器。

redis订阅是用于创建Redis发布/订阅的低级API 订阅,更有用的高级API是Managed Pub / Sub 将发布/订阅订阅包装在托管线程后面的服务器。

无论哪种方式,MQ Server仅设计为处理来自MQ的消息 客户,如果您要实施自己的消息传递 实现使用您自己的消息和Redis客户端而不是MQ 客户端或MQ消息类。

没有用于Redis Server的IRedisClient(&ServiceStack.Redis)API。 PublishMessage API发送redis PUBLISH命令。订阅 创建Redis发布/订阅订阅,请参阅Redis文档以了解如何 Redis发布/订阅作品。 ServiceStack.Redis库及其所有API 仅用于Redis Server,不包含任何内容 ServiceStack。消息传递MQ API。

因此,只需对自定义Redis Pub / Sub使用ServiceStack.Redis 订阅实施,即不使用任何ServiceStack.Messaging 仅适用于ServiceStack MQ的API。