当前位置: 首页 > news >正文

【消息中间件】RocketMQ设计浅析

RocketMQ

目录

  • RocketMQ
    • 前言
      • 为什么使用MQ(优点)
      • MQ的缺点
    • RocketMQ设计浅析
      • 几个概念
        • 消息生产
        • 消息消费
        • 消息存储
      • 数据存储设计(持久化)
        • producer端
        • consumer端
    • FAQ
      • 高可用
      • 如何保证消息不重复消费
      • 消息可靠性传输

前言

为什么使用MQ(优点)

  1. 服务之间的解耦

  2. 异步的场景

  3. 高并发下削峰

MQ的缺点

  1. 服务可用性降低
  2. 系统复杂性增加

RocketMQ设计浅析

几个概念

nameServerbroker

producer consumer

topictagqueue

消息的一个生命周期概括下来就是:生产、存储、消费

生产消息
消费消息
producer
MQ存储
consumer

消息生产

producer

消息生产者,生产消息的服务

消息消费

consumer

消息消费者,消费生产者投放在MQ中的消息

消息存储

nameServer

nameServerRocketMQ的服务注册中心(类似zookeeper),用来保存broker元信息,管理topicbroker路由信息

broker

broker是消息存储中心,用于存储producer生产的消息,同时还存储一些元信息,包括队列信息、消费进度偏移量;

broker集群
master
salve
salve
nameServer注册中心

需先启动nameServer再启动broker

(1)broker启动时,会注册到nameServer

(2)nameServerbroker保持长链接,间隔30秒检查broker是否存活,超过两分钟没有心跳,则断开连接;

(3)producer生产消息,会根据topicnameServer获取到broker的路由信息,进而和broker取得连接;

Topic

消息主题,对存储的消息进行逻辑分类

Tag

消息标签,topic的下一层级对消息更细粒度的分类

消费者可订阅指定主题,来消息该主题下的消息

同一个消费者组下的消费者实例订阅的消息topictag必须完全一致

订阅关系:rocketMQ系统中消费者获取消息、处理消息的规则和状态配置。订阅关系按照消费者分组和主题粒度进行设计。

consumerGroupB
consumerGroupA
topic
订阅
订阅
订阅
订阅
订阅
订阅
consumer
consumer
consumer
consumer
consumer
consumer
tagA
topic
tagB
producer

MessageQueqe

消息队列,消息实际存储单元容器,一个主题包含一个或多个队列

consumerGroup
producer
topic
queue
queue1
queue2
consumer
consumer
consumer
producer
producer
producer
message...message...
message...message...
message...message...

数据存储设计(持久化)

  1. commitlog文件:存储消息主体。写入消息过程中追求极致的磁盘顺序写性能,所有主题的消息写入一个文件,并将第一个消息的物理偏移量作为文件名。

(消息在文件中的物理地址 = 消息偏移量 - 文件名)

  1. consumequeue文件:逻辑消息队列,commitlog文件基于topic的索引文件,保存了指定topic下的队列消息在commitlogoffsetsizetaghashcode

commitLogconsumequeue 文件的关联:消息直接进入 commitLog 文件,存储实际内容;之后 broker 通过定时任务 ReputService 每1ms将消息的偏移量写入 consumequeue。)

  1. indexfile为索引数据文件提供访问服务,根据key进行消息查询

producer端

持久化
写消息
写入
OS后台线程异步刷盘
ack
消息位置写入
consumequeue
commitlog
indexfile
producer
broker
PageCache

consumer端

读消息
消息offset
消息
consumer
consumequeue
commitlog

FAQ

高可用

namesvr集群、 broker集群 + 主从

如何保证消息不重复消费

消息消费完,会发送确认信息,消息显示consumed_success
意外的情况,消息消费了,但是MQ刚好重启,消息没有消费成功的状态,就会再被消费一次。消费者保证,消费幂等。

消息可靠性传输

  1. 生产者生产消息,可能由于网络问题,没有发送到MQ,程序会抛异常,重试机制

  2. MQ的问题,服务意外挂掉 ,持久化机制,在重启后将持久化数据加载到内存

  3. 消费者将消息弄丢,确认机制自动关闭改为手动,只有当消息消费完成,才发送确认ack

本节完~~

相关文章:

  • C语言学习完后,C++与Java我应该怎么选择
  • SpringCloud Bus消息总线
  • 图形学-反走样/抗锯齿
  • 2.1.5操作系统之线程概念与多线程模型
  • Spring中的AOP概念介绍使用、AOP相关术语、切入点表达式(面向切面编程上篇)
  • heic图片转换
  • 数据分析 | Pandas 200道练习题,每日10道题,学完必成大神(2)
  • 2017年某高校848数据结构真题复习
  • python正态分布中的normal函数
  • 场景金融持续引发行业关注,4.0时代打造金融服务新生态
  • 大数据面试重点之mysql篇
  • 【网络安全篇】JavaSript基础内容大全
  • 【数据结构与算法】时间复杂度和空间复杂度
  • 问:毁掉一个人,有多容易?答:年龄到了就可以
  • 最新|全新风格原创YOLOv7、YOLOv5和YOLOX网络结构解析图
  • SegmentFault for Android 3.0 发布
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • [译] 怎样写一个基础的编译器
  • 2017前端实习生面试总结
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Idea+maven+scala构建包并在spark on yarn 运行
  • JavaScript实现分页效果
  • Linux链接文件
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • SpiderData 2019年2月25日 DApp数据排行榜
  • vue学习系列(二)vue-cli
  • 电商搜索引擎的架构设计和性能优化
  • 精彩代码 vue.js
  • 前端路由实现-history
  • 浅谈Golang中select的用法
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 正则表达式
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ​渐进式Web应用PWA的未来
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #etcd#安装时出错
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (003)SlickEdit Unity的补全
  • (1)(1.11) SiK Radio v2(一)
  • (2020)Java后端开发----(面试题和笔试题)
  • (4) PIVOT 和 UPIVOT 的使用
  • (4)Elastix图像配准:3D图像
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (算法设计与分析)第一章算法概述-习题
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (一)VirtualBox安装增强功能
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)iOS字体
  • (转)机器学习的数学基础(1)--Dirichlet分布