一、消息队列概述
消息队列是一种先进先出的队列型数据结构,用于在传输过程中保存消息的容器。它允许多个进程间按照消息传递的方式进行通信和数据交换,有效地解决了早期UNIX通信机制的一些限制,并在现代分布式系统中扮演着中间件的角色。
1.1、消息队列的基本概念
消息队列(Message Queue)是指在计算机系统中,用于存储、传输和处理消息的技术和系统。消息队列可以实现分布式系统之间的通信和数据交换,提高系统的可扩展性、可靠性和灵活性。
- 生产者(Producer):将消息发送到消息队列的应用程序或服务。
- 消息队列(Message Queue):用于存储和传输消息的中间件系统。
- 消费者(Consumer):从消息队列中消费消息的应用程序或服务。
- 消息(Message):包含数据、meta数据和其他信息的数据结构。
- topic(Topic):消息队列中的一个逻辑概念,用于组织和分配消息。
- queue(Queue):消息队列中的一个物理概念,用于存储和传输消息。
- routingKey(Routing Key):用于确定消息的路由和分配的关键信息。
- delivery(投递):消息队列中消息的投递方式,可以选择使用事务机制、ack机制等。
- 阻塞和非阻塞操作:当队列为空时,尝试从队列中读取消息的操作可能会阻塞,直到有新的消息可用。同样,如果队列已满,尝试向队列中添加消息的操作也可能阻塞,直到有足够的空间可用。非阻塞操作则是立即返回结果,无论是否成功。
- 持久性和可靠性:消息队列通常提供持久性机制,以确保即使在系统崩溃后,消息也不会丢失。此外,一些消息队列还支持消息确认机制,以确保消息已被正确处理。
- 优先级:某些消息队列允许设置消息的优先级,以便高优先级的消息可以被优先处理。
- 并发控制:消息队列通常提供并发控制机制,以确保多个生产者和消费者能够安全地访问队列,避免竞争条件和死锁等问题。
- 消息过滤:某些消息队列允许生产者指定过滤器,以决定哪些消息应该被发送到队列中。这可以帮助减少不必要的消息传输和处理。
- 消息过期:某些消息队列支持消息过期机制,即在一定时间后自动删除未被处理的消息。这有助于防止积压过多无用的消息。
1.2、消息队列的功能
- 消息存储:消息队列可以存储大量的消息数据,提供了消息的持久性和可靠性。
- 消息路由:消息队列可以根据消息的 routingKey 来路由消息到不同的消费者,提高消息的传递效率和可靠性。
- 消息队列:消息队列可以实现消息的队列,提供了消息的先进先出(FIFO)的顺序传递。
- 消息消费:消息队列可以提供消息的消费机制,允许消费者从队列中消费消息。
- 消息重试:消息队列可以提供消息的重试机制,允许消费者在消息消费失败后重试消息的消费。
- 消息补偿:消息队列可以提供消息的补偿机制,允许消费者在消息消费失败后补偿消息的消费。
- 消息ack机制:消息队列可以提供消息的ack机制,允许消费者确认消息的消费,提高消息的可靠性和可用性。
- 消息事务机制:消息队列可以提供消息的事务机制,允许消费者在消息消费成功后提交事务,提高消息的可靠性和可用性。
- 消息监控:消息队列可以提供消息的监控机制,允许管理员监控消息队列的状态和性能,提高消息队列的可靠性和可用性。
- 消息安全:消息队列可以提供消息的安全机制,允许管理员控制消息队列的访问权限和安全性,提高消息队列的可靠性和可用性。
1.3、消息队列的技术细节
- 消息存储:
- 消息队列使用的存储方式:内存、磁盘、数据库、分布式存储等。
- 消息队列存储的消息格式:JSON、XML、BSON、Avro等。
- 消息传递:
- 消息队列使用的传递协议:TCP/IP、MQTT、AMQP、STOMP等。
- 消息队列传递的消息大小限制: byte、KB、MB等。
- 消息路由:
- 消息队列使用的路由算法:Topic-based routing、Queue-based routing、Header-based routing等。
- 消息队列路由的 key:routingKey、header、attribute等。
- 消息消费:
- 消息队列使用的消费机制:pull-based、push-based、queue-based等。
- 消息队列消费的消息处理方式:ACK、NACK、RETRY等。
- 消息重试:
- 消息队列使用的重试机制: exponential backoff、fixed backoff、custom backoff等。
- 消息队列重试的消息处理方式:RETRY、REQUEUE、ABORT等。
- 消息持久性:
- 消息队列使用的持久性机制: persistent queue、durable queue、transient queue等。
- 消息队列持久性的消息存储方式:磁盘、数据库、分布式存储等。
- 消息安全:
- 消息队列使用的安全机制:身份验证、加密、授权等。
- 消息队列安全的消息传递方式:TLS、SSL、AMQP-over-TLS等。
- 消息监控:
- 消息队列使用的监控机制: metrics、logs、tracing等。
- 消息队列监控的消息传递方式: metrics、logs、tracing等。
- 消息事务:
- 消息队列使用的事务机制:atomic transaction、two-phase commit、queue-based transaction等。
- 消息队列事务的消息处理方式:ACK、NACK、RETRY等。
- 消息队列的高可用性:
- 消息队列使用的高可用性机制:replication、load balancing、failover等。
- 消息队列高可用性的消息传递方式:replication、load balancing、failover等。
1.4、分布式系统中的角色
- 中间件角色:在大型分布式系统中,消息队列作为中间件,解决应用解耦、异步处理、流量削峰等问题,实现高性能、高可用、可伸缩的系统架构。常见的消息队列产品有ActiveMQ、RabbitMQ、Kafka、RocketMQ等。
- 网络角色:在Microsoft的消息处理技术中,“消息队列网络”是一组可以互相发送消息的计算机,不同计算机在确保消息顺利处理的过程中扮演不同角色。
1.5、应用场景举例
- 异步处理案例:在电商下单系统中,订单生成、积分赠送、发送通知等操作可以异步并行处理,从而显著缩短用户的总等待时间。
- 流量控制案例:在秒杀活动中,瞬时大流量可以被缓慢消费,保护后端系统不因瞬时高峰而崩溃。
- 解耦案例:订单系统只需发布订单消息到队列,其他如积分系统订阅该消息进行处理,实现了业务解耦。
二、消息队列产品
2.1、ActiveMQ
-
主要特点
- 支持多种消息协议:ActiveMQ支持多种消息协议,包括STOMP、AMQP、MQTT、OpenWire等。
- 支持多种消息存储:ActiveMQ支持多种消息存储方式,包括内存、磁盘、数据库等。
- 高可用性:ActiveMQ提供了高可用性机制,包括replication、load balancing、failover等。
- 可扩展性:ActiveMQ支持水平扩展,能够在多个服务器之间分布式部署。
- 支持多种语言:ActiveMQ支持多种语言,包括Java、C++、Python、Ruby等。
-
主要组件
- Broker:ActiveMQ的核心组件,负责路由和分配消息。
- Producer:生产者,负责生产消息。
- Consumer:消费者,负责消费消息。
- Queue:消息队列,负责存储和传输消息。
- Topic:消息主题,负责组织和分配消息。
-
主要功能
- 消息队列:ActiveMQ提供了消息队列功能,允许生产者生产消息,消费者消费消息。
- 消息代理:ActiveMQ提供了消息代理功能,允许生产者生产消息,消息代理将消息路由到消费者。
- 消息路由:ActiveMQ提供了消息路由功能,允许生产者生产消息,消息路由将消息路由到消费者。
- 消息转换:ActiveMQ提供了消息转换功能,允许生产者生产消息,消息转换将消息转换为消费者所需的格式。
- 消息持久性:ActiveMQ提供了消息持久性功能,允许生产者生产消息,消息持久性将消息存储在磁盘或数据库中。
-
使用场景
- 企业消息队列:ActiveMQ可以用作企业消息队列,用于实现企业应用程序之间的消息传递。
- IoT 消息队列:ActiveMQ可以用作 IoT 消息队列,用于实现 IoT 设备之间的消息传递。
- 大数据处理:ActiveMQ可以用作大数据处理,用于实现数据处理和分析。
- 实时数据处理:ActiveMQ可以用作实时数据处理,用于实现实时数据处理和分析。
2.2、RabbitMQ
- 主要特点
- 支持多种消息协议:RabbitMQ支持多种消息协议,包括AMQP、STOMP、MQTT、OpenWire等。
- 高可用性:RabbitMQ提供了高可用性机制,包括replication、load balancing、failover等。
- 可扩展性:RabbitMQ支持水平扩展,能够在多个服务器之间分布式部署。
- 支持多种语言:RabbitMQ支持多种语言,包括Java、C++、Python、Ruby等。
- 可靠性:RabbitMQ提供了可靠性机制,包括消息持久性、消息确认、消息重试等。
- 主要组件
- Broker:RabbitMQ的核心组件,负责路由和分配消息。
- Producer:生产者,负责生产消息。
- Consumer:消费者,负责消费消息。
- Queue:消息队列,负责存储和传输消息。
- Exchange:消息交换,负责路由和分配消息。
- 主要功能
- 消息队列:RabbitMQ提供了消息队列功能,允许生产者生产消息,消费者消费消息。
- 消息代理:RabbitMQ提供了消息代理功能,允许生产者生产消息,消息代理将消息路由到消费者。
- 消息路由:RabbitMQ提供了消息路由功能,允许生产者生产消息,消息路由将消息路由到消费者。
- 消息转换:RabbitMQ提供了消息转换功能,允许生产者生产消息,消息转换将消息转换为消费者所需的格式。
- 消息持久性:RabbitMQ提供了消息持久性功能,允许生产者生产消息,消息持久性将消息存储在磁盘或数据库中。
2.3、Kafka
-
主要特点
- 高性能:Kafka具有高性能,可以处理高达数十万个消息的流数据。
- 可扩展性:Kafka支持水平扩展,可以在多个服务器之间分布式部署。
- 可靠性:Kafka提供了可靠性机制,包括消息持久性、消息确认、消息重试等。
- 流数据处理:Kafka提供了流数据处理功能,允许用户实时处理和分析数据。
- 分布式存储:Kafka提供了分布式存储功能,允许用户在多个服务器之间分布式存储数据。
-
主要组件
- Broker:Kafka的核心组件,负责存储和传输消息。
- Producer:生产者,负责生产消息。
- Consumer:消费者,负责消费消息。
- Topic:消息主题,负责组织和分配消息。
- Partition:消息分区,负责将消息分配到不同的broker上。
-
主要功能
- 消息队列:Kafka提供了消息队列功能,允许生产者生产消息,消费者消费消息。
- 流数据处理:Kafka提供了流数据处理功能,允许用户实时处理和分析数据。
- 分布式存储:Kafka提供了分布式存储功能,允许用户在多个服务器之间分布式存储数据。
- 消息持久性:Kafka提供了消息持久性功能,允许用户将消息存储在磁disk或数据库中。
- 消息确认:Kafka提供了消息确认功能,允许用户确认消息的收发。
2.4、RocketMQ
- 主要特点
- 高性能:RocketMQ具有高性能,可以处理高达数十万个消息的流数据。
- 可扩展性:RocketMQ支持水平扩展,可以在多个服务器之间分布式部署。
- 可靠性:RocketMQ提供了可靠性机制,包括消息持久性、消息确认、消息重试等。
- 流数据处理:RocketMQ提供了流数据处理功能,允许用户实时处理和分析数据。
- 分布式存储:RocketMQ提供了分布式存储功能,允许用户在多个服务器之间分布式存储数据。
- 主要组件
- NameServer:RocketMQ的核心组件,负责存储和管理消息队列和消费者信息。
- Broker:RocketMQ的核心组件,负责存储和传输消息。
- Producer:生产者,负责生产消息。
- Consumer:消费者,负责消费消息。
- Topic:消息主题,负责组织和分配消息。
- Message:消息,负责存储和传输消息。
- 主要功能
- 消息队列:RocketMQ提供了消息队列功能,允许生产者生产消息,消费者消费消息。
- 流数据处理:RocketMQ提供了流数据处理功能,允许用户实时处理和分析数据。
- 分布式存储:RocketMQ提供了分布式存储功能,允许用户在多个服务器之间分布式存储数据。
- 消息持久性:RocketMQ提供了消息持久性功能,允许用户将消息存储在磁disk或数据库中。
- 消息确认:RocketMQ提供了消息确认功能,允许用户确认消息的收发。
2.5、ZeroMQ
- 主要特点
- 高性能:ZeroMQ具有高性能,可以处理高达数十万个消息的流数据。
- 可扩展性:ZeroMQ支持水平扩展,可以在多个服务器之间分布式部署。
- 可靠性:ZeroMQ提供了可靠性机制,包括消息持久性、消息确认、消息重试等。
- 流数据处理:ZeroMQ提供了流数据处理功能,允许用户实时处理和分析数据。
- 分布式存储:ZeroMQ提供了分布式存储功能,允许用户在多个服务器之间分布式存储数据。
- 主要组件
- Socket:ZeroMQ的核心组件,负责存储和传输消息。
- Context:ZeroMQ的核心组件,负责管理 Socket 和消息队列。
- Message:消息,负责存储和传输消息。
- Router:路由器,负责路由消息到不同的 Socket。
- Dealer:经销商,负责处理消息的发送和接收。
三、消息队列安装
3.1、ActiveMQ安装
3.1.1、下载JDK的rpm包
[root@iZbp129gypomkv7w7deqpqZ ~]# wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm
--2024-08-13 14:35:45-- https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm
Resolving download.oracle.com (download.oracle.com)... 23.1.244.118
Connecting to download.oracle.com (download.oracle.com)|23.1.244.118|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 182484307 (174M) [application/x-redhat-package-manager]
Saving to: ‘jdk-17_linux-x64_bin.rpm’
100%[================================================================================================================================================>] 182,484,307 8.77MB/s in 20s
2024-08-13 14:36:06 (8.50 MB/s) - ‘jdk-17_linux-x64_bin.rpm’ saved [182484307/182484307]
[root@iZbp129gypomkv7w7deqpqZ ~]# ls
jdk-17_linux-x64_bin.rpm
[root@iZbp129gypomkv7w7deqpqZ ~]# rpm -ivh jdk-17_linux-x64_bin.rpm
warning: jdk-17_linux-x64_bin.rpm: Header V3 RSA/SHA256 Signature, key ID ad986da3: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:jdk-17-2000:17.0.12-8 ################################# [100%]
[root@iZbp129gypomkv7w7deqpqZ ~]# java -version
java version "17.0.12" 2024-07-16 LTS
Java(TM) SE Runtime Environment (build 17.0.12+8-LTS-286)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.12+8-LTS-286, mixed mode, sharing)
3.1.2、添加环境变量
[root@iZbp129gypomkv7w7deqpqZ /]# vi /etc/profile
export JAVA_HOME=/usr/lib/jvm/jdk-17.0.12-oracle-x64
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:/usr/lib/jvm/jdk-17.0.12-oracle-x64/jre/lib/rt.jar:/usr/lib/jvm/jdk-17.0.12-oracle-x64/lib/dt.jar:/usr/lib/jvm/jdk-17.0.12-oracle-x64/lib/tools.jar
3.1.4、下载ActiveMQ
[root@iZbp129gypomkv7w7deqpqZ /]# wget https://mirrors.aliyun.com/apache/activemq/5.18.5/apache-activemq-5.18.5-bin.tar.gz
3.1.5、解压ActiveMQ包
[root@iZbp129gypomkv7w7deqpqZ /]# tar -zxf apache-activemq-5.18.5-bin.tar.gz
[root@iZbp129gypomkv7w7deqpqZ /]# mv apache-activemq-5.18.5 activemq
3.1.6、创建 systemd 服务单元
[root@iZbp129gypomkv7w7deqpqZ /]# vi /usr/lib/systemd/system/activemq.service
[root@iZbp129gypomkv7w7deqpqZ /]# cat /usr/lib/systemd/system/activemq.service
[Unit]
Description=ActiveMQ message queue
After=network.target
[Service]
PIDFile=/root/activemq/bin/activemq.pid
ExecStart=/root/activemq/bin/activemq start
ExecStop=/root/activemq/bin/activemq start
User=root
Group=root
Restart=always
RestartSec=9
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=activemq
[Install]
WantedBy=multi-user.target
3.1.7、添加变量
[root@iZbp129gypomkv7w7deqpqZ /]# vi /etc/profile
export CLASSPATH=$CLASSPATH:/usr/share/java/activemq-all-5.18.5.jar
[root@iZbp129gypomkv7w7deqpqZ /]# source /etc/profile
3.1.8、启动activemq
[root@iZbp129gypomkv7w7deqpqZ /]# systemctl start activemq
[root@iZbp129gypomkv7w7deqpqZ /]# systemctl status activemq
3.2、RabbitMQ安装
3.2.1、添加Erlang环境
- 安装依赖项
[root@iZbp129gypomkv7w7deqpqZ ~]# yum install -y gcc make perl openssl-devel ncurses-devel epel-release
- 添加Erlang仓库
[root@iZbp129gypomkv7w7deqpqZ ~]# wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
[root@iZbp129gypomkv7w7deqpqZ ~]# rpm -ivh erlang-solutions-1.0-1.noarch.rpm
- 安装Erlang
[root@iZbp129gypomkv7w7deqpqZ ~]# yum install -y erlang
- 验证安装
[root@iZbp129gypomkv7w7deqpqZ ~]# erl -version
Erlang (SMP,ASYNC_THREADS) (BEAM) emulator version 12.3.2.1
3.2.2、安装RabbitMQ
- 下载RabbitMQ RPM包
[root@iZbp129gypomkv7w7deqpqZ ~]# wget -O rabbitmq-server-3.9.14-1.el7.noarch.rpm https://packagecloud.io/rabbitmq/rabbitmq-server/packages/el/7/rabbitmq-server-3.9.14-1.el7.noarch.rpm/download
- 安装RabbitMQ
[root@iZbp129gypomkv7w7deqpqZ ~]# yum localinstall -y rabbitmq-server-3.9.14-1.el7.noarch.rpm
- 启动
[root@iZbp129gypomkv7w7deqpqZ ~]# systemctl start rabbitmq-server
[root@iZbp129gypomkv7w7deqpqZ ~]# systemctl status rabbitmq-server
● rabbitmq-server.service - RabbitMQ broker
Loaded: loaded (/usr/lib/systemd/system/rabbitmq-server.service; disabled; vendor preset: disabled)
Active: active (running) since Wed 2024-08-14 11:05:56 CST; 25s ago
Main PID: 29997 (beam.smp)
CGroup: /system.slice/rabbitmq-server.service
├─29997 /usr/lib64/erlang/erts-12.3.2.1/bin/beam.smp -W w -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 30 -P 1048576 -t 5000000 -stbt db -zdbbl 128000 -sb...
├─30014 erl_child_setup 32768
├─30046 /usr/lib64/erlang/erts-12.3.2.1/bin/epmd -daemon
├─30069 inet_gethost 4
└─30070 inet_gethost 4
Aug 14 11:05:52 iZbp129gypomkv7w7deqpqZ rabbitmq-server[29997]: Doc guides: https://rabbitmq.com/documentation.html
Aug 14 11:05:52 iZbp129gypomkv7w7deqpqZ rabbitmq-server[29997]: Support: https://rabbitmq.com/contact.html
Aug 14 11:05:52 iZbp129gypomkv7w7deqpqZ rabbitmq-server[29997]: Tutorials: https://rabbitmq.com/getstarted.html
Aug 14 11:05:52 iZbp129gypomkv7w7deqpqZ rabbitmq-server[29997]: Monitoring: https://rabbitmq.com/monitoring.html
Aug 14 11:05:52 iZbp129gypomkv7w7deqpqZ rabbitmq-server[29997]: Logs: /var/log/rabbitmq/rabbit@iZbp129gypomkv7w7deqpqZ.log
Aug 14 11:05:52 iZbp129gypomkv7w7deqpqZ rabbitmq-server[29997]: /var/log/rabbitmq/rabbit@iZbp129gypomkv7w7deqpqZ_upgrade.log
Aug 14 11:05:52 iZbp129gypomkv7w7deqpqZ rabbitmq-server[29997]: <stdout>
Aug 14 11:05:53 iZbp129gypomkv7w7deqpqZ rabbitmq-server[29997]: Config file(s): (none)
Aug 14 11:05:56 iZbp129gypomkv7w7deqpqZ rabbitmq-server[29997]: Starting broker... completed with 0 plugins.
Aug 14 11:05:56 iZbp129gypomkv7w7deqpqZ systemd[1]: Started RabbitMQ broker.
3.3、Kafka安装
Kafka需要jdk环境,安装jdk环境可参考ActiveMQ
- 下载并解压Kafka
[root@iZbp129gypomkv7w7deqpqZ ~]# wget https://downloads.apache.org/kafka/3.8.0/kafka_2.13-3.8.0.tgz
[root@iZbp129gypomkv7w7deqpqZ ~]# tar -xzf kafka_2.13-3.8.0.tgz
- 启动Kafka
[root@iZbp129gypomkv7w7deqpqZ /]# /opt/kafka/bin/zookeeper-server-start.sh -daemon /opt/kafka/config/zookeeper.properties
[root@iZbp129gypomkv7w7deqpqZ /]# /opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties
3.4、RocketMQ安装
3.4.1、下载tar包
[root@iZbp129gypomkv7w7deqpqZ /]# curl -L -o rocketmq.tar.gz "https://rocketmq.apache.org/download/rocketmq-all-x.x.x-bin-release.tar.gz"
[root@iZbp129gypomkv7w7deqpqZ /]# tar -xzf rocketmq.tar.gz