当前位置: 首页 > 面试题库 >

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

杜翰林
2023-03-14
问题内容

我正在测试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可以指定池大小的地方。


问题答案:

我以为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);


 类似资料:
  • 问题内容: 在Bash中,可以通过追加在后台执行命令。如何在Python中完成? 问题答案: 我用。我在模块级别创建一个单例线程池,然后用于启动任务。 该命令给了我一个未来,我可以将它无限期地与其他未来添加到列表中,直到我想收集全部或部分结果为止。 出于所有逻辑和理由,是一个THREAD池而不是一个进程池。 示例(只要安装了请求,就可以在Python 2和3中使用): 这些请求将同时执行,因此运行

  • 问题内容: 我需要等到我所有的ajax函数都完成后,再继续执行。 我的特殊情况是,在提交表单之前,我需要翻译表单中的某些字段。我通过ajax调用将其转换为外部站点。根据表单中的某些值,我需要进行更多或更少的翻译。完成所有翻译后(如果有),我必须使用ajax验证表单,如果表单有效,则提交。 这是我的方法: 首先,我有一个函数发送ajax调用并对接收到的数据进行处理: 然后,当要提交表单时,我将执行以

  • 我目前是Jmeter的新手,正在尝试创建一个Jmeter脚本来测试处理和完成请求所需的时间。 a)使用令牌进行身份验证-完成b)发送请求-完成-返回200 c)获取请求-部分完成 C:我正试图得到能够监控这个请求,以找出它什么时候完成,失败等等。 我从研究JSR223采样器开始,但想看看是否有更好更简单的方法来实现这一点。 列表sendGet(字符串url,map 正文){

  • 问题内容: 我有一个页面,根据变量的长度,它可以发出不同数量的请求,然后我只想在所有请求完成后才将数据发送到范围。对于这个项目,我不想使用jQuery,因此请不要在答案中包含jQuery。目前,随着每个请求的完成,数据被发送到作用域,这不是我想要的。 这是我到目前为止的部分代码。 这是我对此表示怀疑的部分,因为某些东西需要作为的参数,但是在Angular的文档中并未提及,我不确定它的含义。 谢谢你

  • 我有一个简单的Java程序,它使用SpringWebClient发送多个请求。每个都返回一个mono,我使用的是response。subscribe()以检查结果。 但是,我的主执行线程在处理所有请求之前完成,除非我添加一个长线程。睡眠()。 对于CompletableFutures,您可以使用:CompletableFuture。allOf(期货)。join(); 有没有办法等待所有单声道的完成

  • 我正在编写一个应用程序,用谷歌的凌空API执行一系列请求。问题是我不知道请求什么时候完成。在我进一步行动之前,我需要知道一个请求是否已经完成。我不能用while循环或sleep/wait方法等待一定时间,因为它似乎会停止执行请求的线程。显然,请求有onResponse回调,我可以用它来标记单个请求何时完成。但我有一个活动可以发出多个请求,我希望该活动处于待机状态,直到所有请求都得到处理。就像我说的