我正在测试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
在这里我可以指定池大小。
1条答案
按热度按时间xbp102n01#
我认为pooledredisclientmanager和redismanagerpool都有一个客户机池
这句话是真的。
从而能够并行处理多个mq消息。
这是一个无效的结论,没有上下文是没有意义的。池redis客户端管理器本身不执行任何操作,即它们只管理redis客户端池,这意味着当从池中检索客户端时:
这个
RedisClient
(即单个tcp连接的客户端到redis服务器)从客户端管理器管理的客户端池中检索,当客户端被释放时,它将返回到池中,而不是终止tcp连接。当某个东西正在使用一个池时,客户机管理器不会自己执行redis命令,而应用程序使用它所做的事情是特定于它们的实现的。他们使用的是池这一事实与此无关,可以很容易地将其配置为在不使用池的情况下使用basicredisclientmanager,也就是说,应用程序使用客户机管理器并不需要对其使用方式进行任何假设。
在您的示例项目中,您使用redis mq执行servicestack服务:
在你之前的回答中,你引用了:
创建一个redismq服务器,在其自己的后台线程上处理每条消息。
完整的评论接着提供了一个例子:
它解释了redis mq server如何处理消息,即每种消息类型都在其自己的后台线程上处理,因此如果您阻止消息工作线程,那么您就是在阻止该类型的其他消息的线程(即请求dto)。
它不会阻止在自己的后台线程或优先级mq线程上处理的其他消息,该线程用于处理发送的消息
Priority>0
.redis mq docs提供了一个示例,说明如何通过指定
noOfThreads
注册处理程序时:轻松地并行化和增加您的服务吞吐量
redismqserver还支持为单个请求生成任意数量的后台线程,因此如果发布到twitter是io密集型操作,只需分配2个或更多工作线程,就可以将吞吐量提高一倍,例如: