消息队列、RabbitMQ和RocketMQ

简介: 消息队列、RabbitMQ和RocketMQ

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的对比




ANQP
JMS


定义
线级协议
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的比较



特性
RabbitMQ
RocketMQ


Prodocer-Comsumer
支持
支持


Publish- Subscribe
支持
支持


Request-Reply(请求回复)
支持



API完备性




多语言支持
语言无关
只支持Java


单机吞吐量
万级
万级


消息延迟
微秒级
毫秒级


可用性
高(主从)
非常高(分布式)


消息丢失




消息重复
可控制



文档完备性




部署难度




部署方式
独立
独立


社区活跃




商业支持

阿里云


特点
并发能力强
分布式扩展设计,多种消费模式,支持上万个队列,性能好


支持协议
AMOP
基于JMS的自定义协议(社区提供的JMS不成熟)


持久化
内存、文件
磁盘文件


事务
支持
支持


负载均衡
支持
支持


管理界面

有web console实现


评价



  • 优点

    • MQ性能好

    • 管理界面丰富

    • 支持AMQP协议,跨平台能力强



  • 缺点

    • erlang语言难度较大

    • 集群不支持动态扩展









  • 优点

    • 模型简单,接口易用

    • 在阿里有大规模的应用

    • 性能好

    • 支持多种消费

    • 开发度活跃,版本更新较快



  • 缺点

    • 产品较新,文档缺乏

    • 基于自己的一套协议,兼容性差






相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
12天前
|
消息中间件 存储 Kafka
MQ 消息队列核心原理,12 条最全面总结!
本文总结了消息队列的12个核心原理,涵盖消息顺序性、ACK机制、持久化及高可用性等内容。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
17天前
|
消息中间件 JSON Java
开发者如何使用轻量消息队列MNS
【10月更文挑战第19天】开发者如何使用轻量消息队列MNS
55 6
|
12天前
|
消息中间件 存储 监控
ActiveMQ、RocketMQ、RabbitMQ、Kafka 的区别
【10月更文挑战第24天】ActiveMQ、RocketMQ、RabbitMQ 和 Kafka 都有各自的特点和优势,在不同的应用场景中发挥着重要作用。在选择消息队列时,需要根据具体的需求、性能要求、扩展性要求等因素进行综合考虑,选择最适合的消息队列技术。同时,随着技术的不断发展和演进,这些消息队列也在不断地更新和完善,以适应不断变化的应用需求。
59 1
|
15天前
|
消息中间件
解决方案 | 云消息队列RabbitMQ实践获奖名单公布!
云消息队列RabbitMQ实践获奖名单公布!
|
25天前
|
消息中间件 安全 Java
云消息队列RabbitMQ实践解决方案评测
一文带你详细了解云消息队列RabbitMQ实践的解决方案优与劣
60 8
|
23天前
|
消息中间件 存储 弹性计算
云消息队列RabbitMQ实践
云消息队列RabbitMQ实践
|
29天前
|
消息中间件 存储 监控
解决方案 | 云消息队列RabbitMQ实践
在实际业务中,网站因消息堆积和高流量脉冲导致系统故障。为解决这些问题,云消息队列 RabbitMQ 版提供高性能的消息处理和海量消息堆积能力,确保系统在流量高峰时仍能稳定运行。迁移前需进行技术能力和成本效益评估,包括功能、性能、限制值及费用等方面。迁移步骤包括元数据迁移、创建用户、网络打通和数据迁移。
63 4
|
1月前
|
消息中间件 数据采集 数据库
小说爬虫-03 爬取章节的详细内容并保存 将章节URL推送至RabbitMQ Scrapy消费MQ 对数据进行爬取后写入SQLite
小说爬虫-03 爬取章节的详细内容并保存 将章节URL推送至RabbitMQ Scrapy消费MQ 对数据进行爬取后写入SQLite
21 1
|
4月前
|
消息中间件 C语言 RocketMQ
消息队列 MQ操作报错合集之出现"Connection reset by peer"的错误,该如何处理
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
2月前
|
消息中间件 运维 监控
云消息队列RabbitMQ实践解决方案评测报告
本报告旨在对《云消息队列RabbitMQ实践》解决方案进行综合评测。通过对该方案的原理理解、部署体验、设计验证以及实际应用价值等方面进行全面分析,为用户提供详尽的反馈与建议。
79 16
下一篇
无影云桌面