ServiceStack.Redis:PooledRedisClientManager和RedisManagerPool等待上一请求完成
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ServiceStack.Redis:PooledRedisClientManager和RedisManagerPool等待上一请求完成相关的知识,希望对你有一定的参考价值。
我正在测试Redis的“全双工”通信为shown here,并读取the docs,我认为PooledRedisClientManager
和RedisManagerPool
都有一个客户端池,因此能够处理多个并行MQ消息。
但是,在测试项目found here on Github中,在我看来并非如此,或者我缺少了一些东西。解决方案包括:
- EventPublisher:.NET Core WinForms应用程序,用于将Hello DTO发布到MQ
- EventConsumer:具有用于处理Hello DTO的Service impl的.NET Core WinFOrms应用程序
我在HelloService Any(Hello req)
中添加了一个Thread.Sleep,当我从EventPublisher中快速发送多个Hello DTO时,我期望它们将在EventConsumer中并发处理,因为我认为将使用客户端池。但是,事实似乎并非如此。
HelloResponse
似乎是在同一线程上一个接一个地处理的。请看这段短片:
[这里,我快速连续地将三个Hello DTO触发到MQ,并且在VS的“输出”窗口中,您可以看到三个DTO彼此依次处理。
我没有在PooledRedisClientManager
或RedisManagerPool
中找到可以指定池大小的设置。
我认为PooledRedisClientManager和RedisManagerPool都有一个客户端池
此说法正确。
因此可以并行处理几个MQ消息。
这是一个无效的结论,没有上下文就没有意义。 Pooled Redis Client Managers本身不执行任何执行,即,它们仅管理redis客户端池,这意味着从池中检索客户端时:
var redis = clientsManager.GetClient();
RedisClient
(即与Redis服务器连接的单个TCP连接的客户端)是从由客户端管理器管理的客户端池中检索的,并且当客户端被处置时,它将返回到池中,而不是终止TCP连接。] >
这就是当某事正在使用池时,所有这些假设,客户经理不自行执行Redis命令,而应用程序使用它的行为特定于其实现。他们使用的池是无关紧要的,可以很容易地将它们配置为使用不使用池的BasicRedisClientManager,即应用程序对客户端管理器的使用不会对如何使用它进行任何假设。 >
在示例项目中,您使用Redis MQ执行ServiceStack服务:
mqHost.RegisterHandler<Hello>(base.ExecuteMessage); mqHost.Start(); //Starts listening for messages
在您的previous answer中引用:
创建一个Redis MQ服务器,该服务器在其自己的后台线程上处理每个消息。
完整的评论继续提供示例:
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);
对于使用
Priority>0
发送的该类型的消息,它不会阻止其他消息在其自己的后台线程或Priority MQ线程中处理。Redis MQ文档提供了一个示例,说明如何通过注册处理程序时指定
noOfThreads
来增加用于处理每种消息类型的线程数:
轻松并行化和乘以您的服务吞吐量
RedisMqServer还支持为单个请求生成任意数量的后台线程,因此,如果发布到Twitter是IO密集型操作,则只需分配2个或更多工作线程即可将吞吐量提高一倍,例如:
mqService.RegisterHandler<PostStatusTwitter>(ExecuteMessage, noOfThreads:2);
mqService.RegisterHandler<CallFacebook>(ExecuteMessage);
mqService.RegisterHandler<EmailMessage>(ExecuteMessage);
以上是关于ServiceStack.Redis:PooledRedisClientManager和RedisManagerPool等待上一请求完成的主要内容,如果未能解决你的问题,请参考以下文章
ServiceStack.Redis 请求次数6000次异常
ServiceStack.Redis 请求次数6000次异常