消息队列、RabbitMQ和RocketMQ

文章介绍了MQ消息队列的基本概念、作用,如解耦、异步处理和流量削峰,并探讨了在高并发场景下使用消息队列的原因。同时,文章比较了RabbitMQ和RocketMQ的特性,包括两者在并发能力、分布式扩展、持久化和支持协议等方面的差异,以及各自的优缺点。
摘要由CSDN通过智能技术生成

MQ(Message Queue)消息队列

什么是MQ

  • MQ(Message Queue)消息队列,是基于数据结构中“先进先出”的一种数据结构。简单来说就是在消息传输过程中保存消息对容器。
  • 一般用来解决应用解耦,异步消息,流量削峰等问题
  • 实现高性能,高可用,可伸缩和最终一致性架构。

为什么使用消息队列

  • 在高并发的场景下,由于来不及处理同步请求,请求会发生堵塞。通过消息队列,可以异步的处理请求,缓解系统压力
  • 当系统资源有限时,不断的向系统发起请求,超过系统所能处理请求的最大阈值,可能会导致系统崩溃。
  • 当发起请求需要立即获得回调信息,而请求的处理需要消费一点的时间时。如:发送邮件,系统下单,模型训练,远程接口调用等

大生产环境下,为什么选择用RabbitMQ之类的消息队列,而不是使用Redis这类可以做队列的NoSql数据库

  • 把消息插入NoSql数据库,不如队列的入队出队操作简单
  • 频繁的向数据库添加新的消息会增大数据库的负载
  • 如果并发的处理数据库,需要对数据库进行上锁或处理会话等操作,甚至可能出现死锁等现象,而使用消息队列不需要考虑这些情况
  • 当消息越来越多时,数据库需要定期对消息进行清理
  • 消息队列在消费者和生产者中引入了exchange的概念,当压力增长的情况下,可以通过配置exchange在不停机的情况下调整系统资源,缓解服务压力

MQ的实现方式

AMQP

AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。

在AMQP协议中,生产者将消息发送到Exchange中,通过Exchange将消息路由到不同的Queue中,由消费者从Queue中获取消息进行处理。由于Exchange的存在,在消息队列中可以通过配置Exchange将消息发送给不同的队列,缓解调整系统资源。

JMS

JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
JMS是一种与厂商无关的 API,用来访问收发系统消息,它类似于JDBC(Java Database Connectivity)。这里,JDBC 是可以用来访问许多不同关系数据库的 API,而 JMS 则提供同样与厂商无关的访问方法,以访问消息收发服务。JMS 使您能够通过消息收发服务(有时称为消息中介程序或路由器)从一个 JMS 客户机向另一个 JMS客户机发送消息。JMS消息通常有两种类型:(1)点对点(Point-to-Point)。在点对点的消息系统中,消息分发给一个单独的使用者。点对点消息往往与队列相关联。(2)发布/订阅(Publish/Subscribe)。发布/订阅消息系统支持一个事件驱动模型,消息生产者和消费者都参与消息的传递。生产者发布事件,而使用者订阅感兴趣的事件,并使用事件。该类型消息一般与特定的主题关联。

AMQP和JMS的对比

ANQPJMS
定义线级协议Java API
跨平台
跨语言
Model
五种消息模型
  • Direct Exchange
  • Fanout Exchange
  • Topic Exchange
  • Headers Exchange
  • System Exchange
本质上,后四种消息模型和Publish/Subscribe没有差别,只是在路由机制上做了更细致的划分
两种消息模型
  • Point-to-Point
  • Publish/Subscribe
消息类型byte[]
五种消息类型
  • Text message
  • Object message
  • Bytes message
  • Stream message
  • Map message
消息流 Producer将消息发送到Exchange,Exchange将消息路由到Queue,Consumer从Queue中消费消息。 Producer将消息发送到Queue或者Topic,Consumer从Queue或Topic中消费消息。
综合对比AMQP定义了线级协议标准;具有跨平台、跨语言特性。MS 定义了JAVA API层面的标准;在java体系中,多个client均可以通过JMS进行交互,但是其对跨平台、跨语言的支持较差

RabbitMQ和RocketMQ的比较

特性RabbitMQRocketMQ
Prodocer-Comsumer支持支持
Publish- Subscribe支持支持
Request-Reply(请求回复)支持
API完备性
多语言支持语言无关只支持Java
单机吞吐量万级万级
消息延迟微秒级毫秒级
可用性高(主从)非常高(分布式)
消息丢失
消息重复可控制
文档完备性
部署难度
部署方式独立独立
社区活跃
商业支持阿里云
特点并发能力强分布式扩展设计,多种消费模式,支持上万个队列,性能好
支持协议AMOP基于JMS的自定义协议(社区提供的JMS不成熟)
持久化内存、文件磁盘文件
事务支持支持
负载均衡支持支持
管理界面有web console实现
评价
  • 优点
    • MQ性能好
    • 管理界面丰富
    • 支持AMQP协议,跨平台能力强
  • 缺点
    • erlang语言难度较大
    • 集群不支持动态扩展
  • 优点
    • 模型简单,接口易用
    • 在阿里有大规模的应用
    • 性能好
    • 支持多种消费
    • 开发度活跃,版本更新较快
  • 缺点
    • 产品较新,文档缺乏
    • 基于自己的一套协议,兼容性差
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北溪入江流

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值