小编典典

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

redis

我正在测试Redis的“全双工”通信,如此处所示,并阅读了文档,我认为PooledRedisClientManager以及RedisManagerPool都有一个客户端池,因此能够并行处理多个MQ消息。

但是,在Github上的测试项目中,我看来并非如此,或者我缺少了一些东西。该解决方案包括:

  • EventPublisher:.NET Core WinForms应用程序,用于将Hello DTO发布到MQ
  • EventConsumer:具有用于处理Hello DTO的Service impl的.NET Core WinFOrms应用程序

我在HelloService内添加了一个Thread.Sleep Any(Hello req),当我从EventPublisher中快速发送多个Hello
DTO时,我期望它们将在EventConsumer中同时处理,因为我认为将使用客户端池。但是,事实似乎并非如此。

HelloResponses的处理一前一后,好像在同一个线程。请观看以下短片:

http://somup.com/cYheY8iNml

在这里,我快速地将三个Hello DTO触发到MQ,在VS的“输出”窗口中,您可以看到三个DTO相互处理。

我没有找到设置,PooledRedisClientManager也没有RedisManagerPool可以指定池大小的地方。


阅读 776

收藏
2020-06-20

共1个答案

小编典典

我以为PooledRedisClientManager和RedisManagerPool都有客户端池

这句话是真的。

因此能够并行处理多个MQ消息。

这是一个无效的结论,没有上下文就没有意义。池化Redis客户端管理器本身不会执行任何操作,即它们仅管理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

在上一个答案中,您引用了:

创建一个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 MQServer如何处理消息,即每种消息类型都是在其自己的后台线程上处理的,因此,如果您阻塞消息工作线程,那么您将阻塞用于阻塞该类型的其他消息的线程(即,请求DTO)。

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

它不会阻止其他类型的消息在其自己的后台线程或Priority MQ线程上处理,而该类型消息将通过来处理Priority>0

所述Redis的MQ文档提供了如何可以增加线程的数量的实施例中使用通过指定处理每个消息类型noOfThreads注册处理程序时:

轻松并行化和乘以您的服务吞吐量

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

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