消息队列的功能特点
消息队列的核心
- 消息:指传递的数据
- 队列:指存储消息的数据结构,管理着消息的进入和退出
- 一个基础的消息队列是这样的:
- Broker(消息处理中心):负责消息的接受、存储、转发
- Producer(生产者):消息生产者,产生消息,推送给Broker
- Consumer(消费者):从Broker获取消息,并进行一定的处理
说完消息队列的基础模型,接下来就得说说消息队列所存在的问题,以及解决方案
消息堆积
- 消息堆积是指Consumer消费消息的速度赶不上Producer生产消息的速度,进一步导致系统的Broker的资源积压无法释放。
- 解决方案一般分为当Broker积压到达阈值时,直接拒绝;不在进入处理中心,防止系统资源耗尽,导致消息队列不可用。
- 当然,如果消息队列对消息的可靠性有要求不能直接拒绝,可以采用备用的消息队列提升处理的性能。
消息持久化
- 消息持久化是指对消息进行物理存储,防止在服务宕机的情况下,消息丢失的情况,常用的策略有磁盘,数据库,分布式文件系统
可靠投递
- 可靠投递是指,不允许发生消息丢失的情况
- 消息丢失可能发生在如下时间:
- Producer->Broker(超时重发,ACK确认,如TCP)
- Broker->Consumer(Consumer执行完message后,手动commit;参考数据库事务)
- Broker对消息的持久化(提高刷盘的频率)
消息重复
- 为了解决消息的可靠投递,会使用重发机制;有可能导致消息重复消费(消息在持久化时,对消息进行唯一值判断;或者进行SET集合修正数据)
严格有序
- 消息队列中的消息既然是存储在队列中,则自然消息是严格有序的