基于电商场景的高并发RocketMQ实战-NameServer内存中核心数据模型分析、内核级Producer发送消息流程

本文主要是介绍基于电商场景的高并发RocketMQ实战-NameServer内存中核心数据模型分析、内核级Producer发送消息流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

NameServer 内存中核心数据模型分析

NameServer 中关键的数据模型结构如下:

  • clusterAddrTable:存储 Broker 集群表,其中 Broker01 表示第一个 Broker 分组

    clusterAddrTable: {BrokerCluster01: [Broker01, Borker02]
    }
    
  • brokerAddrTable:存储 Broker 地址表,存储了每个 Broker 分组的信息,以及该 Broker 分组中每个主从 Broker 的地址

    brokerAddrTable: [{Broker01: {cluster: BrokerCluster01,brokerAddrs: [0/*brokerId,用于区分主从*/: ip:port,1/*brokerId,用于区分主从*/: ip:port]},Broker02: {cluster: BrokerCluster01,brokerAddrs: [0/*brokerId,用于区分主从*/: ip:port,1/*brokerId,用于区分主从*/: ip:port]}}
    ]
    
  • brokerLiveTable:存储活跃的 Broker,其中 haServerAddr 存储与当前 Broker 互为主备的 Broker 地址

    brokerLiveTable: {ip:port: {lastUpdateTimestamp: xxxx,haServerAddr: ip:port}
    }
    
  • topicQueueTable:存储 Topic 在每个 Broker 中的队列数量

    topicQueueTable: {Topic01: [{brokerName: Broker01,readQueueNums: 4,writeQueueNums: 4},{brokerName: Broker02,readQueueNums: 4,writeQueueNums: 4}]
    }
    

内核级 Producer 发送消息流程

消息生产者发送消息根据 Topic 进行发送:

  1. 根据 Topic 找到这个 Topic 的 Queue 再每台 Broker 上的分布,进行负载均衡
  2. 通过负载均衡选择一个队列,根据 topicQueueTable 可以知道该 Queue 是属于哪一个 Broker 的
  3. 那么接下来就查找到 Broker 主节点(根据 brokerId 判断),将数据发送到这个 Broker 主节点中,再写入对应的 Queue

那么如果当前消息发送到当前 Broker 组失败的话,在一段时间内就不会选择当前出现故障的 Queue了,会重新选择其他的 Broker 组中的 Queue 进行发送

选择 Broker 以及发送失败流程图如下图黄色部分所示:

在这里插入图片描述

RokcetMQ 的 NameServer 中是有 故障的延迟感知机制 ,即当 Broker 出现故障时,对于生产者来说,并不会立即感知到该 Broker 故障

NameServer 中虽然每隔 10s 中会去检查是否有故障 Broker,将故障 Broker 剔除掉,但是此时生产者的 Topic 缓存中还是有故障 Broker 的信息的,只有等 30s 之后刷新,才可以感知到这个 Broker 已经故障了

通过这个 故障的延迟感知机制 可以避免去做许多麻烦的操作,如果 Broker 挂掉之后,要让生产者立马感知到,需要通过 NameServer 去通知许多 Producer,并且如果通知丢失,还是有向故障 Broker 发送消息的可能!

这篇关于基于电商场景的高并发RocketMQ实战-NameServer内存中核心数据模型分析、内核级Producer发送消息流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/527826

相关文章

Python在二进制文件中进行数据搜索的实战指南

《Python在二进制文件中进行数据搜索的实战指南》在二进制文件中搜索特定数据是编程中常见的任务,尤其在日志分析、程序调试和二进制数据处理中尤为重要,下面我们就来看看如何使用Python实现这一功能吧... 目录简介1. 二进制文件搜索概述2. python二进制模式文件读取(rb)2.1 二进制模式与文本

Django调用外部Python程序的完整项目实战

《Django调用外部Python程序的完整项目实战》Django是一个强大的PythonWeb框架,它的设计理念简洁优雅,:本文主要介绍Django调用外部Python程序的完整项目实战,文中通... 目录一、为什么 Django 需要调用外部 python 程序二、三种常见的调用方式方式 1:直接 im

SQL Server 中的表进行行转列场景示例

《SQLServer中的表进行行转列场景示例》本文详细介绍了SQLServer行转列(Pivot)的三种常用写法,包括固定列名、条件聚合和动态列名,文章还提供了实际示例、动态列数处理、性能优化建议... 目录一、常见场景示例二、写法 1:PIVOT(固定列名)三、写法 2:条件聚合(CASE WHEN)四、

Spring Boot 中 RestTemplate 的核心用法指南

《SpringBoot中RestTemplate的核心用法指南》本文详细介绍了RestTemplate的使用,包括基础用法、进阶配置技巧、实战案例以及最佳实践建议,通过一个腾讯地图路线规划的案... 目录一、环境准备二、基础用法全解析1. GET 请求的三种姿势2. POST 请求深度实践三、进阶配置技巧1

Java中的CompletableFuture核心用法和常见场景

《Java中的CompletableFuture核心用法和常见场景》CompletableFuture是Java8引入的强大的异步编程工具,支持链式异步编程、组合、异常处理和回调,介绍其核心用法,通过... 目录1、引言2. 基本概念3. 创建 CompletableFuture3.1. 手动创建3.2.

SpringBoot整合 Quartz实现定时推送实战指南

《SpringBoot整合Quartz实现定时推送实战指南》文章介绍了SpringBoot中使用Quartz动态定时任务和任务持久化实现多条不确定结束时间并提前N分钟推送的方案,本文结合实例代码给大... 目录前言一、Quartz 是什么?1、核心定位:解决什么问题?2、Quartz 核心组件二、使用步骤1

Java线程池核心参数原理及使用指南

《Java线程池核心参数原理及使用指南》本文详细介绍了Java线程池的基本概念、核心类、核心参数、工作原理、常见类型以及最佳实践,通过理解每个参数的含义和工作原理,可以更好地配置线程池,提高系统性能,... 目录一、线程池概述1.1 什么是线程池1.2 线程池的优势二、线程池核心类三、ThreadPoolE

Springboot请求和响应相关注解及使用场景分析

《Springboot请求和响应相关注解及使用场景分析》本文介绍了SpringBoot中用于处理HTTP请求和构建HTTP响应的常用注解,包括@RequestMapping、@RequestParam... 目录1. 请求处理注解@RequestMapping@GetMapping, @PostMappin

MySQL游标和触发器的操作流程

《MySQL游标和触发器的操作流程》本文介绍了MySQL中的游标和触发器的使用方法,游标可以对查询结果集进行逐行处理,而触发器则可以在数据表发生更改时自动执行预定义的操作,感兴趣的朋友跟随小编一起看看... 目录游标游标的操作流程1. 定义游标2.打开游标3.利用游标检索数据4.关闭游标例题触发器触发器的基

SpringBoot整合AOP及使用案例实战

《SpringBoot整合AOP及使用案例实战》本文详细介绍了SpringAOP中的切入点表达式,重点讲解了execution表达式的语法和用法,通过案例实战,展示了AOP的基本使用、结合自定义注解以... 目录一、 引入依赖二、切入点表达式详解三、案例实战1. AOP基本使用2. AOP结合自定义注解3.