OceanBase并行执行中 DTL消息接收处理的逻辑

news2024/11/17 0:56:21

OceanBase 并行执行的消息处理框架是很有意思的,里面用到了不少面向对象编程思想,值得分析。 DTL 从宏观上看可以分为三大部分:

  • DTL 消息发送
  • DTL 消息缓存
  • DTL 消息处理

本文介绍 DTL 消息处理。

核心组件

DTL 消息缓冲区

DTL 消息缓冲区是 DTL 在网络上收发数据的基本单位。

数据结构:ObDtlLinkedBuffer

DTL 消息

DTL 消息是业务消息的基本单位,例如行消息、SQC执行完成消息、Datahub Barrier消息等等。

数据结构:ObBarrierPieceMsgObDynamicSamplePieceMsg 等等

通用 DTL 消息 Processor

通用 Processor 是 DTL 框架层的一个消息分发器,负责从 DTL 消息缓冲区中读出一个 DTL 消息,从消息头识别出消息类型,并调用对应的 DTL 消息 Processor 对象 来进一步处理该消息。

数据结构: ObDtlChannelLoopProc

DTL 消息 Processor

它负责处理特定类型的 DTL 消息。有多少类消息,就有多少类 Proc 对象。Proc 对象具备两个能力:

  • 反序列化 DTL 消息
  • 处理 DTL 消息

数据结构:ObPxFinishSqcResultP, ObPxInitSqcResultP ,ObDynamicSamplePieceMsgP 等等

DTL Channel

DTL Channel 是点对点的传输通道的抽象结构,DTL 消息缓冲区就是通过 DTL Channel 在机器之间传输。DTL Channel 具备如下功能:

  • 从 DTL 网络或DTL Cache 中读出 DTL 消息缓冲区
  • 调用通用 DTL 消息 Processor 来处理 DTL 消息缓冲区

数据结构:ObDtlBasicChannel, ObDtlLocalChannel, ObDtlRpcChannel

Loop 对象

Loop 负责驱动整个消息循环。具体地,它会做如下事情:

  • Loop 上会注册所有 DTL 消息 Processor 到一个 map 上,并将 map 设置到通用 DTL 消息 Processor 上。
  • 根据用户指示,Loop 在指定 DTL Channel 接收 DTL 消息缓冲区,并驱动 DTL Channel 处理该消息。
    • DTL Channel 收到 DTL 消息缓冲区 后,会调用通用 DTL 消息 Processor 来处理该缓冲区。
    • 通用 DTL 消息 Processor 根据缓冲区中读出的 header 信息将缓冲区分发给DTL 消息 Processor 做进一步处理。
    • DTL 消息 Processor 会对 DTL 消息 做反序列化、并调用业务层处理逻辑

组件关系图

在这里插入图片描述

从这个图中可以看出,Loop 是整个处理流程的入口。无论有多少个 DTL 消息,无论 DTL 缓冲区从网络上到来的顺序是否有并发,因为 Loop 是单线程的,PX 整个框架的消息处理顺序也是单线程的,无需处理并发问题。这个基础的设计保证了 PX 的健壮性。

反思

这个架构有何弊端?

主要问题点在新消息的添加上,每次新加一个消息,要修改多处代码,编程不便。

ObDtlChannelLoopProc 需要一个 proc_map,要求 map 中包含所有消息类型的 Proc。

  class ObDtlChannelLoopProc : public ObIDtlChannelProc
  {
  public:
    ObDtlChannelLoopProc(uint16_t &last_msg_type,  Proc **proc_map)
      : last_msg_type_(last_msg_type), proc_map_(proc_map)
    {}
    virtual int process(const ObDtlLinkedBuffer &, bool &transferred) override;

    uint16_t &last_msg_type_;
    Proc **proc_map_;
  };

如果ObDtlChannelLoopProc 遇到一个未注册的消息类型,会报错。这导致每增加一个消息类型,就要在用到 Loop 的地方注册一遍消息 Proc。有没有一个更简单的编程方式,新消息处理无需到处修改代码?

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

不懂这10个命令,别说你会调试网络设备

我的网工朋友大家好啊 好久没跟你们聊思科设备了。 虽然目前大方向上,企业用的设备越来越偏向国产化,学习华为、华三等厂商知识的人也越来越多。 但不可否认的是,思科仍然是厂商老大哥。 交换机、路由器这两块,思科占的全球市场…

若依框架请求magic-api接口出现Uncaught (in promise) error Promise.then (async)

错误描述: 在若依前端向magic-api发请求,实际上收到了返回的数据,但是仍出现错误提示。 错误截图: 猜测的原因: 请求参数错误返回参数错误magic-api内部语法错误 排除原因 在magic-api中仅返回一个数,同…

ChatGPT浪潮席卷,维智科技以时空AI赋能数实融合的未来城市

作者 | 伍杏玲 出品 | CSDN 每个时代都有新的技术浪潮,但在短短两年时间里见证两项颠覆全球的技术发展,实在出人意料之外:2021年以来,元宇宙成为互联网产业新风口,今年ChatGPT成为IT圈“顶流”,这两者为地…

Java访问QingCloud青云QingStor对象存储(公有云、私有云)

一、参考API 官网SDK文档参考:Java SDK - 公有云文档中心 (qingcloud.com) 二、环境说明 公有云跟私有云区别: 使用公有云QingStor,直接按照官网sdk直接可对接,私有云QingStor的话,需要设置具体的私有云请求地址及z…

chatgpt赋能python:Python中构造函数的名称

Python中构造函数的名称 作为一名有10年Python编程经验的工程师,我深知Python语言中构造函数的重要性。在本文中,我将着重介绍Python中构造函数的名称,并阐述其在Python编程中的作用。 什么是构造函数? 构造函数是一种特殊类型…

【C#学习记录】添加控件后工具箱不显示是什么原因

大家好,我是雷工! 今天在一个Winform程序中用到将WindowsMediaPlayer控件添加到工具箱,但添加了好几次,工具箱内均无法显示,经翻找资料和验证确认是跟创建项目时选择的模板有关,为了遇到同样问题的小伙伴能…

荣获用友年度十佳产业融合生态伙伴称号 | 图扑软件

2023 年 4 月 20 日,由中华全国工商业联合会联合工业和信息化部、国务院国资委组织开展的 2023 年度“百场万企”大中小企业融通对接活动——智能制造 MES 产业融通对接会暨 2023 用友 BIP 技术大会 MES 生态创新专题论坛在用友产业园顺利召开。 用友年度生态合作伙…

C语言学习分享(第九次)------数据的存储

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C语言学习分享⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多C语言知识   🔝🔝 数据的存储 1. 前言🚩2…

符合国情的supabase私有化部署(0)

符合国情的supabase私有化部署(0) 符合国情的supabase私有化部署(0) 前言开源 BaaS 解决方案快速开始 获取部署文件服务明细 容器启动后创建一个前端app注册邮箱SMTP协议jwt token和kong网关配置并应用更改数据库密码k8s 部署参考尾言常见问题 name resolution failedInvalid …

Python:Python编程:从入门到实践__超清版:Python标准库

Python标准库 1. OrderedDict2. threading三级目录 Python标准库是一组模块,按照的Python都包含了它,我们只需要在程序开头包含一条简单的 import 语句,就可以使用标准库中的任何函数和类。 下面我介绍几个重点 标准库 os : 提供一些与操作系…

Word控件Aspose.Words教程:使用 Java 处理 SXC 和 FODS 文件

Aspose.Words是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word。 Aspose API支持流行文件格式处理,并…

NUC980编译错误,multiple target patterns(多个目标匹配)

1:问题: 昨天环境编译的还是没问题的,今天就出错了 : Makefile:133: *** multiple target patterns. Stop 此时:make make clean make disclean 都不可以使用了,报一样的错误。 2:解决办法&…

二叉搜索树的操作、模拟实现、应用以及性能的介绍

一、二叉搜索树 1. 性质 (1)如果左子树不是空,那么左子树上的所有节点的值都小于根节点的值 (2)如果右子树不是空,那么右子树上的所有节点的值都大于根节点的值 (3)左右子树也分别为…

Redis的网络模型

计算机硬件包括CPU,内存,网卡 为了避免用户应用和操作系统内核产生冲突乃至内核崩溃,用户应用和内核是隔离开的 1)进程的寻址空间会被划分成两部分,内核空间和用户空间,内核和用户应用都无法直接访问物理内存&#xff…

【Linux】在Ubuntu上部署web项目(Ubuntu版本为16.04.7,jdk1.8、mysql5.7、tomcat9.0.48)

介绍 这里是小编成长之路的历程,也是小编的学习之路。希望和各位大佬们一起成长! 以下为小编最喜欢的两句话: 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡。 一个人为什么要努力&a…

河道水位监测:河道水位监测用什么设备

中国地形复杂,气候多样,导致水资源分布不均,洪涝和干旱等问题时有发生。同时,人类活动也对水资源造成了很大压力,工业和农业用水增加,河道水位下降,生态环境受到威胁。因此,对河道水…

【面向对象三大特性之继承】

目录 1.什么是继承2.父类成员访问2.1 子类访问父类的成员变量2.1.1 子类和父类不存在同名成员变量2.1.2 子类和父类存在同名成员变量 2.2子类中访问父类的成员方法2.2.1. 成员方法名字不同2.2.22. 成员方法名字相同 3.super关键字4.子类构造方法5.super和this的异同点6.代码块的…

可视化探索开源项目的 contributor 关系

引语:作为国内外最大的代码托管平台,根据最新的 GitHub 数据,它拥有超 372,000,000 个仓库,其中有 28,000,000 是公开仓。分布式图数据库 NebulaGraph 便是其中之一,同其他开源项目一样,NebulaGrpah 也有自…

用arcgis for javascript 开发一个三维地图(入门案例)

效果如图: 详细的步骤就不啰嗦介绍了,大家可以参考上一篇文章二维地图入门案例,这里只是改了一点引用和属性而已。 核心代码: SceneView 用于创建三维地图 require([“esri/Map”, “esri/views/SceneView”] 这里提一句有两种…

vue项目中的环境变量的应用

vue项目中的环境变量的应用 在Vue项目中使用环境变量可以方便地在开发、测试、生产等不同环境中进行配置,而无需修改代码。 项目根目录下创建一个.env文件或者.env.[mode]文件,其中mode表示开发、测试、生产等不同的环境,文件名的后缀部分指…