博客 RabbitMQ 从原理到实战—golang版本(上)

RabbitMQ 从原理到实战—golang版本(上)

   数栈君   发表于 2024-11-13 14:58  330  0

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/03d554331c4cf2e3010de3a7ba2e511d..jpg

1.MQ

1.1 概念
MQ(Message Queue,消息队列)是一种用于在分布式系统中实现消息传递和异步通信的技术。它充当了发送方和接收方之间的中间人,用于在应用程序或服务之间传递消息。MQ 允许系统中的不同组件彼此独立运行,而无需直接通信或相互依赖,从而提高系统的可扩展性、可靠性和灵活性。

概念剖析:
·  消息: 消息是应用程序之间传递的数据单元,可以是文本、JSON、XML 或其他格式。
·  队列: 队列是一个用于存储消息的容器,消息按照先进先出(FIFO)的顺序存储。
·  生产者: 生产者是发送消息到消息队列的应用程序或服务。它生成并推送消息到队列中。
·  消费者: 消费者是从消息队列中接收和处理消息的应用程序或服务。它会从队列中取出消息并执行相应的操作。
·  中间件: 消息队列通常由消息中间件实现,如 RabbitMQ、Kafka、ActiveMQ、Redis等。中间件负责管理消息的存储、传递和路由。

1.2 MQ的工作原理

MQ的工作方式通常包含以下步骤:
·  消息生产: 生产者将消息发送到消息队列。
·  消息存储: 消息队列中间件接收并存储消息,直到有消费者来取走它们。
·  消息消费: 消费者从队列中取出消息并处理。
·  消息确认: 消费者处理完消息后,通常会向队列发送确认,通知中间件消息已成功处理,可以将其删除或标记为已处理。

1.3 MQ应用场景

1.3.1 异步处理

场景说明:用户注册后发送邮件和短信,假设每个步骤耗时100ms

·做法一:串行 300ms
将注册信息写入数据库后,发送邮箱,在发送短信,以上三个任务全部完成后才返回客户端。

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/a1dc9a957b4efbc3ffed9acbb2b3a3ed..jpg


·  做法二:并行 200ms
将注册信息写入数据库后,发送邮箱的同时发送短信,以上三个任务全部完成后才返回客户端。

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/c831fc53d95f83443e557e0db1b53213..jpg


·做法三:消息队列 100ms+写入消息队列时间
在将注册信息写入数据库后,立即返回客户端,显示注册成功。邮件和短信的发送可以异步处理,因为它们对网站的正常使用没有直接影响,客户端无需等待它们完成。

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/6859bd6029ce08dd1f5d735c88b08a6d..jpg

1.3.2 应用解耦

场景说明:用户下单后,订单系统需要通知库存系统

·做法一:接口直接调用

订单系统直接调用库存系统进行扣减,订单系统与库存系统强耦合,倘若库存系统出现故障或者性能瓶颈,会直接影响订单系统的使用。

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/30fdbc7cca1fa37fb8b6a7515aed03c3..jpg

·做法二:消息队列

用户下单后,将消息写入到消息队列,返回用户下单成功,库存订阅消息处理。

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/33a196b85186ef3d6e47d9e55e5126fe..jpg

1.3.3 流量削峰

场景说明:秒杀活动,一般会因为流量过大,导致应用挂掉,为了解决这个问题,一般在应用前端加入消息队列。

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/731c8e15931c5c7e7c2f96d0762c26f9..jpg

1.4 常见的MQ

·ActiveMQ:Apache 软件基金会开发的 ActiveMQ 是一款广泛使用的消息中间件,支持多种协议。虽然其吞吐量有限,单机处理能力在万级左右,足以满足中小型项目的需求,但在大型互联网项目中可能会显得力不从心。
·  Kafka: Kafka 主要用于实时数据流处理和大数据场景,擅长处理高吞吐量的消息。最初设计的目标是日志收集和传输。虽然不支持事务且对消息的重复、丢失或错误没有严格要求,但其在高吞吐量的应用场景中表现尤为出色。
·  RocketMQ: RocketMQ是阿里开源的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。MQ的所有优点它基本都满足。但是它最大的缺点:商业版收费。因此它有许多功能是不对外提供的。
·  RabbitMQ: 使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。在高可用上,它使用的是镜像集群模式,可以保证高可用。在消息可靠性上,它是可以保证数据不丢失的,这也是它的一大优点。同时它也支持一些消息中间件的高级功能,如:消息重试、死信队列等。

1.5 为什么选择RabbitMQ
·  ActiveMQ,性能不是很友好
·  Kafka,主要强调性能,可靠性差
·  RocketMQ,MQ的所有优点它基本都满足。但是它最大的缺点:商业版收费。因此它有许多功能是不对外提供的。


2.RabbitMQ 介绍

2.1 简介
RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。

特点:

·  基于AMQP协议来实现。主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。
·  可靠性:采用一系列机制来确保消息的可靠性,如持久化、传输确认和发布确认等方法。能够保证百分之百的不丢失。
·  高可用性:队列可以在集群的多台机器上进行镜像设置,即使其中的某些节点出现故障,队列仍然可用。
·  可扩展性: RabbitMQ支持构建集群,多个节点可以组成一个集群。
·  灵活的路由: 消息在进入队列之前会通过交换器进行路由,使得消息能够按照特定的规则进行分发。

2.2 架构模型

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/e12eef782b3ba8688a3bdc491e9efe92..jpg

模型常用概念详解:

·Producer:

生产者是消息的发送者。它将消息发送到 RabbitMQ 中,消息被发送到一个 Exchange(交换器)中。生产者并不知道消息将被发送到哪个队列(Queue),只负责将消息发送到指定的交换器。

·  Exchange:
交换器是用来接收生产者发送的消息并根据一定的规则(Binding)将消息路由到一个或多个队列中。交换器有不同的类型,每种类型的路由行为不同:
Direct Exchange:根据消息的 Routing Key(路由键)精确地将消息路由到指定的队列中。
Topic Exchange:根据 Routing Key 的模式匹配,将消息路由到符合条件的队列中,支持模糊匹配。
Fanout Exchange:将消息广播到所有绑定到该交换器的队列中,忽略 Routing Key。
Headers Exchange:根据消息的 Headers 属性进行路由。

·  Queue:
队列是 RabbitMQ 中存储消息的容器。消息进入队列后,会被消费者(Consumer)从中取出并处理。一个队列可以绑定到多个交换器上,且一个队列可以有多个消费者,但每条消息只能被一个消费者消费。

·  Consumer:
消费者是从队列中接收消息并处理的应用程序或服务。消费者可以主动拉取消息,也可以通过订阅的方式被动接收消息。

·  Message:
消息是生产者发送给 RabbitMQ 的数据载体,通常包括两个部分:
Payload:消息的实际数据。
Attributes:消息的元数据,比如 Routing Key、Headers、优先级等。

·  Ack:
消费者处理完消息后,可以发送确认(ACK)给 RabbitMQ,以表示消息已成功处理。未确认的消息会被重新投递。

·  Routing Key:
路由键是生产者发送消息时指定的,用于匹配交换器和队列的绑定规则。不同类型的交换器对路由键的处理方式不同。

3.Centos7 使用Docker 安装RabbitMQ

3.1 拉取镜像

$ docker pull docker.io/rabbitmq

3.2 运行容器

**运行脚本:**restart_service.sh

sedir=`pwd`datadir=$basedir/data
image=docker.io/rabbitmq
name=rabbitmq
mkdir-p$datadirdocker stop $name

dockerrm$namedocker run -d--name=$name--restart always -p5672:5672 -p15672:15672 -p15692:15692 -v$datadir:/var/lib/rabbitmq $image

运行:$ sh restart_service.sh

3.3 配置RabbitMQ

先进入容器内部:$dockerexec-it rabbitmq bash

3.3.1 启用网页版后台管理插件

$ rabbitmq-plugins enable rabbitmq_management

此时可以通过浏览器访问管理页面:http://ip地址:15672/

如果是腾讯云之类的话记得开放端口5672和15672

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/9f99337a608832d62de8d7b4ebc0abd8..jpg

可以通过默认账号 guest/guest 登录

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/6b6a07accbfbab5d2a2c1af4b1ba5bb2..jpg

3.4 web管理界面详解

3.4.1 概览

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/33ad2bf112a1ef8bdab0b192add9be96..jpg

3.4.2 Admin添加用户

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/cc27dd5d0ae7f94b0ee3482d48e831ea..jpg

Tags选项可以选择不同的角色来创建用户


·  超级管理员(administrator):可登录管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。

·  监控者(monitoring):可登录管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
·  策略制定者(policymaker):可登录管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。
·  普通管理者management:仅可登录管理控制台,无法看到节点信息,也无法对策略进行管理
·  其他:无法登录管理控制台,通常就是普通的生产者和消费者。

新建用户xz

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/969d86cc89d71f9e408ab064a6241cce..jpg

目前xz这个用户是没有虚拟机可以用的。接下来新建一个。

3.4.3 新建虚拟机

RabbitMQ添加了虚拟主机(Virtual Hosts)的概念,目的就是为了让各个用户可以互不干扰的工作。其实就是一个独立的访问路径,不同用户使用不同路径,各自有自己的队列、交换机,相互独立。
http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/a7007a7bd2ea2bfc97cc9b48b85be5bf..jpg

3.4.4 虚拟机绑定用户

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/b4ce20522f4460b4d8d18e0897b83c81..jpg

3.4.5 切换到新建用户xz

出现警告
http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/6af5234f489878af549fabb82545ce63..jpg

解决方案开启 management_agent 插件

进入容器

$ dockerexec-it rabbitmq /bin/bash
$ cd /etc/rabbitmq/conf.d/

修改management_agent.disable_metrics_collector = false 

$ echo management_agent.disable_metrics_collector =false>20-management_agent.disable_metrics_collector.conf

重启容器

$ docker restart rabbitmq 

刷新可以看到更多页面数据了

切换对应目录 

http://dtstack-static.oss-cn-hangzhou.aliyuncs.com/2021bbs/files_user1/article/ec35258941e3a68d96bcdb91fb24ac9e..jpg

《数据资产管理白皮书》下载地址:

《行业指标体系白皮书》下载地址:

《数据治理行业实践白皮书》下载地址:

《数栈V6.0产品白皮书》下载地址:


想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:


同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址:

0条评论
社区公告
  • 大数据领域最专业的产品&技术交流社区,专注于探讨与分享大数据领域有趣又火热的信息,专业又专注的数据人园地

最新活动更多
微信扫码获取数字化转型资料
钉钉扫码加入技术交流群