rabbitmq简介

2023-11-11

开发十年,就只剩下这套Java开发体系了 >>>   hot3.png

1、AMQP

    AMQP协议是一个高级抽象层消息通信协议,RabbitMQ是AMQP协议的实现。它主要包括以下组件:

1.1 Server(broker)

    接受客户端连接,实现AMQP消息队列和路由功能的进程。

1.2 Virtual Host

    其实是一个虚拟概念,类似于权限控制组,一个Virtual Host里面可以有若干个Exchange和Queue,但是权限控制的最小粒度是Virtual Host。

1.3 Exchange

    接受生产者发送的消息,并根据Binding规则将消息路由给服务器中的队列。ExchangeType决定了Exchange路由消息的行为,例如,在RabbitMQ中,ExchangeType有direct、Fanout和Topic三种,不同类型的Exchange路由的行为是不一样的。

1.3.1 direct

    如果 routing key 匹配, 那么Message就会被传递到相应的queue中。其实在queue创建时,它会自动的以queue的名字作为routing key来绑定那个exchange。

1.3.2 fanout

    会向响应的queue广播。

1.3.3 topic

    对key进行模式匹配,比如ab*可以传递到所有ab*的queue。

1.4 Message Queue

    消息队列,用于存储还未被消费者消费的消息。

1.5 Message

    由Header和Body组成,Header是由生产者添加的各种属性的集合,包括Message是否被持久化、由哪个Message Queue接受、优先级是多少等。而Body是真正需要传输的APP数据。

1.6 Binding

    Binding联系了Exchange与Message Queue。Exchange在与多个Message Queue发生Binding后会生成一张路由表,路由表中存储着Message Queue所需消息的限制条件即Binding Key。当Exchange收到Message时会解析其Header得到Routing Key,Exchange根据Routing Key与Exchange Type将Message路由到Message Queue。Binding Key由Consumer在Binding Exchange与Message Queue时指定,而Routing Key由Producer发送Message时指定,两者的匹配方式由Exchange Type决定。 

1.7 Connection

    连接,对于RabbitMQ而言,其实就是一个位于客户端和Broker之间的TCP连接。

1.8 Channel

    信道,仅仅创建了客户端到Broker之间的连接后,客户端还是不能发送消息的。需要为每一个Connection创建Channel,AMQP协议规定只有通过Channel才能执行AMQP的命令。一个Connection可以包含多个Channel。之所以需要Channel,是因为TCP连接的建立和释放都是十分昂贵的,如果一个客户端每一个线程都需要与Broker交互,如果每一个线程都建立一个TCP连接,暂且不考虑TCP连接是否浪费,就算操作系统也无法承受每秒建立如此多的TCP连接。RabbitMQ建议客户端线程之间不要共用Channel,至少要保证共用Channel的线程发送消息必须是串行的,但是建议尽量共用Connection。

    为什么使用Channel,而不是直接使用Connection(TCP连接)?

    对于OS来说,建立和关闭TCP连接是有代价的,频繁的建立关闭TCP连接对于系统的性能有很大的影响,而且TCP的连接数也有限制,这也限制了系统处理高并发的能力。但是,在TCP连接中建立Channel是没有上述代价的。对于Producer或者Consumer来说,可以并发的使用多个Channel进行Publish或者Receive。

1.9 Command

    AMQP的命令,客户端通过Command完成与AMQP服务器的交互来实现自身的逻辑。例如在RabbitMQ中,客户端可以通过publish命令发送消息,txSelect开启一个事务,txCommit提交一个事务。

2、系统架构

  •  生产者将message发送到exchange。
  • exchange接受message之后,负责将其路由到具体的队列中。
  • Bindings负责连接exchange和队列(queue)。
  • message到达队列(queue),然后等待被message接收端处理。
  • 消费者处理message。

3、广播模式

3.1 fanout

所有bind到此exchange的queue都可以接收消息(纯广播,绑定到RabbitMQ的接受者都能收到消息)。

3.2 direct

通过routingKey和exchange决定的那个唯一的queue可以接收消息。

3.3 topic

所有符合routingKey(此时可以是一个表达式)的routingKey所bind的queue可以接收消息。

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

rabbitmq简介 的相关文章

  • RocketMQ吐血总结

    RocketMQ吐血总结 架构 概念模型 最基本的概念模型与扩展后段概念模型 存储模型 RocketMQ吐血总结 User Guide RocketMQ是一款分布式消息中间件 最初是由阿里巴巴消息中间件团队研发并大规模应用于生产系统 满足线
  • 大牛总结超详细的RabbitMQ入门,看这篇文章就够了!

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 一 前情提示 二 ack机制回顾 三 ack机制实现原理 delivery tag 四 RabbitMQ如何感知仓储服务实例宕机 五 仓储服务处理失败时的消息重
  • Return消息机制

    Return Listener 用于处理一些不可路由的消息 消息生产者通过制定一个Exchane和RoutingKey 把消息送达到某一个队列中去 消费者监听队列进行消费处理 但是在某些情况下 发送消息的时候 当前Exchange不存在或制
  • Docker搭建RabbitMQ集群_开启MQTT插件后连接不上

    RabbitMQ集群搭建和测试总结 亲测 Docker安装RabbitMQ集群 亲测成功 开启MQTT插件后 集群方式连接不上 看日志报错连接超时 执行如下命令就可以连接上了 rabbitmqctl eval ra overview rab
  • 《消息队列高手课》该如何选择消息队列

    作为一个程序员 相信你一定听过 没有银弹 这个说法 这里面的银弹是指能轻松杀死狼人 用白银做的子弹 什么意思呢 我对这句话的理解是说 在软件工程中 不存在像 银弹 这样可以解决一切问题的设计 架构或软件 每一个软件系统 它都是独一无二的 你
  • rabbitmq安装

    1 安装 1 1 安装Erlang gt yum install y gcc gcc c glibc devel make ncurses devel openssl devel autoconf java 1 8 0 openjdk de
  • 《消息队列高手课》主题和队列有什么区别?

    如果你研究过超过一种消息队列产品 你可能已经发现 每种消息队列都有自己的一套消息模型 像队列 Queue 主题 Topic 或是分区 Partition 这些名词概念 在每个消息队列模型中都会涉及一些 含义还不太一样 为什么出现这种情况呢
  • 选Redis做MQ的人,是脑子里缺根弦儿吗?

    V xin ruyuan0330 获得600 页原创精品文章汇总PDF 目录 一 前情提示 二 unack消息的积压问题 三 如何解决unack消息的积压问题 四 高并发场景下的内存溢出问题 五 低吞吐量问题 六 合理设置prefetch
  • RabbitMQ解决消息幂等性问题

    前言 关于MQ消费者的幂等性问题 在于MQ的重试机制 因为网络原因或客户端延迟消费导致重复消费 使用MQ重试机制需要注意的事项以及如何解决消费者幂等性问题以下将逐一讲解 1 RabbitMQ自动重试机制 消费者在消费消息的时候 如果消费者业
  • rabbitmq简介

    开发十年 就只剩下这套Java开发体系了 gt gt gt 1 AMQP AMQP协议是一个高级抽象层消息通信协议 RabbitMQ是AMQP协议的实现 它主要包括以下组件 1 1 Server broker 接受客户端连接 实现AMQP消
  • IBM MQ 故障诊断(一)

    说明 本文主要是针对运维人员的手册 前面部分主要是应用三板斧的方式 后面的步骤可能会发散和具体深入一些 不过也不是严格的划分 读者就当看一遍杂文的方式来看待此文吧 一 队列管理器的启停 QMGR的启停是故障诊断中遇到最多的需求之一 启动队列
  • 《吃透 MQ 系列》之Kafka精妙的高性能设计(下篇)

    在 上一篇文章 中 指出了高性能设计的两个关键维度 计算和 IO 可以将它们理解成 道 同时给出了 Kafka 高性能设计的全景图 可以理解成 术 图 1 Kafka 高性能设计的全景图 这篇文章将继续对存储消息和消费消息的 8 条高性能设
  • RocketMQ-名词和架构

    RocketMQ rocketMQ是做什么的我就不用解释了吧 以及他的背景 本文主要是为了让大家明白RocketMQ的工作原理 架构图 上图 双箭头代表是双向通信 ProducerGroup和ConsumerGroup以及Broker集群
  • rocketmq客户端配置

    1 客户端配置 相对于RocketMQ的Broker集群 生产者和消费者都是客户端 2 客户端寻址方式 RocketMQ可以令客户端找到Name Server 然后通过Name Server再找到Broker 如下所示有多种配置方式 优先级
  • Kafka原理分析

    在基础篇中我们介绍MQ的一些基础原理 这篇文章 我们针对kafka进行较深入的分析 上篇文章中我们提到了kafka中一个名词broker 其实broker可以理解成为一台kafa服务器 kafka的特性和功能 在kafka设计之初是为了实时
  • RocketMQ的消息优先级

    有些场景 需要应用程序处理几种类型的消息 不同消息的优先级不同 RocketMQ是个先入先出的队列 不支持消息级别或者Topic级别的优先级 业务中简单的优先级需求 可以通过间接的方式解决 下面列举三种优先级相关需求的具体处理方法 第一种
  • 如何清除 MassTransit 队列?

    我想在集成测试设置例程中删除队列中的所有消息 如何实现 谷歌搜索 智能感知暴力没有运气 如果重要的话 我使用 RabbitMq 作为传输 无法从 MassTransit 内的队列中 删除 对于测试 您可以通过使用临时的随机队列 URIrab
  • Kafka速度之谜:高性能的幕后秘密大揭秘

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 kafka高性能的原因 Page Cache ZeroCopy 零拷贝 前言 Kafka的介绍 kafka是linkedIn开源的分布式消息系统 归给Ap
  • Java:在后台更新有大量行的 JTable

    我正在编写一个简单的 Java Swing 实用程序 它将从 MQ JMS 服务器读取消息并将它们显示在 JTable 中 private void getMessages try if null Queue Queue close Clo
  • com.ibm.msg.client.jms.DetailedJMSException:JMSWMQ0018:无法使用连接模式“yyy”和主机名“zzz”连接到队列管理器“xxx”

    JMS 应用程序需要七个参数才能与此处给出的 MQ 系列成功建立 SSL 连接 https github com ibm messaging mq tls ssl wizard blob master com ibm mq ssl wiza

随机推荐

  • h5 原生 ajax,原生ajax和axios取消请求实现

    原生ajax中取消请求的方法 const xhr new XMLHttpReques xhr open GET api xhr onreadstatechange gt if xhr readState 4 2 d 2 test xhr s
  • 怎么使用 js 动态生成海报?

    方案一 DOM gt canvas gt image 将目标 DOM 节点绘制到 canvas 画布 然后利用 canvas 相关的 API 以图片形式导出 可简单标记为绘制阶段和导出阶段两个步骤 绘制阶段 选择希望绘制的 DOM 节点 根
  • svn 恢复删除的文件

    本文转载至 http stackoverflow com questions 497670 whats a simple way to undelete a file in subversion If you just did svn rm
  • Retrofit 2.5框架使用与源码分析

    Retrofit 框架使用 请求内容与返回值 使用PostMan进行请求测试 请求 https api github com search repositories q android 返回值 Header 外链图片转存失败 源站可能有防盗
  • C语言中协程(coroutine)实现

    C语言协程库实现说明 代码实现 1 当前支持的功能概览 1 1 创建任意数量协程并在协程中yield include
  • 更新一个表的字段值等于另一个表的字段值

    在进行数据库操作时 有时我们需要把两个关联表中的某个字段同步 即把表1中字段A的值赋值到表2的字段B中 表1和表2通过字段C关联 SQL语句如下所示 Sql sever 和MySql的写法稍有不同 SQL Sever 写法1 update
  • 文件或目录损坏且无法读取怎么删除文件或目录

    解决方法有几种 1 尝试为文件重命名 如果可以重命名的话 运行cmd 打开任务管理器 结束explorer进程 切换到cmd命令提示符状态下输入 Del 文件名 后就可以删除文件了 这种方法只适用于可以重命名的文件 在进行操作时先关闭其他一
  • SpringMvc进阶

    SpringMvc进阶 SpringMVC引言 一 常用注解 二 参数传递 三 返回值 SpringMVC引言 在Web应用程序开发中 Spring MVC是一种常用的框架 它基于MVC Model View Controller 模式 提
  • Java中的抽象类和接口

    目录 一 什么是抽象类 抽象类在实现多态中的意义 二 接口是什么 通过接口实现多态 三 抽象类和接口的区别 各位铁汁们大家好呀 今天让我们继续学习java 看看java中的抽象类和接口到底是什么 一 什么是抽象类 我们之前学过什么是类 那么
  • Jackson常用方法以及jacksonUtil工具类

    前言 项目中我们通常使用ajax返回json数据格式的形式进行前后端数据交互 所以会用到java数据json数据互相转化 通常我们的做法是在项目中创建一个工具类进行转化处理 如下 我的demo包含了项目中常用的jacksonUtil类 以及
  • JDBC连接MySQL出现误com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database

    JDBC连接MySQL出现误com mysql jdbc exceptions jdbc4 MySQLSyntaxErrorException Unknown database test 问题原因 在用连接池进行MySQL连接时出错找不到改
  • UE_sqlite使用

    UE sqlite使用 PS 参考文档 https blog csdn net object article details 102785739 sqlite官方 https www sqlite org download html
  • 结构体中成员的引用

    结构体如下 struct student int num char name 20 char sex float score 1 结构体的初始化 struct student aa 1001 zhang M 80 5 2 引用整个结构体 s
  • Qt中的Q_D宏和d指针

    1 ZTS7QObject 一 Q D的在文件中的提法 Q D的设置意在方便地获取私有类指针 文件为qglobal h 下面的 是宏定义的连字符 假设类名是A 那么A Private翻译过来就是APrivate 1 define Q D C
  • MySQL服务无法启动。服务没有报告任何错误。问题解决!

    项目场景 提示 MySQL服务无法启动 服务没有报告任何错误 问题解决 问题描述 在启动MySQL是遇到问题 提示mysql服务无法启动 服务没有报告任何错误 原因分析 我这里的问题主要是因为你的data文件夹中有影响启动的文件 注意 清空
  • MyBatis-Plus&Druid

    MyBatis Plus Druid MyBatis Plus 核心功能 Spring Boot 集成 Druid 数据源 MyBatis Plus MyBatis Plus 简称 MP 是一个MyBatis 的增强工具 在MyBatis
  • 中兴e8820刷openwrt_中兴E8820V2(电信天翼宽带类似新路由3歌华链)-拆机及OpenWrt固件...

    本帖最后由 yumeimm 于 2020 12 20 10 53 编辑 2020 12更新 增加Openwrt v19 07 5固件 2020 10更新 添加openwrt v19 07 4固件 2020 05更新 添加openwrt v1
  • 什么是NAT?

    NAT是一种地址转换技术 它可以将IP数据报文头中的IP地址转换为另一个IP地址 并通过转换端口号达到地址重用的目的 NAT作为一种缓解IPv4公网地址枯竭的过渡技术 由于实现简单 得到了广泛应用 NAT解决了什么问题 随着网络应用的增多
  • 设计模式--装饰器模式

    装饰器模式 属于结构型模式基本原理 创建一个装饰器用来对一个现有对象添加新功能 不改变对象结构主要流程 1 根据对象创建一个修饰类 该修饰类要保持方法签名完整 2 在修饰类中根据需求添加新的功能 3 使用时将对象或对象的引用传入修饰类中 注
  • rabbitmq简介

    开发十年 就只剩下这套Java开发体系了 gt gt gt 1 AMQP AMQP协议是一个高级抽象层消息通信协议 RabbitMQ是AMQP协议的实现 它主要包括以下组件 1 1 Server broker 接受客户端连接 实现AMQP消