【RabbitMQ】2 RabbitMQ介绍与架构

目录

  • 简介
  • 架构
  • Connection 和Channel关系
  • 工作流程
    • 生产者发送消息的流程
    • 消费者接收消息的过程
  • RabbitMQ数据存储
    • 存储机制
  • 安装和配置RabbitMQ
  • RabbitMQ常用操作命令

简介

RabbitMQ,俗称“兔子MQ”(可见其轻巧,敏捷),是目前非常热门的一款开源消息中间件,不管是互联网行业还是传统行业都广泛使用(最早是为了解决电信行业系统之间的可靠通信而设计)。

  1. 高可靠性、易扩展、高可用、功能丰富等
  2. 支持大多数(甚至冷门)的编程语言客户端。
  3. RabbitMQ遵循AMQP协议,自身采用Erlang(一种由爱立信开发的通用面向并发编程的语言)编写。
  4. RabbitMQ也支持MQTT等其他协议

RabbitMQ具有很强大的插件扩展能力,官方和社区提供了非常丰富的插件可供选择:https://www.rabbitmq.com/community-plugins.html

架构

在这里插入图片描述

在使用RabbitMQ的系统里有三个主要的组成部分:

  1. 生产者(producer):负责发送消息的程序

  2. 队列(queue):相当于在RabbitMQ中的邮箱。尽管消息在RabbitMQ和你的应用中流动,但消息只会存储在队列中。它本质上是一个很大的消息缓冲区。多个生产者可以发送消息到同一个队列,并且多个消费者可以接受同一个队列的消息。

  3. 消费者(consumer):可以理解为接受者,是一个一直等待接受消息的程序。

另外还有四个主要的概念:

  1. 交换机(exchange):生产者发送消息时经过交换机,交换机根据特定的模式(direct(默认),fanout, topic, 和headers)转发消息到队列,不做消息存储 。
  2. 信道(channel):程序和rabbitmq打交道的通道,消息发送到交换机和消息从队列到消费者,都需要经过信道。
  3. 绑定(binding):将一个特定的 Exchange 和一个特定的 Queue 绑定起来。
  4. 虚拟主机(virtual host):一个虚拟主机包含一组交换机、队列和绑定。RabbitMQ当中,用户只能在虚拟主机的粒度进行权限控制。

注意:

  • 生产者、消费者以及消息中间件很多时候并不在同一台机器上。

  • 同一个应用程序既可以是生产者也可以是消费者。

Connection 和Channel关系

生产者和消费者,需要与RabbitMQ Broker 建立TCP连接,也就是Connection 。一旦TCP 连接建立起来,客户端紧接着创建一个AMQP 信道(Channel),每个信道都会被指派一个唯一的ID。信道是建立在Connection 之上的虚拟连接, RabbitMQ 处理的每条AMQP 指令都是通过信道完成的。

在这里插入图片描述

为什么不直接使用TCP连接,而是使用信道?

RabbitMQ 采用类似NIO的做法,复用TCP 连接,减少性能开销,便于管理。当每个信道的流量不是很大时,复用单一的Connection 可以在产生性能瓶颈的情况下有效地节省TCP 连接资源。

当信道本身的流量很大时,一个Connection 就会产生性能瓶颈,流量被限制。需要建立多个Connection ,分摊信道。具体的调优看业务需要。

信道在AMQP 中是一个很重要的概念,大多数操作都是在信道这个层面进行的。

RabbitMQ 相关的API与AMQP紧密相连,比如channel.basicPublish 对应AMQP 的Basic.Publish命令。

工作流程

生产者发送消息的流程

  1. 生产者连接RabbitMQ,建立TCP连接( Connection),开启信道(Channel)
  2. 生产者声明一个Exchange(交换器),并设置相关属性,比如交换器类型、是否持久化等
  3. 生产者声明一个队列井设置相关属性,比如是否排他、是否持久化、是否自动删除等
  4. 生产者通过 bindingKey (绑定Key)将交换器和队列绑定( binding )起来
  5. 生产者发送消息至RabbitMQ Broker,其中包含 routingKey (路由键)、交换器等信息
  6. 相应的交换器根据接收到的 routingKey 查找相匹配的队列。
  7. 如果找到,则将从生产者发送过来的消息存入相应的队列中。
  8. 如果没有找到,则根据生产者配置的属性选择丢弃还是回退给生产者
  9. 关闭信道。
  10. 关闭连接。

消费者接收消息的过程

  1. 消费者连接到RabbitMQ Broker ,建立一个连接(Connection ) ,开启一个信道(Channel) 。
  2. 消费者向RabbitMQ Broker 请求消费相应队列中的消息,可能会设置相应的回调函数, 以及做一些准备工作
  3. 等待RabbitMQ Broker 回应并投递相应队列中的消息, 消费者接收消息。
  4. 消费者确认( ack) 接收到的消息。
  5. RabbitMQ 从队列中删除相应己经被确认的消息。
  6. 关闭信道。
  7. 关闭连接。

RabbitMQ数据存储

存储机制

RabbitMQ消息有两种类型:

  1. 持久化消息和非持久化消息。
  2. 这两种消息都会被写入磁盘。

持久化消息在到达队列时写入磁盘,同时会内存中保存一份备份,当内存吃紧时,消息从内存中清除。这会提高一定的性能。

非持久化消息一般只存于内存中,当内存压力大时数据刷盘处理,以节省内存空间。

RabbitMQ存储层包含两个部分:队列索引和消息存储

在这里插入图片描述

队列索引:rabbit_queue_index

索引维护队列的落盘消息的信息,如存储地点、是否已被给消费者接收、是否已被消费者ack等。每个队列都有相对应的索引。

索引使用顺序的段文件来存储,后缀为.idx,文件名从0开始累加,每个段文件中包含固定的segment_entry_count 条记录,默认值是16384。每个index从磁盘中读取消息的时候,至少要在内存中维护一个段文件,所以设置queue_index_embed_msgs_below 值得时候要格外谨慎,一点点增大也可能会引起内存爆炸式增长。

消息存储:rabbit_msg_store

消息以键值对的形式存储到文件中,一个虚拟主机上的所有队列使用同一块存储,每个节点只有一个。存储分为持久化存储(msg_store_persistent)和短暂存储(msg_store_transient)。持久化存储的内容在broker重启后不会丢失,短暂存储的内容在broker重启后丢失。

store使用文件来存储,后缀为.rdq,经过store处理的所有消息都会以追加的方式写入到该文件中,当该文件的大小超过指定的限制(file_size_limit)后,将会关闭该文件并创建一个新的文件以供新的消息写入。文件名从0开始进行累加。在进行消息的存储时,RabbitMQ会在ETS(Erlang TermStorage)表中记录消息在文件中的位置映射和文件的相关信息。

消息(包括消息头、消息体、属性)可以直接存储在index中,也可以存储在store中。最佳的方式是较小的消息存在index中,而较大的消息存在store中。这个消息大小的界定可以通过queue_index_embed_msgs_below 来配置,默认值为4096B。当一个消息小于设定的大小阈值时,就可以存储在index中,这样性能上可以得到优化。一个完整的消息大小小于这个值,就放到索引中,否则放到持久化消息文件中。

读取消息时,先根据消息的ID(msg_id)找到对应存储的文件,如果文件存在并且未被锁住,则直接打开文件,从指定位置读取消息内容。如果文件不存在或者被锁住了,则发送请求由store进行处理。

删除消息时,只是从ETS表删除指定消息的相关信息,同时更新消息对应的存储文件和相关信息。在执行消息删除操作时,并不立即对文件中的消息进行删除,也就是说消息依然在文件中,仅仅是标记为垃圾数据而已。当一个文件中都是垃圾数据时可以将这个文件删除。当检测到前后两个文件中的有效数据可以合并成一个文件,并且所有的垃圾数据的大小和所有文件(至少有3个文件存在的情况下)的数据大小的比值超过设置的阈值garbage_fraction(默认值0.5)时,才会触发垃圾回收,将这两个文件合并,执行合并的两个文件一定是逻辑上相邻的两个文件。

安装和配置RabbitMQ

RabbitMQ的安装需要首先安装Erlang,因为它是基于Erlang的VM运行的。

RabbitMQ需要的依赖:socat和logrotate,logrotate操作系统中已经存在了,只需要安装socat就可以了。

RabbitMQ与Erlang的兼容关系详见:https://www.rabbitmq.com/which-erlang.htm

1、安装依赖:

yum install socat -y

2、安装Erlang

erlang-23.0.2-1.el7.x86_64.rpm下载地址:https://github.com/rabbitmq/erlang-rpm/releases/download/v23.0.2/erlang-23.0.2-1.el7.x86_64.rpm

首先将erlang-23.0.2-1.el7.x86_64.rpm上传至服务器,然后执行下述命令:

rpm -ivh erlang-23.0.2-1.el7.x86_64.rpm

3、安装RabbitMQ

rabbitmq-server-3.8.4-1.el7.noarch.rpm下载地址:

https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.5/rabbitmq-server-3.8.5-1.el7.noarch.rpm

首先将rabbitmq-server-3.8.4-1.el7.noarch.rpm上传至服务器,然后执行下述命令:

rpm -ivh rabbitmq-server-3.8.4-1.el7.noarch.rpm

4、启用RabbitMQ的管理插件

rabbitmq-plugins enable rabbitmq_management

5、开启RabbitMQ

systemctl start rabbitmq-server
# 或者
rabbitmq-server
# 或者后台启动
rabbitmq-server -detached 1

6、添加用户

rabbitmqctl add_user root 123456

7、给用户添加权限

给root用户在虚拟主机"/"上的配置、写、读的权限

rabbitmqctl set_permissions root -p / ".*" ".*" ".*"

8、给用户设置标签

rabbitmqctl set_user_tags root administrator

9、打开浏览器,访问http:/IP地址:15672

界面如下

在这里插入图片描述

10、使用刚才创建的用户登录

在这里插入图片描述

RabbitMQ常用操作命令

# 前台启动Erlang VM和RabbitMQ 
rabbitmq-server # 后台启动 
rabbitmq-server -detached# 停止RabbitMQ和Erlang VM 
rabbitmqctl stop # 查看所有队列 
rabbitmqctl list_queues # 查看所有虚拟主机 
rabbitmqctl list_vhosts # 在Erlang VM运行的情况下启动RabbitMQ应用 
rabbitmqctl start_app rabbitmqctl stop_app # 查看节点状态 
rabbitmqctl status # 查看所有可用的插件
rabbitmq-plugins list 
# 启用插件 
rabbitmq-plugins enable <plugin-name> 
# 停用插件 
rabbitmq-plugins disable <plugin-name># 添加用户 
rabbitmqctl add_user username password 
# 列出所有用户: 
rabbitmqctl list_users 
# 删除用户: 
rabbitmqctl delete_user username 
# 清除用户权限: 
rabbitmqctl clear_permissions -p vhostpath username 
# 列出用户权限: 
rabbitmqctl list_user_permissions username 
# 修改密码:
rabbitmqctl change_password username newpassword 
# 设置用户权限: 
rabbitmqctl set_permissions -p vhostpath username ".*" ".*" ".*" # 创建虚拟主机: 
rabbitmqctl add_vhost vhostpath 
# 列出所以虚拟主机: 
rabbitmqctl list_vhosts 
# 列出虚拟主机上的所有权限: 
rabbitmqctl list_permissions -p vhostpath 
# 删除虚拟主机: 
rabbitmqctl delete_vhost vhost vhostpath # 移除所有数据,要在 rabbitmqctl stop_app 之后使用: 
rabbitmqctl reset

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/605824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【linux学习】linux概述

1. linux概述 操作系统主要的功能有两个部分&#xff0c;一是更有效率的控制计算机硬件资源&#xff08;主要通过核心来控制&#xff09;&#xff0c;二是为程序设计师提供更容易开发软件的环境&#xff08;系统呼叫提供软件开发环境&#xff09;。linux就是一套操作系统&…

「许战海战略文库」从日本消费趋势看中国食品的第二招牌

在日本消费趋势的映射下&#xff0c;中国的食品行业面临着独特的转型机遇。品类品牌时代的终结及其在美元霸权经济下的起落&#xff0c;以及中国企业如何在改革开放四十年市场红利结束后继续成长&#xff0c;面对内卷式竞争&#xff0c;中国食品企业如何寻找新的增长路径&#…

【JaveWeb教程】(1)Web前端基础:HTML+CSS入门不再难:一篇文章教你轻松搞定HTML与CSS!

目录 1. 前端开发介绍2. HTML & CSS2.1 HTML快速入门2.1.1 操作2.1.2 总结 2.2 开发工具2.3 基础标签 & 样式2.3.1 新浪新闻-标题实现2.3.1.1 标题排版2.3.1.1.1 分析2.3.1.1.2 标签2.3.1.1.2 实现 2.3.1.2 标题样式2.3.1.2.1 CSS引入方式2.3.1.2.2 颜色表示2.3.1.2.3 …

【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax概述

【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax概述 【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax快速入门 【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax类图 【大数据进阶第三阶段之Datax学习笔记】使用…

python数据可视化之地图绘制案例分析

在数据可视化领域&#xff0c;地理信息的展示有着无可替代的价值。本篇笔记将通过Python的pyecharts库实现一个中国直辖市GDP数据的地图分布可视化示例&#xff0c;帮助读者了解如何利用该工具进行地图数据渲染。 1. 导入所需模块 首先&#xff0c;我们需要导入pyecharts库中…

OpenAI 也在 996?一位离职员工自白:代码贡献第四,经常工作 6 天丨 RTE 开发者日报 Vol.121

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

Prometheus Blackbox_exporter笔记

一、安装Promtheus 在 Prometheus 官网 Download | Prometheus 获取适用于 Linux 的 Prometheus 安 装包&#xff0c;这里我选择最新的 2.46.0 版本&#xff0c;我是 Linux 系统&#xff0c;选择下载 prometheus-2.46.0.linux-amd64.tar.gz 下载安装包&#xff1a; wget htt…

多国管理中心多语言区块链源码一元夺宝程序仿趣步奕跑/原生计步器/原生人脸识别

前后台分开的&#xff0c;后台是TP3.2的框架了&#xff0c;应该是比较老的程序了。 目前把整体UI 改版黄色系风格&#xff0c;集成了一元夺宝程序&#xff0c;用户数据同步趣步&#xff0c;效果看起来很棒&#xff0c;另外加入股票走势图&#xff08;K线图&#xff09;&#xf…

世微AP5126宽电压12-80V 1.5A平均电流型LED降压恒流驱动内置IC

产品描述 AP5126 是一款 PWM 工作模式,高效率、外 围简单、内置功率管&#xff0c;适用于 12-80V 输入的高 精度降压 LED 恒流驱动芯片。输出功率可达 15W&#xff0c;电流 1.2A。 AP5126 可实现全亮/半亮功能切换&#xff0c;通过 MODE 切换&#xff1a;全亮/半亮/循环模式…

使用 Jamf Pro 和 Okta 工作流程实现自动化苹果设备管理

Jamf的销售工程师Vincent Bonnin与Okta的产品经理Emily Wendell一起介绍了JNUC 2021的操作方法会议。它们涵盖了Okta工作流程&#xff08;Okta Workflow&#xff09;&#xff0c;并在其中集成了Jamf Pro&#xff0c;构建了一些工作流程&#xff0c;并提供了几个用例。 Okta 工作…

HTML5和JS实现明媚月色效果

HTML5和JS实现明媚月色效果 先给出效果图&#xff1a; 源码如下&#xff1a; <!DOCTYPE html> <html> <head><title>明媚月光效果</title><style>body {margin: 0;overflow: hidden;background-color: #000; /* 添加一个深色背景以便看到…

SSM医院预约挂号系统【源码】【最详细运行文档】

SSM医院预约挂号系统【源码】【最详细运行文档】 系统简介系统涉及系统运行系统演示源码获取 系统简介 随着医疗水平的提高&#xff0c;以及人们对于健康的观念越来越重视&#xff0c;出入医院成了一种常见的现象。而随着看病人数增多&#xff0c;经常出现挂号难的现象。一部分…

ME8206 电流模式准谐振 PWM 控制器 输出功率可达100W

描述&#xff1a; ME8206 是一个电流模式准谐振 PWM 控制器&#xff0c;在 85V-265V 的宽电压范围内提供高达 100W 的输出功率&#xff0c; 在大范围的负载和输入电压变化情况下确保谷底电压导通。 ME8206 采用高压启动设计&#xff0c;芯片直接连接到高压&#xff0c; 以提供芯…

word技巧

word这个东西有的时候令人又爱又恨&#xff0c;很多用上的时候都是因为自己贫瘠的技巧而令人抓狂&#xff0c;比如设置一个页脚和页眉&#xff0c;首页如何不同&#xff1f;目录页如何设置罗马数字&#xff1f;页眉前面几页不要横线&#xff0c;后面几页要横线&#xff0c;谨以…

【技术科普】什么是达芬奇架构?有什么优势?

芯片架构是指芯片设计的基本结构和组织方式&#xff0c;用于实现各种计算、存储和通信功能。芯片架构通常包括处理器核心、内存、输入输出接口等组成部分&#xff0c;这些部分的设计对芯片性能和功耗有着直接的影响&#xff0c;世界上主流的芯片架构主要包括x86、ARM、PowerPC和…

【C语言】一种状态超时阻塞循环查询的办法

【C语言】一种状态超时阻塞循环查询的办法 文章目录 【C语言】一种状态超时阻塞循环查询的办法1.方法12.方法21.方法1 static void wait_notify_async(notify_type_t notify_type) {static rt_tick_t exit_tick;exit_tick = rt_time_get_msec();lb_int32 notify_success = RT_F…

vue-springboot基于java的社区志愿者活动信息管理系统 e2y4d

社区志愿者信息管理系统的主要开发目标如下&#xff1a; &#xff08;1&#xff09;对零碎化、分布散的数据信息进行收纳、整理&#xff0c;通过网络服务平台使这些信息内容更加调理&#xff0c;更加方便化和清晰化&#xff0c;让访问该系统的每个用户享受浏览的过程。 &#x…

google 内购记录

1.GooglePlay内购服务器验单配置 &#xff08;新版本好像不需要API 配置关联&#xff0c;好像不需要了&#xff09; 详细配置url: https://blog.csdn.net/wuyutaoktm/article/details/122450878 2. 用golang代码实现&#xff0c;主要是验证订单和发币,PAY_JSON 是上一个步骤申…

Java后端开发——Ajax、jQuery和JSON

Java后端开发——Ajax、jQuery和JSON 概述 Ajax全称是Asynchronous Javascript and XML&#xff0c;即异步的JavaScript和 XML。Ajax是一种Web应用技术&#xff0c;该技术是在JavaScript、DOM、服务器配合下&#xff0c;实现浏览器向服务器发送异步请求。 Ajax异步请求方式不…

螺纹钢负公差测径仪获得哪些信息?

螺纹钢负公差轧制是很多厂家在使用的一种轧制方式&#xff0c;蓝鹏测控在推出普通型轧钢测径仪和智能型轧钢测径仪后&#xff0c;又推出了可显示负公差信息的测径仪&#xff0c;本文来简单看一下螺纹钢负公差轧制能从测径仪中获得哪些信息&#xff1f; 负公差测径仪为了能对螺纹…