servicestack - 寻求对ServiceStack.Redis的理解:IRedisClient.PublishMessage vs 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 论坛上回答了这个问题,这里。
他写:
这些客户端不应互换使用,您应该只使用 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。
推荐阅读
- python - 熊猫数据框样式 - 如何单独对每一行进行颜色映射(不是整体)
- android - Kotlin 将字符串压缩/放气到服务器不工作
- google-chrome-extension - 你如何在chrome中获得所有可见的标签?
- sql - 如何仅获取每个部门的最低工资员工的一条记录?DB2
- php - 使用静态函数为表单的选择选项定义数组
- single-page-application - 与身份服务器中的 cookie 和令牌共享身份验证
- audit.net - Audit.NET.MVC 未登录异常
- ios - 使用 Firebase 启动时适用于 iOS 的 Flutter 应用程序崩溃
- c++ - 包括来自文件系统
- android - 如何以编程方式更改 Android 中材质组件文本按钮的样式?