当前位置: 首页 > 知识库问答 >
问题:

为什么要使用单独的轮询线程和工作线程?

江鹏飞
2023-03-14

上下文:我正在设计一个应用程序,它将使用来自各种Amazon SQS队列的消息。(超过25个队列)为此,我正在考虑创建一个库来使用队列中的消息(称为MessageConsumer)

我希望根据队列中的流量动态分配线程来接收/处理来自不同队列的消息,以最大限度地减少资源浪费。我有两种方法可以做这件事。

1)只能有一种类型线程轮询队列、接收消息并处理这些消息,且所有队列都有一个公共线程池。2)可以有单独的轮询线程和工作线程。

在第二种情况下,我将拥有公共的工作线程池,每个队列的轮询器数量不变。

编辑:详细说明第二种情况:我计划让每个队列有一个持续运行的线程来戳那个队列中的消息量。然后根据每个队列中的消息数和队列的优先级来确定每个队列所需的轮询线程数。

我不希望轮询线程一直运行,因为这可能会导致空接收(sqs.receiveMessages()),所以我将根据流量分配轮询线程。高流量队列将有更多的轮询线程,因此将有更多的作业提交到工作线程池。

请建议这个设计有什么改进或缺陷?

共有1个答案

司马弘益
2023-03-14

建议的流程是:

  • 工作人员使用长轮询轮询队列(这意味着在返回空响应之前最多等待20秒)
  • 每次呼叫最多可以请求10条消息给ReceiveMessage()
  • 工作人员处理消息
  • 工作人员从队列中删除消息
  • 重复

如果您希望调整workers的数量,可以基于Amazon CloudWatch中的ExampiateNumberOfMessagesVisible度量。如果该数字太高,请添加一名员工。如果它降至零(或低于某个阈值),则移除一个工作者。

让每个工作者只轮询一个队列可能是最容易的。

不需要“民意测验员”。工人们自己进行投票。通过这种方式,您可以独立地对工作人员进行缩放,而不需要某个中心“轮询”服务来尝试对其进行全部管理。只需启动一个新的AmazonEC2实例,启动some workers并开始处理消息。当缩放时,只需终止工作人员,甚至终止实例--同样,不需要在中央“轮询”服务中注册/取消注册工作人员。

 类似资料:
  • Nuttx工作线程(LP和HP)具有轮询间隔,仅针对工作线程0。我想知道为什么需要轮询间隔? 当有人将一个新工作排入工作队列时,将向一个辅助线程发出处理它的信号。如果所有工作线程都忙,则当线程完成当前工作并再次检查队列时,将处理排队的工作。 与sched_garbage_collection()工作一样,工作线程由sched_signal_free()发出信号。 那么当需要轮询间隔时会是什么情况呢

  • 本文向大家介绍为什么要使用多线程?相关面试题,主要包含被问及为什么要使用多线程?时的应答技巧和注意事项,需要的朋友参考一下 先从总体上来说: 从计算机底层来说:线程可以比作是轻量级的进程,是程序执行的最小单位,线程间的切换和调度的成本远远小于进程。另外,多核 CPU 时代意味着多个线程可以同时运行,这减少了线程上下文切换的开销。 从当代互联网发展趋势来说:现在的系统动不动就要求百万级甚至千万级的并

  • 本文向大家介绍为什么要用线程池? 相关面试题,主要包含被问及为什么要用线程池? 时的应答技巧和注意事项,需要的朋友参考一下 池化技术相比大家已经屡见不鲜了,线程池、数据库连接池、Http 连接池等等都是对这个思想的应用。池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。** 线程池提供了一种限制和管理资源(包括执行一个任务)。 每个线程池还维护一些基本统计信息,例如已完成任务的数

  • 代码更清晰,处理逻辑更简单; 不用考虑各种锁的问题,不存在加锁和释放锁的操作,没有因为可能出现死锁而导致的性能问题; 不存在多线程切换而消耗CPU; 无法发挥多核CPU的优势,但可以采用多开几个Redis实例来完善;

  • 问题内容: 在基于PHP(或Java / ASP.NET / Ruby)的Web服务器中,每个客户端请求都在新线程上实例化。但是在Node.js中,所有客户端都在同一线程上运行(它们甚至可以共享相同的变量!)我知道I / O操作是基于事件的,因此它们不会阻塞主线程循环。 我不明白为什么Node的作者选择了它为单线程?这使事情变得困难。例如,我无法运行CPU密集型功能,因为它阻塞了主线程(并且阻塞了

  • 本文向大家介绍Redis 为什么是单线程的?相关面试题,主要包含被问及Redis 为什么是单线程的?时的应答技巧和注意事项,需要的朋友参考一下 因为 cpu 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且 cpu 又不会成为瓶颈,那就顺理成章地采用单线程的方案了。 关于 Redis 的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。而且