消息队列引论

简介: 消息队列引论

MQ与JMS

java是一个喜欢发布标准,让别人实现的语言,这个标准你可以理解为接口,像JDBC就是一组接口,由不同的数据库厂商负责实现,这是一个相当成功的设计。JMS也是类似于JDBC这样的标准,但是并没有做到像JDBC这么成功,所有的消息服务都按JMS来。

曾经的我以为MQ和JMS的关系是这样的:

image.png

像是接口和实现类一样,

但是实际上: 只有ActiveMQ完全遵守了JMS协议。RocketMQ、RabbitMQ、KafkaMq并不怎么遵守JMS。

JMS是什么?

The Java Message Service (JMS) API is a messaging standard that allows application components based on the Java Platform Enterprise Edition (Java EE) to create, send, receive, and read messages. It enables distributed communication that is loosely coupled, reliable, and asynchronous.

java 消息服务接口是一个基于java平台创建、发送、接收消息的标准,在分布式系统中常常被用来解耦合,异步发送消息。

MQ =  message queue

message queue 消息队列,首先是队列,队列是一种数据结构,一般情况是先进先出。image.png

那我们一般用消息队列来做什么呢? 或者消息队列可以用来做什么呢 ?

可以用来做中间件

那什么是中间件?  查了一些资料,发现并没有严格的定义,目前较为接受的定义是将具体业务和底层逻辑解耦的组件。 我们姑且可以将其理解为中介,我们想要租房的话,通常不会自己去找房东,通常也比较难找,也比较麻烦。如果你真的不想让中介占到一点便宜,跟某块地区的房东已经建立了战略合作关系,于是你每换一个地方就要自己再找一下房东,你于这个地区就产生了严重的耦合,房东也与你产生了耦合。

通常情况下,房东会将自己的房子委托给中介或者托管在某个平台,租房子的人通过中介或者托管平台来看房子。这个中介和被托管的平台我们就可以理解为中间件。有效的实现了房东和访客解耦,房东和租房子的人通过中介或托管平台交流。

所以你可以看到Redis也可以算进中间件,Redis也可以做消息队列。

实际的应用场景中,MQ被当做中间件时往往用于两个系统间进行通信,

image.png

A系统将B系统需要的消息放入消息队列中,B系统从消息队列中获取。

有人可能会问了,为什么B系统不直接调用A系统的接口呢? 要放一个消息队列呢? 其实也不是不行,那这样就耦合在一起了,也就是说A跟着动,B也要跟着动,软件行业普遍厌恶改动。 如果是在分布式系统中,我们就更希望调用关系清晰一点了,两个系统在某种意义上像是两个国家,两个国家之间的交流是通过外交部,而两个系统之间的交流就是通过消息队列。

削峰填谷

消息队列的另一个应用场景就是秒杀,秒杀情况下,一段时间内请求会很多,系统会承受不住这么多请求,请求也可以算做消息。

image.png

就能够让系统本身处理的请求量,保持在一个平稳的水平。

异步消息

事实上这根中间件有些重合,也可以算到解耦合的一部分。 RocketMQ的官方文档在介绍的作用或使用长江时,第一个讲的就是异步解耦。 作为淘宝/天猫主站最核心的交易系统,每笔交易订单数据的产生会引起几百个下游业务系统的关注,包括物流、购物车、积分、阿里妈妈、流计算分析等等,整体业务系统庞大而且复杂,架构设计稍有不合理,将直接影响主站业务的连续性。 一个订单算作一个消息,会被多个系统使用,像极了生产者、消费者模型。作为生产订单的这一方,并不直接和消费订单的这一方产生直接联系。

image.png

主流的MQ产品

  • RocketMQ

阿里巴巴出品,现在交给apache开源基金会维护。并不完全遵守JMS协议,支持的协议也比较多,性能强大。分布式易宽展。

  • ActiveMQ

Apache 出品 ,支持的协议比较多: AMQP 、STOMP 、MQTT、JMS。 java编写,可以将数据直接持久化到数据库中,可靠性比较低(发送的消息可能会丢失)

  • RabbitMQ

erlang语言编写,性能强,可靠性比较高

  • KafakaMQ

linkedin开源MQ,完全分布式架构,高吞吐量。设计之初是为了处理日志,一般作用于大量数据的数据收集业务。

相关实践学习
消息队列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
相关文章
|
3月前
|
消息中间件 存储 运维
如果让你消息队列,该如何设计?说一下你的思路
在分布式系统中,消息队列是不可或缺的组件,用于系统解耦、流量削峰和异步处理。设计一个高效的消息队列需考虑以下关键点:实现内存队列以支持快速入队和出队操作;内存数据持久化确保高可靠性;支持多种消息传递模式如点对点、广播和发布订阅;引入ACK机制保证消息正确处理;实现事件机制确保事务一致性;采用可靠的网络通信协议;以及通过集群部署实现高可用性和横向扩展能力。
41 0
|
消息中间件 存储 负载均衡
消息队列和应用工具产品体系-消息队列的基本概念
消息队列和应用工具产品体系-消息队列的基本概念
消息队列和应用工具产品体系-消息队列的基本概念
|
10月前
|
消息中间件 缓存 API
【后端面经】【消息队列】22 | 消息队列:消息队列可以用来解决什么问题?-03 扩展性+可用性+事件驱动思想
【5月更文挑战第8天】 本文探讨了扩展性、可用性和事件驱动的概念。扩展性方面,消息队列简化了新下游的接入,而同步调用需要复杂的协调。在保证高可扩展性和研发效率的设计中,若无法使用消息队列,可以提供一致性抽象来减轻接入负担。可用性上,消息队列只需确保消息发送,而同步调用需保证所有下游成功,更易出错。事件驱动是一种通过事件进行组件间通信的架构模式,具有低耦合、高扩展性和高可用性,适合处理复杂流程。结合SAGA的事件驱动方案能实现高级分布式事务管理,即使实时性稍弱,但能保证事务的异步和高效执行。
91 1
|
9月前
|
消息中间件 存储 RocketMQ
消息队列 MQ产品使用合集之如何防止丢数据
阿里云消息队列MQ(Message Queue)是一种高可用、高性能的消息中间件服务,它允许您在分布式应用的不同组件之间异步传递消息,从而实现系统解耦、流量削峰填谷以及提高系统的可扩展性和灵活性。以下是使用阿里云消息队列MQ产品的关键点和最佳实践合集。
|
9月前
|
消息中间件 监控 Java
消息队列 MQ产品使用合集之vipchannel的作用有哪些
阿里云消息队列MQ(Message Queue)是一种高可用、高性能的消息中间件服务,它允许您在分布式应用的不同组件之间异步传递消息,从而实现系统解耦、流量削峰填谷以及提高系统的可扩展性和灵活性。以下是使用阿里云消息队列MQ产品的关键点和最佳实践合集。
|
10月前
|
消息中间件 存储 负载均衡
简单入门:消息队列的概念和应用
在复杂的系统架构中,组件间的通信是至关重要的问题。消息队列作为一种解决方案,能够使组件之间的通信更加高效、可靠。本文将从简单到复杂,逐步向您介绍消息队列的概念、使用场景以及如何实现。
317 3
|
10月前
|
消息中间件 存储 监控
消息队列进阶-3.消息队列常见问题解决方案
消息队列进阶-3.消息队列常见问题解决方案
192 0
|
消息中间件 存储 中间件
吐血总结——消息队列之RocketMQ知识梳理
消息队列主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。 目前在生产环境,使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等。今天我就首先分析一下RocketMQ,目前公司用的也是这个,因此在进行一下梳理,加深一下印象。
382 0
|
消息中间件 监控 API
基于个人使用消息队列MQ产品的心得体会
随着互联网技术的不断发展,消息队列MQ(Message Queue)产品已经成为了现代软件架构中非常重要的一部分。这种技术可以通过异步处理来提高系统性能和可靠性,并且它还能够实现不同应用程序之间的解耦。在最近的几个月里,我尝试了使用一些流行的MQ产品进行开发,从而得出了一些有关其优点和缺点的心得体会。
258 2
|
消息中间件 存储 缓存
消息队列专题(未完待续)
消息队列专题(未完待续)
98 0