基于电商场景的高并发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

相关文章

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

C#提取PDF表单数据的实现流程

《C#提取PDF表单数据的实现流程》PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景,凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用,本文将探讨如何使用... 目录引言使用工具C# 提取多个PDF表单域的数据C# 提取特定PDF表单域的数据引言PDF表单是一

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

Linux alias的三种使用场景方式

《Linuxalias的三种使用场景方式》文章介绍了Linux中`alias`命令的三种使用场景:临时别名、用户级别别名和系统级别别名,临时别名仅在当前终端有效,用户级别别名在当前用户下所有终端有效... 目录linux alias三种使用场景一次性适用于当前用户全局生效,所有用户都可调用删除总结Linux

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf