我正在考虑设置一个RabbitMQ代理来处理java Web应用程序的基本任务处理。基本思想是生产者是一个想要快速处理请求的Web服务器,但也需要做一些数据处理。为了实现这一点,它知道可以序列化为AMQP消息的一些Job DTO,并且某处有消费者知道如何处理这些作业。经典。
在阅读了RabbitMQ文档之后,我还有几个问题。
我希望消费者应用程序充分利用其CPU来处理消息,我想知道RabbitMQ是否已经提供了工作池。假设我想要4个工作线程,是否足以在同一个连接上注册4个通道和1个消费者?在这种情况下,工作将在handleDelivery()中完成,如果成功完成,将发送ack。或者更确切地说,我应该使用1个消费者并在我自己的应用层管理一个工作池?
消费者将与数据库交谈,这意味着会发生暂时性错误;死锁,乐观锁定违规,数据库服务器重新启动等。如果消费者无法处理工作,那么预期的行为是什么?发出nack并等待经纪人重新发送作业,或者延迟确认,直到确定作业无法完成为止?或者没关系?
值得注意的是,除非数据库正在重启,否则作业通常不会超过几秒钟。我很感激任何指导!
答案 0 :(得分:2)
1a上。如果您需要固定数量的工作线程,则应打开多个通道并为每个通道注册一个使用者。 RabbitMQ每个通道只有一个调度程序线程,因此一个消费者将阻止在同一个通道上注册的其他消费者。
1b中。如果您需要一个动态增长的工作池,那么您可以考虑使用spring-rabbit(假设您使用Java实现)。具体而言, SimpleMessageListenerContainer 管理一个消费者池,根据工作量负载动态增长和收缩。请参阅Spring AMQP参考指南中的"Listeners Concurrency"部分。
2a上。如果您知道工作人员已经失败,您可以解决,并将消息传递给其他消费者。除非消费者确认消息,否则消息将不会传递给其他消费者,除非它是“自动确认”模式。