寻求对ServiceStack.Redis:IRedisClient.PublishMessage vs IMessag



我很难分离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的文档。

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

他写道:

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

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

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

没有用于Redis Server的IRedisClient(&ServiceStack.Redis(APIPublishMessage API发送redis PUBLISH命令。IRedis订阅创建Redis Pub/Sub订阅,请参阅Redis文档了解如何Redis Pub/Sub-works。ServiceStack.Redis库及其所有API仅适用于Redis Server,不包含任何ServiceStack。消息传递MQ API。

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

最新更新