RabbitMQ
1. 什么是MQ?
MQ 通常指的是“消息队列”(Message Queue),它是一种在计算机科学中用于处理消息的中间件。消息队列允许不同应用程序或组件之间进行异步通信,通过将消息存储在队列中来实现。这种方式有助于解耦系统组件,提高系统的可扩展性和可靠性。
一般用来解决持久性存储,应用解耦 ,异步消息 ,流量削峰 等问题,实现高性能,高可用,可伸缩和最终一致性架构。
2. MQ能做什么?
2.1流量削峰填谷
在当前互联网的业务场景下,比如商品秒杀 ,在较短时间内,瞬时涌入大量请求,这个时候系统资源可能会耗尽,造成服务器瘫痪。这样就可以使用消息队列来缓冲瞬时流量,通过一个队列在一端承接瞬时的流量洪峰,在另一端平滑地将消息推送出去。
例如下图中,系统每秒只能处理5000个请求,但是某个瞬时请求达到10000每秒,这个时候将导致系统并发过高,甚至系统奔溃。
使用了MQ之后,限制消费消息的速度为5000每秒,这样一来,高峰期产生的数据势必会被积压在MQ中,高峰就被“削”掉了,但是因为消息积压,在高峰期过后的一段时间内,消费消息的速度还是会维持在5000每秒,直到消费完积压的消息,这就叫做“填谷”。
2.2 应用解耦
以电商应用为例,应用中有订单系统、库存系统、物流系统、支付系统。用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障,都会造成下单操作异常。
当转变成基于消息队列的方式后,系统间调用的问题会减少很多,比如物流系统因为发生故障,需要几分钟来修复。在这几分钟的时间里,物流系统要处理的内存被缓存在消息队列中,用户的下单操作可以正常完成。当物流系统恢复后,继续处理订单信息即可,中单用户感受不到物流系统的故障,提升系统的可用性。
2.3 异步处理
有些服务间调用是异步的,例如 服务A 调用服务 B,服务B 需要花费很长时间执行,但是 服务A 需要知道 服务B 什么时候可以执行完。一般有两种方式,服务A 过一段时间去调用 服务B 的查询 api 查询。或者 服务A 提供一个回调接口, 服务B 执行完之后调用 api 通知 服务A 服务。
这两种方式都不是很优雅,使用MQ,可以很方便解决这个问题,服务A 调用服务 B 服务后,只需要监听 服务B 处理完成的消息,当 服务B 处理完成后,会发送一条消息给MQ,MQ 会将此消息转发给 服务A 。这样 服务A 既不用循环调用 B 的查询 api,也不用提供回调接口。同样服务B 也不用做这些操作。服务A还能及时的得到异步处理成功的消息。
明白了,我将对您提供的内容进行纠正,并调整标题层级以提高清晰度。以下是优化和纠正后的内容:
3. MQ消息通信模型
消息队列(MQ)中的通信模型主要有两种实现方式:JMS 和 AMQP。
3.1 JMS
Java Message Service (JMS) 是Java平台中用于消息传递的API,它提供了一种方式来发送和接收消息。JMS 允许基于Java EE(Java Platform, Enterprise Edition)的应用程序组件创建、发送、接收和读取消息。它旨在促进分布式计算环境中的通信,特别是在异步和解耦的通信场景中。
3.1.1 JMS提供的两种消息模型
点对点(Point-to-Point, P2P):在这种模型中,消息被发送到一个队列,并且只能被一个消费者接收。这种模型适用于需要确保每个消息仅被处理一次的场景。
发布/订阅(Publish/Subscribe, Pub/Sub):在这种模型中,消息被发送到一个主题,所有订阅了该主题的消费者都将接收到消息。这种模型适合于广播消息,其中消息可以被多个消费者并发处理。
3.2 AMQP
AMQP(Advanced Message Queuing Protocol)是一种提供高度可靠的异步消息传输的网络协议。它被设计用来满足对商业级消息服务的需求,包括多种消息传递模式、统一的消息格式、以及对消息传递的精细控制。
3.2.1 AMQP特性
- 异步消息传递:AMQP 支持异步消息传递,允许消息在发送者和接收者之间独立传输,无需双方同时在线。
- 多种消息传递模式:AMQP 支持点对点(P2P)和发布/订阅(Pub/Sub)等多种消息传递模式。
- 消息持久性:AMQP 允许消息在传输过程中被持久化存储,确保即使在发生故障的情况下也不会丢失消息。
- 事务性消息传递:AMQP 支持事务,使得消息的发送和接收可以在一个原子操作中完成,保证了消息传递的一致性。
- 路由功能:AMQP 包括复杂的路由功能,允许消息通过交换器(exchanges)和队列(queues)进行路由,以满足不同的分发需求。
- 交换器(Exchanges):AMQP 中的交换器用于接收来自发送者的消息,并根据路由规则将消息路由到一个或多个队列。
- 绑定(Bindings):绑定是交换器和队列之间的关联,它定义了消息如何从交换器路由到队列。
- 消息属性:AMQP 消息可以包含多种属性,如优先级、延迟、过期时间等,这些属性为消息传递提供了额外的控制。
- 多协议支持:AMQP 0-9-1 和 AMQP 1.0 是两个不同的版本,它们提供了不同的特性和性能优化。
- 跨平台和语言无关性:AMQP 是一个与语言无关的协议,可以在多种编程语言和环境中实现。
- 安全性:AMQP 支持多种安全机制,包括访问控制、SSL/TLS 加密和SASL认证。
- 可扩展性:AMQP 支持大量消息并发处理,适合于高吞吐量和大规模分布式系统。
- 灵活的消息路由:通过使用不同的交换器类型(如direct、topic、fanout、headers)和绑定规则,可以实现复杂的路由逻辑。
- 消息选择:AMQP 允许基于消息内容和属性进行选择性路由。
- 集群支持:AMQP 支持集群部署,提供高可用性和负载均衡。
3.3 AMQP与JMS的主要区别
协议与API:
- AMQP:是一个基于协议的标准,它定义了客户端与消息代理(messaging broker)之间的网络通信方式。AMQP 是独立于语言和平台的,这意味着它可以在不同的编程语言和环境中实现。
- JMS:是一个Java平台的API,提供了一种在Java应用程序中发送和接收消息的方法。JMS 是特定于Java的,它定义了一组Java接口和类,用于访问消息服务。
互操作性:
- AMQP:由于它是一个协议,因此不同语言和平台的客户端可以实现AMQP标准,从而实现互操作性。例如,一个用Python编写的客户端可以与一个用.NET编写的客户端通过AMQP协议进行通信。
- JMS:虽然JMS定义了一组标准的接口,但它仅限于Java环境。不过,JMS 2.0引入了对跨语言客户端的更好支持,但这种支持通常不如AMQP广泛。
消息模型:
- AMQP:支持多种消息传递模型,包括点对点和发布/订阅模型,以及更复杂的路由和分发机制。
- JMS:同样支持点对点和发布/订阅模型,但它的实现通常依赖于底层的消息代理系统。
特性和功能:
- AMQP:提供了丰富的特性,如消息持久性、事务、优先级、消息选择、安全性(包括SSL/TLS支持)和广泛的路由选项。
- JMS:提供了一组较为有限的特性集,尽管在JMS 2.0中增加了对消息选择、异步消息处理和更灵活的消息监听器的支持。
实现:
- AMQP:有多个开源和商业实现,如RabbitMQ、Apache Qpid等。
- JMS:通常作为Java EE服务器的一部分提供,如WebLogic、WebSphere和ActiveMQ等。
客户端库:
- AMQP:客户端库需要实现AMQP协议规范,因此可能在不同库之间存在一些差异。
- JMS:客户端库需要遵循JMS API,这提供了一致的编程模型,但可能在不同实现之间存在一些细微的行为差异。
性能:
- AMQP:由于它是一个协议,性能可能取决于具体的实现和网络条件。AMQP 0-9-1和AMQP 1.0是两个不同的版本,后者在某些方面提供了改进的性能。
- JMS:性能也取决于实现,但JMS通常与Java EE服务器紧密集成,这可能提供优化的性能。