【RabbitMQ 二】RabbitMQ基本组成、交换器类型、RabbitMQ生产消费消息流程、信道Channel、AMQP协议

RabbitMQ入门

1.RabbitMQ基本组成

RabbitMQ有一些基本的组成单元:

  1. Producer:消息的生产者
  2. Consumer:消息的消费者
  3. Broker:RabbitMQ的服务节点。形象一点说就是一个Broker等同于一台RabbitMQ服务器,可以接收Producer的消息,并存储消息与队列中,最终将消息发送给Consumer
  4. Queue:存储消息
    1. 注意,RabbitMQ的消息只能存储在Queue中,而Kafka将消息存储于topic的逻辑层面,Kafka的队列逻辑只是topic实际存储文件上的位移
    2. 多个消费者订阅同一个队列中的消息时,队列中的消息只能被一个消费者处理(即RabbitMQ不支持队列层面上的广播)
  5. Exchange:交换器,位于生产者和队列中间。实际上,所有Producer生产的消息,并不是直接被Producer写入队列,而是由Producer将消息交给Exchange,再由Exchange决定要将消息写入哪个队列中。这个写入消息的过程,也可以叫做“路由
  6. Routing Key:路由键。上面说Exchange将消息写入Queue的过程就是路由,那么对于一个Exchange来说,RabbitMQ中有很多个Queue,Exchange可能需要具备区分每一个Queue的能力。
    1. 举个例子,Producer将消息发给Exchange的时候,一般要指定一个Routing Key,Exchange会使用该Routing Key和每个队列的Binding Key匹配上了,如果相同,就将消息写入对应的队列
    2. 在某些场景下,Routing Key其实和Binding Key是相同的

2.Exchange类型

  1. fanout:将所有发送到该Exchange的消息路由到所有与该Exchange绑定的Queue上
  2. direct:将所有发送到该Exchange的消息路由到RoutingKey和BindingKey完全匹配的Queue上
  3. topic:因为RoutingKey和BindingKey都是用 . 分隔的字符串(类似于java的包名),topic类型的Exchange支持使用* # 作为通配符来制定模糊匹配RoutingKey、BindingKey的规则
  4. header:不依赖RoutingKey来路由消息,而是根据发送的消息头(header属性)进行匹配

3.生产消息流程

消息生产者发送消息流程如下:

  1. Producer连接到RabbitMQ Broker,建立连接(Connection),开启信道(Channel)
  2. Producer声明一个交换器Exchange并设置相关属性
  3. Producer声明一个队列Queue并设置相关属性
  4. Producer通过路由键RoutingKey将Exchange和Queue绑定起来
  5. Producer发送消息到Broker
  6. Broker的Exchange根据路由键查找匹配的队列
    1. 如果找到,Exchange将消息存入队列中
    2. 如果没找到,丢弃或者退回消息
  7. 关闭信道、连接

4.消费消息流程

消费者消费消息的流程如下:

  1. Consumer连接到RabbitMQ Broker,建立连接(Connection),开启信道(Channel)
  2. Consumer向Broker请求消费某个队列的消息,并等待Broker发送消息
  3. Consumer接收消息,并返回确认信息ack
  4. RabbitMQ从队列中删除已经被Consumer确认的消息
  5. 关闭信道、连接

5.信道Channel

其实只要一个生产者和Broker建立了Connection就能够实现通信,一个Connection对应一条TCP连接。但是通常情况下,生产者并不需要一直向向Broker发送消息,这就会降低Connection的使用效率。

因此,RabbitMQ使用了多路复用的概念,类似于Java IO中的selector模型。来自不同生产者(也可以是相同生产者)的线程复用一个Connection,每个生产线程和Connection之间建立一个逻辑连接就是Channel。这样,能够大大降低Connection(TCP连接)的连接数量

6.AMQP协议

AMQP协议,全称是Advanced Message Queuing Protocol(高级消息队列协议)。RabbitMQ可以看做是AMQP协议的落地实现。

AMQP协议模型和RabbitMQ是一致的:

  • 生产者将消息发送给交换器
  • 交换器和队列绑定
  • 生产者的消息中携带的路由键如果和绑定时的绑定键匹配时,消息就会被存入相应的队列中
  • 消费者可以订阅队列来获取消息

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux工具

本期我们来学习Linux的相关工具,这是我们未来经常使用的一些工具,是必须掌握的技能 目录 Linux 软件包管理器 yum rzsz Linux编辑器-vim使用 三种模式的切换 命令模式命令集 底行模式命令集 vim的配置 解决sudo的白名单问题 Linux编辑器—gcc/…

MacBook Pro 原生安装 Ubuntu 24.04 ARM 版

趁着休假整理家里闲置的设备,看到了一台许久不用的 M2 芯片的 MacBook Pro,想着或许应该把它改造成 ARMv64 的 CI/CD 构建机,于是就有了这篇文章。 本篇文章适用于 M1、M2 全系列的设备,包括:MacBook Air、MacBook Pr…

基于Java的智慧社团综合管理系统的设计与实现(论文+源码)_kaic

摘 要 随着校园文化的不断丰富,大学里各种社团越来越多,社团活动也越来越频繁,社员也越来越多,而且大学生退社、入社比较频繁,社团管理就显得非常繁琐而又复杂,如果采用人工管理,对管理员来说将是一件很头疼的事情。设…

加州大学欧文分校英语中级语法专项课程02:Adjectives and Adjective Clauses 学习笔记

Adjectives and Adjective Clauses course certificate 本文是 https://www.coursera.org/learn/adjective-clauses 这门课的学习笔记。 文章目录 Adjectives and Adjective ClausesWeek 01: Adjectives and Adjective PhrasesLearning Objectives Adjectives Introduction Le…

解码Starknet Verifier:深入逆向工程之旅

1. 引言 Sandstorm为: 能提交独立proof给StarkWare的Ethereum Verifier,的首个开源的STARK prover。 开源代码见: https://github.com/andrewmilson/sandstorm(Rust) L2Beat 提供了以太坊上Starknet的合约架构图&…

单链表经典算法

一,移除链表元素 思路一 遍历数组,如果遇到链表中的元素等于val的节点就执行删除操作 typedef struct ListNode ListNode;struct ListNode* removeElements(struct ListNode* head, int val) {if(headNULL){return NULL;} ListNode*pnewhead(ListNode*)m…

14.集合、常见的数据结构

集合 概念 Java中的集合就是一个容器,用来存放Java对象。 集合在存放对象的时候,不同的容器,存放的方法实现是不一样的, Java中将这些不同实现的容器,往上抽取就形成了Java的集合体系。 Java集合中的根接口&#x…

MVC和DDD的贫血和充血模型对比

文章目录 架构区别MVC三层架构DDD四层架构 贫血模型代码示例 充血模型代码示例 架构区别 MVC三层架构 MVC三层架构是软件工程中的一种设计模式,它将软件系统分为 模型(Model)、视图(View)和控制器(Contro…

前端工程化03-贝壳找房项目案例JavaScript常用的js库

4、项目实战(贝壳找房) 这个项目包含,基本的ajax请求调用,内容的渲染,防抖节流的基本使用,ajax请求工具类的封装 4.1、项目的接口文档 下述接口文档: 简述内容baseURL:http://123.207.32.32…

SQL——高级教程【菜鸟教程】

SQL连接 左连接:SQL LEFT JOIN 关键字 左表相当于主表,不管与右表匹不匹配都会显示所有数据 右表就只会显示和左表匹配的内容。 //例显示:左表的name,有表的总数,时间 SELECT Websites.name, access_log.count, acc…

【机器学习-15】决策树(Decision Tree,DT)算法介绍:原理与案例实现

前言 决策树算法是机器学习领域中的一种重要分类方法,它通过树状结构来进行决策分析。决策树凭借其直观易懂、易于解释的特点,在分类问题中得到了广泛的应用。本文将介绍决策树的基本原理,包括熵和信息熵的相关概念,以及几种经典的…

上位机开发PyQt5(二)【单行输入框、多行输入框、按钮的信号和槽】

目录 一、单行输入框QLineEdit QLineEdit的方法: 二、多行输入框QTextEdit QTextEdit的方法 三、按钮QPushButton 四、按钮的信号与槽 信号与槽简介: 信号和槽绑定: 使用PyQt的槽函数 一、单行输入框QLineEdit QLineEdit控件可以输入…

双向链表专题

文章目录 目录1. 双向链表的结构2. 双向链表的实现3. 顺序表和双向链表的优缺点分析 目录 双向链表的结构双向链表的实现顺序表和双向链表的优缺点分析 1. 双向链表的结构 注意: 这⾥的“带头”跟前面我们说的“头节点”是两个概念,带头链表里的头节点…

Redis 实战1

SDS Redis 只会使用 C 字符串作为字面量, 在大多数情况下, Redis 使用 SDS (Simple Dynamic String,简单动态字符串)作为字符串表示。 比起 C 字符串, SDS 具有以下优点: 常数复杂度获取字符串…

JavaEE >> Spring MVC(2)

接上文 本文介绍如何使用 Spring Boot/MVC 项目将程序执行业务逻辑之后的结果返回给用户,以及一些相关内容进行分析解释。 返回静态页面 要返回一个静态页面,首先需要在 resource 中的 static 目录下面创建一个静态页面,下面将创建一个静态…

[嵌入式系统-53]:嵌入式系统集成开发环境大全 ( IAR Embedded Workbench(通用)、MDK(ARM)比较 )

目录 一、嵌入式系统集成开发环境分类 二、由MCU芯片厂家提供的集成开发工具 三、由嵌入式操作提供的集成开发工具 四、由第三方工具厂家提供的集成开发工具 五、开发工具的整合 5.1 Keil MDK for ARM 5.2 IAR Embedded Workbench(通用)、MDK&…

01.本地工作目录、暂存区、本地仓库三者的工作关系

1.持续集成 1.持续集成CI 让产品可以快速迭代,同时还能保持高质量。 简化工作 2.持续交付 交付 3.持续部署 部署 4.持续集成实现的思路 gitjenkins 5.版本控制系统 1.版本控制系统概述2.Git基本概述3.Git基本命令 2.本地工作目录、暂存区、本地仓库三者的工作关系…

抖音评论区精准获客自动化获客释放双手

挺好用的,评论区自动化快速获客,如果手动点引流涨,那就很耗费时间了,不是吗? 网盘自动获取 链接:https://pan.baidu.com/s/1lpzKPim76qettahxvxtjaQ?pwd0b8x 提取码:0b8x

leetcode84柱状图中最大的矩形

题解&#xff1a; - 力扣&#xff08;LeetCode&#xff09; class Solution {public int largestRectangleArea(int[] heights) {Stack<Integer> stack new Stack<>();int maxArea Integer.MIN_VALUE;for(int i 0;i < heights.length;i){int curHeight hei…

YOLOV8添加SKATTENTION

修改ultralytics.nn.modules._init_.py https://zhuanlan.zhihu.com/p/474599120?utm_sourcezhihu&utm id0 https://blog.csdn.net/weixin 42878111/article/details/136060087 https://blog.csdn.net/gg 51511878/aricle/details/138002223 . 最后输出层不一样。
最新文章