“这会导致消息队列溢出吗?”
是 . 随着队列长度的增加,RabbitMQ将进入“流控制”状态,以防止过多的内存消耗 . 它还将开始将消息持久化到磁盘,而不是将它们保存在内存中 .
那么我怎样才能加快消费者的吞吐量,以便消费者能够赶上 生产环境 者并避免队列中的消息溢出
有2个选择:
-
添加更多消费者 . 请记住,如果选择此选项,您的数据库现在将被多个并发进程操纵 . 确保DB能承受额外的压力 .
-
增加消费渠道的 QOS 值 . 这将从队列中提取更多消息并在消费者上缓冲它们 . 这将增加整体处理时间;如果缓冲了5条消息,则第5条消息将占用消息1 ... 5的处理时间 .
我应该在消费者部分使用多线程来加快消费率吗?
除非你有一个精心设计的解决方案 . 向应用程序添加并行性将在消费者方面增加大量开销 . 您最终可能会耗尽ThreadPool或限制内存使用量 .
在处理AMQP时,您确实需要考虑每个流程的业务需求,以便设计最佳解决方案 . 您收到的消息对时间有多敏感?它们是否需要持久保存到DB ASAP,或者对您的用户是否重要,无论该数据是否立即可用?
如果不需要立即持久存储数据,则可以修改应用程序,以便消费者只需从队列中删除消息并将其保存到Redis中的缓存集合中 . 引入第二个进程,然后按顺序读取和处理缓存的消息 . 这将确保您的队列长度不会充分增长以导致流量控制,同时防止您的数据库被写入请求轰炸,这通常比读取请求更昂贵 . 您的消费者现在只是从队列中删除消息,稍后由另一个进程处理 .