MQ消息队列

800 阅读3分钟

MQ

常用协议

AMQP

提供统一消息服务的应用层标准高级消息队列协议,是一个应用层开放标准。

MQTT

消息队列遥测传输,即时通讯协议,物联网

STOMP

流文本定向消息协议

XMPP

可拓展消息处理现场协议,多用于IM即时消息以及在线现场探测,基于XML传输

其他基于TCP/IP自定义

组成

  • Broker:消息服务器
  • Producer:生产者
  • Consumer:消费者
  • Topice:主题,消息统一汇集地
  • Queue:队列
  • Message:消息体

模式分类

点对点

一个消息只有一个消费者,消费即消失

发布/订阅

同时有多个消费者消费该消息。但是一个消息只能被一个消费者接受,当没有消费者可用时,消息一直保存直到消费

优点

解耦

降低系统之间的关联度耦合度,降低容错性

异步

削峰

缺点

降低高可用

系统引入的外部依赖越多,越容易挂掉。引入MQ,若MQ挂掉,整个系统也挂了

集群
  • RabbitMQ:镜像集群
  • RocketMQ:双主双从

增加系统复杂程度

要考虑到保证消息的准确性。不被重复消费,消息丢失,传递顺序

一致性问题

多个请求,其中一个修改数据失败,数据不统一

消息丢失

  • 设置持久化
    • 交换器持久化
    • 队列持久化
  • ack确认机制
    • 消息发送确认
    • 消息接收确认
  • 消息补偿机制:消息发送、接收时记录日志,定时轮训日志,查明哪些发送消费没有成功,启动重新发送消息机制

重复消息

  • 发送重复消息

  • 消费重复消息

    • 消费者消费消息但为回馈消息给MQ,MQ又会发送给消费者,此时就造成消息重复

解决办法

保证消息的幂等性,在发送消费的时候在数据库插入一个唯一键,插入相同的数据则不进行操作。

消息顺序

生产者:MQ:消费者=1:1:1

  • 消息被发送时保持顺序
  • 消息被存储时保持和发送时顺序一致
  • 消息被消费时保持和存储时顺序一致

RocketMQ根据消息ID将同一组的消息发送到一个Queue中,消息队列本来就是先进先出,保证了存储顺序一致;又采用分段锁,保证单个Queue中的有序消费

消息过期

设置死信队列,接收过期消息,创建死信消费者消费过期时间

各个MQ的比较

特性 ActiveMQ RabbitMQ RocketMQ Kafka
单机吞吐量 万级 万级 万级 十万级
topic数量对吞吐量的影响 topic可以达到几百几千级别时,有影响 topic可以达到几百几千级别时,有影响
时效性 ms级 微秒级 ms级 ms级
可用性 高,主从 高,主从 非常高,分布式架构 非常高,分布式
消息可靠性 理论不丢失 理论不丢失
消息重复性 可控制 理论不重复
多语言支持 支持,JAVA优先 语言无关 只支持JAVA 支持,JAVA优先
持久化 内存、文件、数据库 内存、文件 磁盘文件