0

我很难将两者分开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(string toChannel, string message)则永远不会收到IMessageQueueClient.Publish(string queueName, IMessage message)
  • 如果我使用 发布IRedisClient.PublishMessage,我希望填充“测试”通道(如果我使用 Redis 浏览器查看),但事实并非如此。我从来没有看到任何队列的痕迹(假设我没有开始订阅,但生产者添加了消息)
  • 如果我使用 发布IMessageQueueClient.Publish(string queueName, IMessage message),则创建通道“测试”并将消息保留在那里,但永远不会弹出/提取和删除。

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

4

1 回答 1

0

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。

于 2020-08-17T14:29:27.860 回答