消息队列中间件 - Docker安装RabbitMQ、AMQP协议、和主要角色

2023-11-14

概述

不管是微服务还是分布式的系统架构中,消息队列中间件都是不可缺少的一个重要环节,主流的消息队列中间件有RabbitMQ、RocketMQ等等,从这篇开始详细介绍以RabbitMQ为代表的消息队列中间件。

AMQP协议

AMQP.png

  • AMQP协议是一个提供统一消息服务的应用层标准协议,基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。
  • AMQP协议是一种二进制协议,提供客户端应用与消息中间件之间的异步、安全、高效的交互。
  • AMQP作为中间层服务,把消息生产和消费分隔开来,当消费者产生出现异常,不影响消费者对消息的消费,当消费者异常时,生产者生产的消息可以存放到服务的内存或者磁盘,不会影响想消费的速率,同时,消息也可以基于路由的规则可以投递到指定的消费者消费。

AMQP协议重要角色

1.生产者和消费者

  • 生产者是生产消息的主体,消费者是消费消息的主体
  • 数据集成与系统解耦、异步处理与事件驱动、流量薛峰、事务消息与分布式事务的最终一致
  • 生产者生产一条消息丢给消息代理,消息代理根据投递规则将消息传到消费者手上

2.交换机

  • 交换机就像是消息代理的路由器,负责拿到一个消息之后,根据确定的规则(路由键)将它路由给一个或零个队列,交换机具备多种路由模式。
  • 基于消息生产者和路由规则可以将消息投递到指定的Message Queue,交换机收到生产者投递的消息,基于路由规则及队列绑定关系匹配到投递对应的交换机或者队列进行分发,交换机不存储消息,只做转发

交换机类型:

  • 直连交换机:根据路由键完全匹配的投递到对应的队列
  • 扇形交换机:无视路由键,将消息进行拷贝,并路由到给绑定到它身上所有队列,提供了一个广播的效果。
  • 主题交换机:根据路由键按模式匹配的投递到对应的队列
  • 交换机也具备自己的属性,可以定义自己的名字,是否持久化等选项。

3.队列

  • 队列是消息的暂存地,至少有一个消费者订阅了队列的话,消息会立即发送给这些订阅的消费者,但是如果消息到达了无人的订阅队列,消息会在队列中等待,等待有了消费者便进行分发。
  • Exchange和Message Queue之间存在绑定关系,消息到了Exchange 后基于路由策略可以将消息投递到已绑定且符合路由策略的Message Queue。
  • 消息队列会将消息存储到内存或者是磁盘中,并将这些消息按照一定顺序转发给一个或多个消费者,每个消息队列都是独立隔离的,相互不影响。
  • 消息队列具有不同的属性(私有、共享、持久化、临时、客户端定义或者服务端定义等)),可以基于实际需求选择对应的类型

4.消息

  • 消息是信息的载体,也是AMQP协议的一个实体,消息包含两部分
  • 载荷:就是真正的信息,是你想要传输的任何内容,该部分内容对消息代理来说是透明的
  • 元信息:包含路由键、内容类型、编码、是否持久化等消息属性,会被消息代理所解析,消息代理根据消息的属性对这条消息进行投递,存储等,这部分被消息代理所关系,而消费者对其是不关心的。

5.信道

  • 网络信道,是建立在Connection链接之上的一种轻量级的链接,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道,客户端可以建立对各Channel,每个Channel代表一个会话任务。
  • 一个Connection上可以创建任意数量的Channel

Docker安装RabbitMQ

1.查看Docker仓库里的RabbitMQ镜像

# 查询镜像
docker search rabbitmq

# 下载镜像
docker pull rabbitmq

2.启动MQ安装management

如果在云服务上部署需在安全组开通一下端口:15672(UI页面通信口)、5672(client端通信口)、25672(server间内部通信口)、61613(stomp 消息传输)、1883(MQTT消息队列遥测传输)。

docker run -d --name rabbit -e \
RABBITMQ_DEFAULT_USER=stark -e RABBITMQ_DEFAULT_PASS=1990@stark 
-p 15672:15672 \
-p 5672:5672 \
-p 25672:25672 \
-p 61613:61613 \
-p 1883:1883 rabbitmq:management

使用 http://127.0.0.1:15672访问,账号和密码就是参数RABBITMQ_DEFAULT_USERRABBITMQ_DEFAULT_PASS设置的值。

rabbitmq.png

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

消息队列中间件 - Docker安装RabbitMQ、AMQP协议、和主要角色 的相关文章

  • RabbitMQ C# API:如何检查绑定是否存在?

    使用 RabbitMQ C API 我如何检查给定队列到给定交换是否存在绑定 很多 RabbitMQ 调用都是幂等的 所以有些人可能会说在这些情况下检查是不必要的 但我认为它们在测试中很有用 您可以使用他们的 REST API 来调用并查看
  • Spring AMQP RabbitMQ 如何直接发送到Queue而不需要Exchange

    我正在使用 Spring AMQP 和 Rabbitmq 模板 如何直接将消息发送到队列而不使用Exchange 我该怎么做 我该怎么做 你不能 发布者不知道队列 只是交换和路由密钥 但是 所有队列都绑定到默认交换器 以队列名称作为其路由键
  • 为什么需要消息队列来与 Web 套接字聊天?

    我在互联网上看到了很多使用 Web 套接字和 RabbitMQ 进行聊天的示例 https github com videlalvaro rabbitmq chat https github com videlalvaro rabbitmq
  • 使用 Celery(RabbitMQ、Django)检索队列长度

    我在 django 项目中使用 Celery 我的代理是 RabbitMQ 我想检索队列的长度 我浏览了 Celery 的代码 但没有找到执行此操作的工具 我在 stackoverflow 上发现了这个问题 从客户端检查 RabbitMQ
  • RabbitMQ Java 客户端自动重新连接

    当我的应用程序失去与 RabbitMQ 的连接时 我将其连接工厂设置为自动尝试并重新连接 ConnectionFactory factory new ConnectionFactory factory setUsername usernam
  • MassTransit 生成我想忽略的_skipped 队列

    任何人都可以猜出问题是什么 因为我不知道如何解决这个问题 大众运输产生 skipped队列 我不知道为什么它会生成这些队列 它是在执行发布请求响应时生成的 请求客户端是使用 MassTransit RequestClientExtensio
  • 更改 RabbitMQ 队列中的参数

    我有一个 RabbitMQ 队列 最初声明如下 var result channel QueueDeclare NewQueue true false false null 我正在尝试添加死信交换 因此我将代码更改为 channel Exc
  • 生产者/消费者的不同语言

    我想知道是否可以通过 AMQP 和 RabbitMQ 对生产者和消费者使用不同的语言 例如 Java 代表生产者 python php 代表消费者 或者反之亦然 是的 AMQP 与语言无关 这意味着只要您有可以连接到 AMQP 的客户端sa
  • 将 sensu-client 连接到服务器时 AMQP 连接的 bad_header

    我已经安装了 sensu 和厨师社区食谱 但是 sensu客户端无法连接到服务器 导致rabbitmq连接错误 尝试连接时消息超时 这是详细的客户端日志 来自 sensu client log 的日志 timestamp 2014 07 0
  • 确认 RabbitMQ 消息是否有超时?

    我想设置一个超时时间 超过该超时时间后 出队的消息将自动被 NACK 拒绝 当我将消息出队时 我会等待消息通过套接字传输并且另一方确认其接收 我是否需要保留计时器列表 或者 RMQ 可以自动处理这个列表吗 private void Run
  • 使用 Spring 与 RabbitMQ 集成

    我正在为我们的一个应用程序开发消息传递界面 该应用程序是一种服务 旨在接受 作业 进行一些处理并返回结果 实际上以文件的形式 这个想法是使用 RabbitMQ 作为消息传递基础设施 并使用 Spring AMQP 来处理协议特定的细节 我不
  • RabbitMQ 中的 celeryev 队列变得非常大

    我在rabbitmq上使用celery 我已经向队列发送了数千条消息 它们正在成功处理 一切正常 然而 几个rabbitmq队列中的消息数量增长得相当大 队列中有数十万个项目 队列被命名为celeryev 见下面的截图 这是适当的行为吗 这
  • RabbitMQ 中 Pub/Sub 与工作队列的混合

    我正在评估使用 RabbitMQ 作为消息队列 消息总线 并一直在查看示例教程 https www rabbitmq com getstarted html在 RabbitMQ 页面上 我正在寻找教程中未涵盖的特定场景 并且我不确定是否以及
  • Django Celery 和多个数据库(Celery、Django 和 RabbitMQ)

    是否可以设置与 Django Celery 一起使用的不同数据库 我有一个配置了多个数据库的项目 并且不希望 Django Celery 使用默认数据库 如果我仍然可以使用 django celery 管理页面并读取存储在这个不同数据库中的
  • 在RabbitMQ中如何使用特定键消费多条消息或读取队列中的所有消息或交换中的所有消息?

    我想使用给定的密钥使用来自特定队列或特定交换的多条消息 所以场景如下 发布者通过队列 1 发布消息 1 发布者通过队列 1 发布消息 2 发布者通过队列 1 发布消息 3 发布者通过队列 2 发布消息 4 发布者通过队列 2 发布消息 5
  • 具有重新排队功能的 BasicReject 实际上去了哪里?

    这似乎是一个简单的问题 但我很难找到明确的答案 如果在 RabbitMQ 3 6 1 中我有一个如下所示的队列 5 4 3 2 1 lt head 我使用消息 1 然后执行以下操作 channel BasicReject ea Delive
  • 使用 Spring Boot 的多个 Rabbitmq 队列

    来自 Spring Boot 教程 https spring io guides gs messaging rabbitmq https spring io guides gs messaging rabbitmq 他们给出了创建 1 个队
  • 使用 Celery 时出现错误消息“无法找到记录器“多处理”的处理程序”

    RabbitMQ http en wikipedia org wiki RabbitMQ现在似乎工作正常 然而 当我尝试 python m celery bin celeryd loglevel INFO 常规的celeryd不起作用 我收
  • RabbitMQ-在一个应用程序进程中为单个队列创建多个消费者是一种好习惯吗

    我刚刚处理一个由 RabbitMQ 支持的新项目 并且在应用程序启动时创建了多个监听同一个队列的消费者实例 然而 它们与不同的渠道共享相同的连接 来自队列的消息非常庞大 一次生成行为有数百万条消息 因此我猜第一个代码作者正在尝试做一些事情来
  • 使用多线程使用rabbitmq消息队列(Python Kombu)

    我有一个带有单个队列的 RabbitMQ 交换 我希望创建一个运行多个线程并尽快通过该队列工作的守护进程 工作 涉及与外部服务的通信 因此每个消费者内部都会发生相当多的阻塞 因此 我希望有多个线程都处理来自同一队列的消息 我可以通过在主线程

随机推荐

  • 什么是七牛云?七牛云的使用

    一 什么是七牛云 七牛云是国内知名的云计算及数据服务提供商 主要提供了现在网络上占据百分之就是打非结构化数据 也就是图片 音频 视频的云存储服务 二 七牛云的使用 1 注册账号 2 绑定邮箱 3 实名认证 必须进行 4 创建一个存储空间 5
  • 高效的学习方法(几个小技巧)

    几个学习小技巧 1 价值导向性学习法 发现 赋予学习内容意义或者使命感 价值导向性学习法是一种高效的思维方式 可以传递出这样的一种观点 学习上有意义 有价值的行为 而不是消极的 被动式的学习 首先 最重要的是赋予学习内容以意义 其次 定制清
  • RK3399 ,64位,Ubuntu16.04系统安装ROS-kinetic方法总结

    1 第一步是修改hosts vi etc hosts 在127 0 0 1 localhost 后边添加 rpdzkj 自己的ubuntu用户名 127 0 0 1 localhost rpdzkj 设置sources list 我选择的是
  • LaTeX公式符号总结(Markdown适用)

    文章目录 1 希腊字母 小写字母 大写字母 2 符号 箭头符号 二元运算符 逻辑符号 集合符号 特殊符号 3 运算和函数 4 矩阵和多行列式 5 括号与空格 6 颜色 字体颜色 背景颜色 RGB颜色和自定义 默认支持颜色 本文从 Typor
  • 开发日记(4)如何将Bitmap转换成Uri?

    1 bitmap to uri Uri uri Uri parse MediaStore Images Media insertImage getContentResolver bitmap null null 2 uri to bitma
  • 阿里:MySQL 单表数据最大不要超过多少行?为什么?

    点击上方 芋道源码 选择 设为星标 管她前浪 还是后浪 能浪的浪 才是好浪 每天 10 33 更新文章 每天掉亿点点头发 源码精品专栏 原创 Java 2021 超神之路 很肝 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网
  • 2023AIGC人才趋势洞察报告

    导读 自ChatGPT于2022年11月发布至今 其大大超出预期的 涌现 能力使得AIGC赛道被彻底点燃 从人力资源角度观察 AIGC相关的岗位明显增加的同时 人才对于此类岗位的投递也愈发积极 值得注意的是 AIGC并不单单是属于ICT行业
  • iOS APP 如何做才安全

    本来 写了一篇 iOS 如何做才安全 逆向工程 Reveal IDA Hopper https抓包 等 发现文章有点杂 并且 iOS 如何做才安全 这部分写的越来越多 觉得 分出来更清晰一点 所以拆成两部分 同时也是为了大家能 共同讨论 毕
  • osgEarth加载SXEarth下载的mbtiles地图文件(win10)

    使用晟兴地球 SXEarth 通过互联网下载mbtiles格式的地图文件 然后使用osgEarth加载 晟兴地球 SXEarth 下载地图文件 晟兴地球SXEarth是一款永久免费的3DGIS平台软件 由北京晟兴科技有限公司开发 支持在线G
  • 二分法,平衡二叉树、B树、B+树

    二分法 平衡二叉树 B树 B 树 二分法 二分法查找 算法要求 比较次数 二分法到二叉树 平衡二叉树 平衡二叉树概念 平衡二叉树的构建规则 平衡二叉树特点 B树 B tree B树的构建规则 B树的查询流程 B 树 B 树构建规则 B 树和
  • 【华为OD机试 2023】货币单位换算(C++ Java JavaScript Python)

    华为od机试题库 华为OD机试2022 2023 C Java JS Py https blog csdn net banxia frontend category 12225173 html 华为OD机试2023最新题库 更新中 C Ja
  • 成功解决Win7 64位系统下GraphEdit 不能显示Directshow.net远程图表的问题

    首先问题如题 我是Win7 64位旗舰版操作系统 VS2010 使用Directshow net开发播放器程序 结果发现通过以前使用的GraphEdit无论如何不能看到远程图表 不管是重新注册spy dll PropPage dll等文件
  • 倒沖法-線邊倉

    倒冲法 倒冲法 Back flush 目录 隐藏 1 倒冲法概述 2 倒冲法的应用 3 倒冲法的隐性会计处理 1 4 倒冲错误的产生原因及处理程序 1 5 参考文献 编辑 倒冲法概述 倒冲法 Back flush 是ERP系统根据产成品收料
  • git错误 error: failed to push some refs to ‘https://github.com/...

    1 解决办法 git错误 error failed to push some refs to https github com 问题原因 远程库与本地库不一致造成的 在hint中也有提示把远程库同步到本地库就可以了 解决办法 使用命令行 g
  • Orange pi3 LTS Ubuntu22.04通过源码编译的方式安装opencv(C++版)

    硬件 orangepi 3 LTS 之前安装opencv的时候遇到了很多奇奇怪怪的错误 所以干脆重新写入系统后开始安装 安装Ubuntu22 04的过程按照官方提供的用户手册来操做 官方用户手册下载链接 http www orangepi
  • C++基础知识 - explicit 关键字

    explicit 关键字 作用是表明该构造函数是显示的 而非隐式的 不能进行隐式转换 跟它相对应的另一个关键字是implicit 意思是隐藏的 类构造函数默认情况下即声明为implicit 隐式 include
  • Ansible自动化运维工具学习-第二天

    Ansible入门学 第二天 前言 亲爱的小伙伴 如果你已经阅读了博主的Ansible 第一天相信你应该对Ansible有了一定的了解 不知道关于如何利用Ansible实现集群归档备份你有没有学会呢 今天暂且不谈Ansible的各个模块 因
  • Neo4j 数据导入导出

    前提条件 切换至neo4j 安装目录的bin 文件夹 D neo4j neo4j community 3 4 6 bin 或者配置全局环境变量 执行数据导出命令 neo4j admin dump database graph db to s
  • [Vue warn]: Cannot find element: #app

    解决方案 js在html页面头部引入的原因 自定义js文件要最后引入 因为要先有元素id vue才能获取相应的元素
  • 消息队列中间件 - Docker安装RabbitMQ、AMQP协议、和主要角色

    概述 不管是微服务还是分布式的系统架构中 消息队列中间件都是不可缺少的一个重要环节 主流的消息队列中间件有RabbitMQ RocketMQ等等 从这篇开始详细介绍以RabbitMQ为代表的消息队列中间件 AMQP协议 AMQP协议是一个提