ServiceStack.Redis:PooledRedisClientManager和RedisManagerPool等待上一请求完成

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ServiceStack.Redis:PooledRedisClientManager和RedisManagerPool等待上一请求完成相关的知识,希望对你有一定的参考价值。

我正在测试Redis的“全双工”通信为shown here,并读取the docs,我认为PooledRedisClientManagerRedisManagerPool都有一个客户端池,因此能够处理多个并行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似乎是在同一线程上一个接一个地处理的。请看这段短片:

http://somup.com/cYheY8iNml

[这里,我快速连续地将三个Hello DTO触发到MQ,并且在VS的“输出”窗口中,您可以看到三个DTO彼此依次处理。

我没有在PooledRedisClientManagerRedisManagerPool中找到可以指定池大小的设置。

答案

我认为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等待上一请求完成的主要内容,如果未能解决你的问题,请参考以下文章

C# - ServiceStack.Redis

ServiceStack.Redis 请求次数6000次异常

ServiceStack.Redis 使用教程

ServiceStack.Redis 请求次数6000次异常

解决ServiceStack.Redis的6000次限制问题

Redis客户端ServiceStack.Redis的简单使用