消息队列简介及 RabbitMQ 的使用方法

音讯行列是最陈旧的中间件之一,从体系之间有通讯需求开端,就自然发生了音讯行列。假如你还没有用过音讯行列,那是时分好好学习一下了。本文告诉什么是音讯行列,为什么需求音讯行列,常见的音讯行列有哪些, RabbitMQ 的布置和运用。

什么是音讯行列

音讯行列拆开了看,就是音讯 + 行列,音讯是什么?其实就是程序之间通讯所用到的数据,音讯从生产者那里发生,进入行列后,装置设计好的规矩出队,由顾客消费。仅此而已。

为什么需求音讯行列

音讯行列,最重要的是行列,能够幻想一下没有行列的场景,你去银行办业务的时分,咱们都不排队的场景,咱们都堆在一起,个子小没力气的底子办不了业务。

假如没有音讯行列,你的体系将严峻耦合,在升级维护的时分牵一发而动全身。

假如没有音讯行列,你的体系的许多功能都是同步的,同步意味着前面的事件完成后,才能够进行后续的操作,前端用户的会觉得卡顿,体会很差。

假如没有音讯行列,web 体系突然面临高并发的访问请求,可能会崩溃。

有了音讯行列,体系解耦、异步通讯、流量削峰、推迟通知、最终一致性保证、顺序音讯、流式处理等需求都能够轻松解决。

常见的音讯行列

比较常见的音讯行列产品主要有 ActiveMQ、RabbitMQ、ZeroMQ、Kafka、RocketMQ 等。

ActiveMQ

Apache ActiveMQ 是 Apache 软件基金会所研发的开放源码音讯中间件;因为 ActiveMQ 是一个纯Java程序,因而只需求操作体系支撑 Java 虚拟机,ActiveMQ 便可履行。

  • 支撑Java音讯服务 (JMS) 1.1 版本
  • Spring Framework
  • 集群 (Clustering)
  • 协议支撑包括:OpenWire、REST、STOMP、WS-Notification、MQTT、XMPP 以及 AMQP

RabbitMQ

RabbitMQ 完成了高档音讯行列协议(AMQP)的开源音讯代理软件(亦称面向音讯的中间件)。RabbitMQ 服务器是用高性能、健壮以及可弹性性知名的 Erlang 言语编写的,支撑一切干流的操作体系如 Linux,Windows,MacOS。客户端支撑一切主要的编程言语。

  • 可弹性性:集群服务
  • 音讯耐久化:从内存耐久化音讯到硬盘,再从硬盘加载到内存

ZeroMQ ZeroMQ(也拼写作 0MQ 或 ZMQ )是一个为可弹性的分布式或并发运用程序设计的高性能异步音讯库。它供给一个音讯行列, 但是与面向音讯的中间件不同,ZeroMQ 的运转不需求专门的音讯代理(message broker)。该库设计成常见的套接字风格的API。

ZeroMQ 是由 iMatix 公司和很多贡献者组成的社群共同开发的。ZeroQ 经过许多第三方软件支撑大部分流行的编程言语,从 Java 和Python 到 Erlang 和 Haskell。

Kafka

Kafka 是由 Apache 软件基金会开发的一个开源流处理渠道,由 Scala 和 Java 编写。该项意图目标是为处理实时数据供给一个统一、高吞吐、低推迟的渠道。其耐久化层本质上是一个“按照分布式业务日志架构的大规模发布/订阅音讯行列”,这使它作为企业级基础设施来处理流式数据非常有价值。此外,Kafka 能够经过 Kafka Connect 衔接到外部体系(用于数据输入/输出),并供给了 Kafka Streams 的流式处理库。该设计受业务日志的影响较大。

RocketMQ

RocketMQ 是一个分布式音讯和流数据渠道,具有低推迟、高性能、高可靠性、万亿级容量和灵活的可扩展性。RocketMQ 是 2012 年阿里巴巴开源的第三代分布式音讯中间件,2016 年 11 月 21 日,阿里巴巴向 Apache 软件基金会捐献了 RocketMQ;第二年 2 月 20 日,Apache 软件基金会宣布 Apache RocketMQ 成为顶级项目。

音讯行列的选型需求根据具体运用需求而定,ZeroMQ 小而美,RabbitMQ 大而稳,Kakfa 和 RocketMQ 快而微弱。

RabbitMQ 的布置和运用

推荐 Docker 布置,在装置 Docker 的环境下,履行:

docker run -d --hostname my-rabbit -p 15672:15672 -p 5672:5672 -- name rabbit-server -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password rabbitmq:3-management

现在在浏览器中翻开 localhost:15672 。用户名是 user ,暗码是 password

消息队列简介及 RabbitMQ 的使用方法

接下来,让咱们创建一个行列,名字叫 my_app

消息队列简介及 RabbitMQ 的使用方法

创建一个 Exchange,名字叫 my_exchange

消息队列简介及 RabbitMQ 的使用方法

点击 Exchange 标签页,点击 my_exchange 进入详情页, 将 my_exchange 和 my_app 绑定,路由密钥设置为 test:

消息队列简介及 RabbitMQ 的使用方法

Python 编写生产者

现在能够运用 Python 编写生产者,来生产一条音讯放入行列,并调查 Web 页面的变动状况:

import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost', 5672, '/', pika.PlainCredentials('user', 'password')))
channel = connection.channel()
channel.basic_publish(exchange='my_exchange', routing_key='test', body='Test!')
connection.close()

履行上面的代码,即可将音讯放入行列,这儿我履行了四次,能够看到有四条音讯:

消息队列简介及 RabbitMQ 的使用方法

音讯将保留在行列中,直到顾客把它取出,接下来咱们写一个消费音讯的程序。

Python 编写顾客

import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost', 5672, '/', pika.PlainCredentials("user", "password")))
channel = connection.channel()
def callback(ch, method, properties, body):
    print(f'{body} is received')
channel.basic_consume(queue="my_app", on_message_callback=callback, auto_ack=True)
channel.start_consuming()

履行:

消息队列简介及 RabbitMQ 的使用方法

此刻,行列已经空了:

消息队列简介及 RabbitMQ 的使用方法

这段代码最低限度地演示了如何将音讯发布到 RabbitMQ 中,更多用法还请移步到官方文档。

最后的话

音讯行列能够进行体系模块之间的解耦,但自己就成了要害节点,在集群布置和故障搬运方面,需求体系管理员的很多重视。本文扼要介绍了什么是音讯行列,为什么需求音讯行列,常见的音讯行列有哪些,RabbitMQ 的布置和运用,假如对你有所帮助,请点赞支撑,如有问题留言评论。