Java消息队列详解(看这篇就够了)

Java消息队列详解(看这篇就够了)-mikechen

什么是消息队列?

消息队列就是Message Queue,本质就是一个保存消息的队列。

如下图所示:

Java消息队列详解(看这篇就够了)-mikechen

消息队列通常由一个中间件组件提供,它作为消息的中转站,负责接收、存储和转发消息。发送者将消息发送到消息队列中,接收者则从队列中获取消息进行处理。

 

消息队列的应用场景

消息队列的应用场景,主要包含:异步、解耦、削峰等,如下图所示:

Java消息队列详解(看这篇就够了)-mikechen

1.异步通信

发送方和接收方不需要直接进行实时的通信,而是通过消息队列中间件进行异步的消息传递。

2.解耦和解偶

消息队列可以将发送方和接收方解耦,使得它们可以独立地进行开发、部署和维护。

3.削峰填谷

消息队列可以缓冲和平衡消息的流量,当发送方发送大量的消息时,消息队列可以将消息暂存起来,并按照接收方的处理能力逐渐进行消费。

4.可靠性和持久化

消息队列通常具有可靠的消息传递机制,可以确保消息在发送和接收过程中的可靠性。

一些消息队列还支持消息的持久化,即将消息存储到持久化存储介质中,以防止消息丢失。

 

消息队列原理

消息队列中间件的原理,如下图所示:

Java消息队列详解(看这篇就够了)-mikechen

主要会包含:生产者、Broker、消费者等。

 

1.生产者

生产者,主要负责发送消息,生产者将消息发送到消息队列。

生产者根据业务逻辑生成消息,这些消息包含各种数据,例如:用户请求、系统事件、日志记录…等。

消费的类型:消息可以是文本、JSON、XML、或其他格式的……数据。

 

2.消息存储(Broker)

Broker:主要负责接收、存储和转发消息,通常具有持久化机制,确保消息不丢失。

Broker还将消息分发给合适的消费者,可以通过轮询、负载均衡…等方式进行调度。

以及,Broker需要等待消费者确认消息已被成功处理,然后才会将该消息从队列中移除,确保消息不被丢失。

 

3.消费者接收消息

消费者是消息的接收者和处理者,它从消息队列中读取消息,并执行相应的业务逻辑。

消费者从Broker中读取消息,可以是主动拉取(Pull)、或被动推送(Push)模式。

处理完成后,消费者需要向Broker发送确认信息,通知Broker该消息已被成功处理。

如果没有确认,消息可以重新投递,确保处理的可靠性。

 

消息队列类型

消息队列主要包含两种:一个是点对点,一个是发布订阅模型。

1.点对点

Java消息队列详解(看这篇就够了)-mikechen

点对点的特点:每个消息只有一个消费者(Consumer),即一旦被消费,消息就不再在消息队列中。

2.发布订阅

发布订阅模型包含三个角色:主题(Topic)、发布者(Publisher)、订阅者(Subscriber)。

如下图所示:

Java消息队列详解(看这篇就够了)-mikechen

 

 

消息协议

消息协议是消息队列中间件的重要组成部分,决定了消息的格式、传输方式、和通信规则。

1.JMS

Java Message Service(JMS)是Java平台上用于消息通信的标准API,提供了一种通用的方式来创建、发送、接收和读取消息。

比如:老牌的ActiveMQ,就是典型的JMS实现。

 

2.AMQP

AMQP,全程是“Advanced Message Queuing Protocol”,是一种开放标准的应用层协议。

特点是:

 

  • AMQP协议设计为与平台无关,支持多种编程语言;
  • 通过交换机(Exchange),实现复杂的消息路由机制,包括:直接交换(Direct)、主题交换(Topic)…等。
  • 支持消息确认、持久化、事务、死信队列…等功能,确保消息的可靠传递和处理。

rabbitmq,就是典型的AMQP的实现

 

3.MQTT

Message Queuing Telemetry Transport(MQTT),是一种轻量级的发布/订阅消息协议,设计用于低带宽、高延迟、或不可靠的网络环境。

 

消息队列有哪些

常见的消息队列有:ActiveMQ、RocketMQ、Kafka、Pulsar、RabbitMQ等等。

如下图所示:

Java消息队列详解(看这篇就够了)-mikechen

  1. RabbitMQ:RabbitMQ是一个开源的消息队列系统,它实现了AMQP(Advanced Message Queuing Protocol)协议,并提供了丰富的功能,如消息持久化、消息确认、灵活的路由和绑定等。
  2. Apache Kafka:Apache Kafka是一个分布式的流式平台,它可以处理大规模的实时数据流。Kafka基于发布-订阅模型,具有高吞吐量和持久性,适用于处理大量实时数据的场景。
  3. ActiveMQ:ActiveMQ是Apache基金会的一个开源消息中间件,支持JMS(Java Message Service)规范。它提供了多种通信模式,如点对点(P2P)和发布-订阅(Pub/Sub),并具有可靠性、可扩展性和高可用性。
  4. Redis:Redis是一个内存数据库,但也可以用作消息队列。Redis提供了List、Pub/Sub等数据结构和命令,可以实现简单的消息队列功能。
  5. Apache Pulsar:Apache Pulsar是一个开源的分布式消息和流处理平台,具有高性能、可扩展性和持久化特性。Pulsar支持多租户、多数据中心部署和动态扩展,适用于大规模和复杂的消息队列和流处理场景。

 

消息队列选型

消息队列 主要特点 优点 缺点 适用场景
ActiveMQ 基于JMS,多协议支持 成熟稳定,功能丰富,多语言支持 性能有限,管理复杂 中小规模企业应用,需要JMS功能支持的场景
RocketMQ 高性能,强事务消息,分布式架构 高吞吐量低延迟,分布式,强一致性 社区支持少,运维复杂 互联网和金融系统,高吞吐量和严格一致性场景
Kafka 高吞吐量,日志式存储,分区和复制 高性能,可扩展,生态系统丰富 延迟较高,不支持事务消息 大数据处理,实时流处理,需要高吞吐和扩展性场景
Pulsar 多租户,分层架构,原生流处理 高性能,持久化存储,灵活扩展 学习曲线陡,社区和生态系统较小 云环境和企业系统,多租户和高性能消息传递场景
RabbitMQ 基于AMQP,灵活路由,丰富插件 易于使用,功能丰富,多语言支持 性能有限,集群管理复杂 中小规模企业应用,复杂路由和消息确认场景
评论交流
    说说你的看法