Linux消息队列


一、消息队列概述

消息队列是一种先进先出的队列型数据结构,用于在传输过程中保存消息的容器。它允许多个进程间按照消息传递的方式进行通信和数据交换,有效地解决了早期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
  • 26
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十一的学习笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值