servicestack.redis:pooledredisclientmanager和redismanagerpool等待prev req完成

3mpgtkmj  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(636)

我正在测试redis的“全双工”通信,如图所示,阅读文档时,我认为 PooledRedisClientManager 以及 RedisManagerPool 拥有一个客户机池,因此能够并行处理多个mq消息。
然而,在github的测试项目中,我觉得情况并非如此,或者我遗漏了一些东西。解决方案包括:
eventpublisher:.net核心winforms应用程序,用于将hello DTO发布到mq
eventconsumer:.net核心winforms应用程序,该应用程序具有用于处理hello DTO的service impl
我在helloservice中添加了一个thread.sleep Any(Hello req) 当我从eventpublisher快速发送几个hello dto时,我期望它们在eventconsumer中被并发处理,因为我认为客户端池将被使用。然而,情况似乎并非如此。
这个 HelloResponse 一个接一个地处理,似乎是在同一个线程上。请看这个短片:
http://somup.com/cyhey8inml
在这里,我连续向mq发送了三个hello dto,在vs的输出窗口中,您可以看到这三个dto是一个接一个地处理的。
我找不到背景 PooledRedisClientManager 也不是 RedisManagerPool 在这里我可以指定池大小。

xbp102n0

xbp102n01#

我认为pooledredisclientmanager和redismanagerpool都有一个客户机池
这句话是真的。
从而能够并行处理多个mq消息。
这是一个无效的结论,没有上下文是没有意义的。池redis客户端管理器本身不执行任何操作,即它们只管理redis客户端池,这意味着当从池中检索客户端时:

var redis = clientsManager.GetClient();

这个 RedisClient (即单个tcp连接的客户端到redis服务器)从客户端管理器管理的客户端池中检索,当客户端被释放时,它将返回到池中,而不是终止tcp连接。
当某个东西正在使用一个池时,客户机管理器不会自己执行redis命令,而应用程序使用它所做的事情是特定于它们的实现的。他们使用的是池这一事实与此无关,可以很容易地将其配置为在不使用池的情况下使用basicredisclientmanager,也就是说,应用程序使用客户机管理器并不需要对其使用方式进行任何假设。
在您的示例项目中,您使用redis mq执行servicestack服务:

mqHost.RegisterHandler<Hello>(base.ExecuteMessage);
mqHost.Start(); //Starts listening for messages

在你之前的回答中,你引用了:
创建一个redismq服务器,在其自己的后台线程上处理每条消息。
完整的评论接着提供了一个例子:

i.e. if you register 3 handlers it will create 7 background threads:
///   - 1 listening to the Redis MQ Subscription, getting notified of each new message
///   - 3x1 Normal InQ for each message handler
///   - 3x1 PriorityQ for each message handler (Turn off with DisablePriorityQueues)

它解释了redis mq server如何处理消息,即每种消息类型都在其自己的后台线程上处理,因此如果您阻止消息工作线程,那么您就是在阻止该类型的其他消息的线程(即请求dto)。

mqHost.RegisterHandler<Hello>(base.ExecuteMessage);

它不会阻止在自己的后台线程或优先级mq线程上处理的其他消息,该线程用于处理发送的消息 Priority>0 .
redis mq docs提供了一个示例,说明如何通过指定 noOfThreads 注册处理程序时:

轻松地并行化和增加您的服务吞吐量

redismqserver还支持为单个请求生成任意数量的后台线程,因此如果发布到twitter是io密集型操作,只需分配2个或更多工作线程,就可以将吞吐量提高一倍,例如:

mqService.RegisterHandler<PostStatusTwitter>(ExecuteMessage, noOfThreads:2);
mqService.RegisterHandler<CallFacebook>(ExecuteMessage);
mqService.RegisterHandler<EmailMessage>(ExecuteMessage);

相关问题