首页 > 解决方案 > 寻求对ServiceStack.Redis的理解:IRedisClient.PublishMessage vs IMessageQueueClient.Publish

问题描述

我很难将两者分开IRedisClient.PublishMessageIMessageQueueClient.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.

标签: servicestackservicestack.redisredismqserver

解决方案


Mythz 在 ServiceStack 论坛上回答了这个问题,这里

他写:

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

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

无论哪种方式,MQ 服务器仅设计用于处理来自 MQ 客户端的消息,如果您要实现自己的消息传递实现,请使用您自己的消息和 redis 客户端,而不是 MQ 客户端或 MQ 消息类。

没有 IRedisClient (& ServiceStack.Redis) API 用于 Redis Server,PublishMessage API 发送 redis PUBLISH 命令。IRedisSubscription 创建 Redis Pub/Sub 订阅,请参阅 Redis 文档以了解 Redis Pub/Sub 的工作原理。ServiceStack.Redis 库及其所有 API 仅用于 Redis 服务器,它不包含任何 ServiceStack.Messaging MQ API。

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


推荐阅读