消息队列基础知识总结
什么是消息队列?
我们可以把消息队列看作是一个存放消息的容器,当我们需要使用消息的时候,直接从容器中取出消息供自己使用即可。由于队列 Queue 是一种先进先出的数据结构,所以消费消息时也是按照顺序来消费的。
Java web 中的消息队列主要用于各个服务以及系统内部各个组件/模块之前的通信,属于一种 中间件 。
什么是中间件 GPT 的回答:
中间件(Middleware)是位于系统程序和应用程序之间的软件层,它负责处理应用程序与操作系统之间的通信,并为应用程序提供共享服务,如安全、事务处理、数据库访问、消息传递等。中间件可以帮助应用程序更容易地开发、部署和维护,并提高应用程序的性能和可靠性。
中间件就是一类为应用软件服务的软件,应用软件是为用户服务的,用户不会接触或者使用到中间件。
消息队列的作用?
- 异步处理提高系统性能,降低响应时间
- 削峰/减流
- 降低系统耦合性
异步处理
将用户请求数据存储到消息队列之后就立即返回结果,随后系统再对消息进行消费
这虽然提高了系统的响应速度但是,请求的数据在后续的业务校验和写数据的过程中可能会失败,因此使用了消息队列进行异步处理需要适当的修改业务流程进行配合,比如用户在提交订单之后,订单数据写入消息队列,先返回订单已提交,而不是立即返回下单成功,需要在消息队列的订单消费者进程真正处理完该订单之后,甚至出库后,再通过电子邮件或短信通知用户订单成功,以免交易纠纷。这就类似我们平时手机订火车票和电影票。
削峰/限流
先将短时间高并发产生的事务消息存储在消息队列中,然后后端服务再慢慢根据自己的能力去消费这些消息,这样就避免直接把后端服务打垮掉。
降低系统耦合性
如果一个系统中请求端直接调用服务端,这将导致系统的耦合性高,不利于新增请求模块或者服务模块,如果请求端(生产者)只往消息队列中发生请求,而服务端(消费者)只往消息队列中获取请求进行处理,这样可以有效降低系统的耦合性,提高系统的可拓展性
消息队列使用发布-订阅模式工作,消息发送者(生产者)发布消息,一个或多个消息接受者(消费者)订阅消息。 消息发送者(生产者)和消息接受者(消费者)之间没有直接耦合,消息发送者将消息发送至分布式消息队列即结束对消息的处理,消息接受者从分布式消息队列获取该消息后进行后续处理,并不需要知道该消息从何而来。对新增业务,只要对该类消息感兴趣,即可订阅该消息,对原有系统和业务没有任何影响,从而实现网站业务的可扩展性设计。
使用消息队列会带来的问题
- 系统的可用性降低 : 引入消息队列之后需要考虑,消息是否丢失,MQ 是否会挂掉的情况
- 系统的复杂性提高 : 加入 MQ 之后,你需要保证消息没有被重复消费、处理消息丢失的情况、保证消息传递的顺序性等等问题!
- 一致性问题 : 使用消息队列异步处理请求的情况下,如果消息没有被正确的消费就会出现消息不一致的情况
JMS 和 AMQP
什么是 JMS?
JMS(JAVA Message Service) 是 Java 的消息服务,JMS 的客户端之间可以通过 JMS 服务进行异步的消息传输。JMS 定义了一个消息服务的接口和规范,允许应用程序组件使用 JMS 的实现,基于 JavaEE 平台创建、发送、接收和读取消息。它使分布式通信耦合度更低,消息服务更加可靠以及异步性。基于 JMS 规范实现的消息队列有 ActiveMQ ( 已被淘汰)
JMS 支持的数据格式
StreamMessage:Java
原始值的数据流
MapMessage
:一套名称-值对
TextMessage
:一个字符串对象
ObjectMessage
:一个序列化的 Java 对象
BytesMessage
:一个字节的数据流
JMS 支持的两种消息模型
- 点到点模型:使用队列(Queue)作为消息通信载体;满足生产者与消费者模式,一条消息只能被一个消费者使用,未被消费的消息在队列中保留直到被消费或超时。
- 发布/订阅(Pub/Sub)模型:使用主题(Topic)作为消息通信载体,类似于广播模式;发布者发布一条消息,该消息通过主题传递给所有的订阅者。一个消息可以被多个消费者消费
什么是 AMQP ?
AMQP,即 Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准 高级消息队列协议(二进制应用层协议),是应用层协议的一个开放标准,为面向消息的中间件设计,兼容 JMS。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件同产品,不同的开发语言等条件的限制。
AMQP 和 JMS 的区别
- AMQP 定义了一种消息协议,而 JMS 定义的是一种 API 规范,在 Java 体系中,多个 client 均可以通过 JMS 进行交互,不需要应用修改代码,这意味这 JMS 的跨平台性差,而 AMQP 具有跨平台跨语言的优势
- JMS 支持
TextMessage
、MapMessage
等复杂的消息类型;而 AMQP 仅支持byte[]
消息类型(复杂的类型可序列化后发送)。 - 由于 Exchange 提供的路由算法,AMQP 可以提供多样化的路由方式来传递消息到消息队列,而 JMS 仅支持 队列 和 主题/订阅 方式两种。
RPC 和 消息队列的区别
RPC 和消息队列都是分布式微服务系统中重要的组件之一,以下是他们之间的对比
- 用途方面: RPC 主要解决两个服务之间的远程通信问题,通过 RPC 我们可以调用远程计算机的某个服务或者方法,就像调用本地方法那样,而消息队列主要用于降低系统的耦合性,实现任务异步处理,对流量进行削峰
- 通信方式方面:RPC 是双向网络直接通信,而消息队列是单向引入中间载体的通信
- 架构方面: 消息队列需要把消息存储起来,RPC 则没有这个要求,因为前面也说了 RPC 是双向直接网络通讯。
- 请求的处理时效性方面:通过 RPC 发出的调用一般会立即被处理,存放在消息队列中的消息并不一定会立即被处理。
吸口小白
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于