分布式技术之分布式消息队列通信

文章目录

    • 什么是消息队列?
    • 消息队列的原理
      • 消息队列工作原理
      • RocketMQ 消息队列原理及工作机制

什么是消息队列?

  • 队列是一种具有先进先出特点的数据结构,消息队列是基于队列实现的,存储具有特定格式的消息数据,比如定义一个包含消息类型、标志消息唯一性的 ID、消息内容的一个结构体作为消息数据的特定格式。消息以特定格式放入这个队列的尾部后可以直接返回,并不需要系统马上处理,之后会有其他进程从队列头部开始读取消息,按照消息放入的顺序逐一处理。引入消息队列的好处是,提高响应速度,以及实现组件间的解耦。
    在这里插入图片描述

消息队列的原理

消息队列工作原理

  • 消息队列的核心结构,如下图所示。与发布订阅模式类似,消息队列模式也是包括 3 个核心部分:
    • 生产者。生产者会产生消息或数据,并将消息或数据插入到消息队列中。
    • 消息队列。一种具有先进先出特点的数据结构,用于存储消息。
    • 消费者。从消息队列中获取消息或数据,进行相关处理。
  • 具体流程是,生产者将发送的消息插入消息队列,也就是入队,之后会有一个消费者从消息队列中逐次取出消息进行处理,完成出队。
    在这里插入图片描述

RocketMQ 消息队列原理及工作机制

RocketMQ 的架构图
在这里插入图片描述

  • RokcetMQ 共包括 NameServer ClusterProducer ClusterBroker ClusterConsumer Cluster 共 4 部分。接下来,看看每部分的具体功能吧。
    • NameServer Cluster,指的是名字服务器集群。这个集群的功能与 Kafka 中引入的 ZooKeeper 类似,提供分布式服务的协同和管理功能,在 RocketMQ 中主要是管理 Broker 的信息,包括有哪些 Broker、Broker 的地址和状态等,以方便生产者获取 Broker 信息发布消息,以及订阅者根据 Broker 信息获取消息。
    • Producer Cluster,指的是生产者集群,负责接收用户数据,然后将数据发布到消息队列中心 Broker Cluster。那么,生产者按照集群的方式进行部署,好处可以概括为以下两点:
      • 一是,多个 Producer 可以并发接收用户的输入数据,提升业务处理效率;
      • 二是,考虑到可靠性问题,如果只有一个 Producer 接收用户输入数据,当这个 Producer 故障后,整个业务就无法运行了。
    • Consumer Cluster,指的是消费者集群,负责从 Broker 中获取消息进行消费。Consumer 以集群方式进行部署的好处是,提升消费者的消费能力,以避免消息队列中心存储溢出,消息被丢弃。
    • Broker Cluster,指的是 Broker 集群,负责存储 Producer Cluster 发布的数据,以方便消费者进行消费。 Broker Cluster 中的每个 Broker 都进行了主从设计,即每个 Broker 分为 Broker Master 和 Broker Slave,Master 既可以写又可以读,Slave 不可以写只可以读。每次 Broker Master 会把接收到的消息同步给 Broker Slave,以实现数据备份。一旦 Broker Master 崩溃了,就可以切换到 Broker Slave 继续提供服务。这种设计的好处是,提高了系统的可靠性。

Broker Cluster 的实现方式

  • 在 Broker Cluster 中,消息的存储采用主题(Topic)+ 消息队列(Queue)的方式实现:
    在这里插入图片描述
  • 与 Kafka 一样,RocketMQ 中的主题也是一个逻辑概念。一个主题可以分区,分布在各个不同的 Broker 中,每个 Broker 上只有该主题的部分数据。每个主题分区中,队列的数量可以不同,由用户在创建主题时指定。队列是资源分配的基本单元,消息进行存储时会存放到相应主题的分区中。

RocketMQ 的工作流程
在这里插入图片描述

  1. 首先启动 NameServer,然后启动 Broker。Broker 启动后,会主动找 NameServer 建立连接,并将自己的信息注册到 NameServer 上。注册完毕后,Broker 会周期性地给 NameServer 发送心跳包,比如每隔 1s 发送一次,以告知 NameServer 自己还活着;心跳包里还可以包括 Broker 当前存储的数据信息,也就是说 Broker 可以周期性地向 NameServer 更新自己的数据信息,以保证 NameServer 上存储的数据是最新的。
  2. 创建主题,并确定这个主题的数据放入哪些 Broker 中。
  3. 当 Producer 生产消息发送到主题时,需要先到 NameServer 查询该主题存放在哪些 Broker 中,获取到相关 Broker 信息后,将消息发送给这些 Broker 进行存储。
  4. Consumer 要从主题消费消息,也需要首先到 NameServer 查询一下该主题的消息存储在哪些 Broker 上,然后去相应的 Broker 获取消息进行消费。

消息队列模式适用于什么场景

  • 消息队列模式,是根据消费者需求到消息队列获取数据消费的,消费者只需要知道消息队列地址即可,消息队列中心也无需提前知道消费者信息。也就是说,这种模式对消费者没有特别需求,因此比较适合消费者为临时用户的场景。比如目前,阿里内部将 RocketMQ 应用于购物交易、充值、消息推送等多个场景,因为在这些场景下,每个消费者不是常驻进程或服务,几乎都是临时存在。此外,滴滴、联想等公司也都有采用 RocketMQ。

知识扩展:发布订阅和消息队列模式都支持系统解耦,两者是否一致呢?
概括地说,发布订阅和消息队列模式虽然都支持系统解耦,但它们在实现时采用的数据结构和方式并不相同。
首先,我们看一下它们实现解耦的数据结构。
发布订阅模式采用了消息中心,消息队列模式采用了消息队列中心,它们均用来存储生产者发布的数据,并均有主题、Broker 等概念;
唯一不同之处,是消息队列模式中采用了具有先进先出特征的队列结构进行存储,而订阅发布采用了 map 或数组等方式存储。
然后,我们再看看它们实现解耦的方式。
消息队列模式中,生产者发布数据到消息队列中心,消息队列中心会存储数据,等待消费者按需获取数据。这样生产者就不需要和消费者进行直接通信了,实现了生产者和消费者的解耦。
而在发布订阅模式中,消费者需要提前向消息中心订阅自己感兴趣的数据,待生产者发布数据到消息中心后,消息中心根据订阅者订阅信息将数据主动推送给消费者,也实现了消费者和生产者的解耦。
对于消息队列模式,消息队列中心无需提前获取消费者信息,因此对消费者比较灵活,适合消费者为临时用户的场景;而发布订阅模式,需要消费者提前向消息中心订阅消息,也就是说消息中心需要提前获取消费者信息,比较适合消费者为长驻进程或服务的场景。

你知道的越多,你不知道的越多。

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

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

相关文章

scanf函数返回值被忽略

心怀希望的前进 前言 最近在复习c语言,发现了许多之前不了解的知识,今天想来与大家分享一下scanf返回值值被忽略的问题。 很多人应该都在vs中见到过,我们先说原因,再说改进方法 原因: scanf函数在读取数据时不会检…

【Week-P3】CNN天气识别

文章目录 一、环境配置二、准备数据三、搭建网络结构四、开始训练五、查看训练结果六、总结6.1 不改变学习率的前提下,将训练epoch分别增加到50、60、70、80、90(1)epoch 50 的训练情况如下:(2)epoch 60 …

nodejs微信小程序+python+PHP的艺术展览馆艺术品管理系统-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

自检服务器,无需服务器、不用编程。

自检服务器,无需服务器、不用编程。 大家好,我是JavaPub. 这几年自媒体原来热,很多人都知道了个人 IP 的重要性。连一个搞中医的朋友都要要做一个自己的网站,而且不想学编程、还不想花 RMB 租云服务。 老读者都知道&#xff0c…

main参数传递、反汇编、汇编混合编程

week03 一、main参数传递二、反汇编三、汇编混合编程 一、main参数传递 参考 http://www.cnblogs.com/rocedu/p/6766748.html#SECCLA 在Linux下完成“求命令行传入整数参数的和” 注意C中main: int main(int argc, char *argv[]), 字符串“12” 转为12,可以调用atoi…

直方图与均衡化

直方图 统计图像中相同像素点的数量。 使用cv2.calcHist(images, channels, mask, histSize, ranges)函数 images:原图像图像格式为uint8或float32,当传入函数时应用[]括起来,例如[img]。 channels:同样用中括号括起来&#xff…

准备用vscode代替sourceinsight

vscode版本1.85.1 有的符号,sourceinsight解析不到。 看网上说vscode内置了ripgrep,但ctrlshiftf在文件里查找的时候,速度特别慢,根本不像ripgrep的速度。ripgrep的速度是很快的。 但今天再查询,速度又很快了&#x…

Java内存模型(JMM)详解

1. 介绍 1.1 JMM概述 Java内存模型(Java Memory Model简称JMM)是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的…

Vue2+element-ui 实现select选择器结合Tree树形控件实现下拉树效果

效果&#xff1a; DOM部分 &#xff1a; // 设置el-option隐藏的下拉选项&#xff0c;选项显示的是汉字label&#xff0c;值是value // 如果不设置一个下拉选项&#xff0c;下面的树形组件将无法正常使用 <el-form-item label"报警区域" prop"monitorId"…

ACM32F403/F433 12 位多通道国产芯片,支持 MPU 存储保护功能,应用于工业控制,智能家居等产品中

ACM32F403/F433 芯片的内核基于 ARMv8-M 架构&#xff0c;支持 Cortex-M33 和 Cortex-M4F 指令集。芯片内核 支持一整套DSP指令用于数字信号处理&#xff0c;支持单精度FPU处理浮点数据&#xff0c;同时还支持Memory Protection Unit &#xff08;MPU&#xff09;用于提升应用的…

stm32中的i2c协议

stm32中I2C 文章目录 stm32中I2CI2C 协议简介I2C物理层协议层I2C基本读写过程 **通讯的起始和停止信号****数据有效性****地址及数据方向****响应** STM32的I2C特性及架构**STM32** **的** I2C外设简介STM32 的 I 2C 架构剖析通讯引脚 通讯过程主发送器主接收器 I2C初始化结构体…

隧道代理HTTP工作原理:一场奇妙的网络魔法表演

嘿&#xff0c;小伙伴们&#xff01;今天我们要一起探索一个有趣的话题——隧道代理HTTP的工作原理。这不是普通的表演&#xff0c;而是一场奇妙的网络魔法表演&#xff01; 首先&#xff0c;让我们想象一下&#xff0c;网络世界就像一个大舞台&#xff0c;而我们每个人都是这…