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

news/2024/4/20 19:55:49/文章来源:https://blog.csdn.net/maray/article/details/130963682

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.luyixian.cn/news_show_310834.aspx

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

相关文章

小白如何快速入门?

入门 Web 安全、安卓安全、二进制安全、工控安全还是智能硬件安全等等,每个不同的领域要掌握的技能也不同。当然入门 Web 安全相对难度较低,也是很多人的首选。主要还是看自己的兴趣方向吧。 本文就以下几个问题来说明网络安全大致学习过程&#x1f447…

如何用Python写个网页爬取程序

如何用Python写个网页爬取程序 准备开发工具安装PythonPython安装pipPip安装爬取插件准备好网页地址代码实现 准备开发工具 额,作者用的是vscode。具体怎么安装自行百度哈,这个都不会建议就不要学爬取了。 不忍心藏着也,给你个方法吧 vsc…

Javascript的闭包,匿名函数,自动调用

这里写目录标题 验证文本框HTMLJavascript分析var引起的赋值错误最优的解决方案forEach(function(item){})最简单的方式,const/let 申明一个局部变量直接使用函数通过声明函数变量的方式定义函数申明匿名函数和自动调用函数的区别 在案例的基础上分析。 验证文本框 …

90后测试员:“入职阿里,这一次,我决定不跳槽了...”

所谓“舒适”生活 记得上一份工作是去年听从了朋友的意见,“你一定要找一份舒适的工作,这样你一天就有好多时间玩,好多时间干自己想干的事情,摸鱼真香!” 在这份“教导”下,开始了我的找工作之旅&#xf…

内网穿透技术

文章目录 前言1. 安装JAVA2. MCSManager安装3.局域网访问MCSM4.创建我的世界服务器5.局域网联机测试6.安装cpolar内网穿透7. 配置公网访问地址8.远程联机测试9. 配置固定远程联机端口地址9.1 保留一个固定tcp地址9.2 配置固定公网TCP地址9.3 使用固定公网地址远程联机 转载自内…

【正点原子STM32连载】 第二十五章 TFT-LCD(MCU屏)实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id609294757420 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第二十…

没有硬件资源?免费使用Colab搭建你自己的Stable Diffiusion在线模型!保姆级教程...

部署 Stable Diffusion 需要一定的硬件资源,具体取决于要处理的图像大小和处理速度等因素。一般来说,至少需要一台具有较高计算能力的服务器,而对 GPU 的高要求就限制了我们学习和使用SD来生成我们想要的图像。 GPU是深度学习开发的重要硬件条…

chatgpt赋能python:Python列表分割与排序:完美解决数据处理问题

Python列表分割与排序:完美解决数据处理问题 在Python的开发实践中,数据处理是一项必不可少的操作。列表(list)是Python语言中常用的数据类型之一,列表中的元素可以是任意类型。列表的分割和排序是Python中常见的操作…

数字孪生:数字世界与现实世界的交汇

数字孪生是一种崭新的技术,指将现实世界中的物理实体、系统或过程通过数字化技术在虚拟数字世界中建立起虚拟模型。数字孪生可以帮助人们以更小的成本地理解和预测现实世界中的物理实体、系统或过程的行为和性能,从而提高生产效率、降低成本、减少风险等。 如今数字孪生技术…

【CSS3系列】第三章 · CSS3新增边框和文本属性

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

【Python 文本分析】零基础也能轻松掌握的学习路线与参考资料

Python 常用的文本分析工具有很多,如 Natural Language Toolkit (NLTK)、TextBlob、spaCy、Jieba等。本文将分别介绍这些工具及其对应的学习路线、参考资料和优秀实践。 Natural Language Toolkit (NLTK) Natural Language Toolkit (NLTK) 是 Python 中文本分析研…

如何申请免费ChatGPT 2500刀初创金

近日OpenAI 推出了OpenAI for Startups项目,那么什么是Startups项目呢: 它是由全球知名的人工智能研究公司 OpenAI 推出的一个开放式的创业计划,旨在为初创公司提供一种新的激励机制和技术推广方式。 也就是说我们可以用自己账号申请&#x…

记一次Java生成SQL脚本文件换行格式为window/unix的笔记

今天在做一个SQL脚本文件生成需求,其中,需要设置: 文件编码为:UTF-8文件换行格式为:UNIX UTF-8这个好说,因为java代码可以指定文件编码,如: 但是Unix换行格式就很神奇了&#xff0…

快手三面全过了,却因为背调时leader手机号造假,导致offer作废了!

这是一个悲伤的故事: 快手本地三面全过了,但因为背调时leader手机号造假,导致offer作废了。 楼主感叹:大家背调填写信息时,一定要慎重再慎重,不要重复他的悲剧! 网友愤慨,照这么说&a…

OSPF最优路径选择

路由比较 1、内部区域>区域间路由>NSSA1>Nssa2 2、如果只有Ex1、Ex2或者Nssa1、nNssa2开销类型。则Ex1>Ex2或者Nssa1>Nssa2 3、如果Ex1、Nssa1,Ex2和Nssa2,Ex1和Nssa1优于Ex2和Nssa2 4、如果外部开销加上内部开销,Ex1和Nssa1一样,则Ex1和Nssa1相同负载分担 5、如果外…

京东工作8年,肝到T8就剩这份心得了,已助朋友拿到10个Offer

在京东工作了8年,工作压力大,节奏快,但是从技术上确实得到了成长,尤其是当你维护与大促相关的系统的时候,熬到T7也费了不少心思,小编也是个爱学习的人,把这几年的工作经验整理成了一份完整的笔记…

【TreeSet集合】比较器排序Comparator的使用

比较器排序Comparator的使用 存储学生对象并遍历,创建TreeSet集合使用带参构造方法 要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序 创建学生类: package com.gather.set.treeset; public class Stude…

C语言——分段函数求值

一、题目描述 二、题目分析 本题是简单的分段函数的求解&#xff0c;应学会合理的运用for\if\swich函数解答问题。 三、代码实现 //for语句解题#include <stdio.h> int main() {int x,y;scanf("%d",&x);if(x<1){yx;}else if(1<x && x<…

win10微软Edge浏览器通过WeTab新标签页免费无限制使用ChatGPT的方法,操作简单,使用方便

目录 一、使用效果 二、注册使用教程 1.打开Edge浏览器扩展 2.选择Edge浏览器外接程序 3.搜索WeTab 4.进入管理扩展 5.启用扩展 ​编辑 6.进入WeTab新标签页 7.打开Chat AI 8.注册 9.使用 ChatGPT是OpenAI推出的人工智能语言模型&#xff0c;能够通过理解和学习人类…

不要再重复造轮子了,这几款开源工具类库贼好使

在实际项目开发中&#xff0c;从稳定性和效率的角度考虑&#xff0c;重复造轮子是不被提倡的。但是&#xff0c;自己在学习过程中造轮子绝对是对自己百利而无一害的&#xff0c;造轮子是一种特别能够提高自己系统编程能力的手段。 基于 SpringBoot Vue uni-app 实现的全套电商…