(四) MdbCluster分布式内存数据库——业务消息处理
 
 
  离上次更新文章已有快5个月,我还是有点懒。但我们系统的研发并没有因此停下来。下面先简单介绍下MdbCluster最近的一些进展。
  1. 提供了java语言的jdbc驱动。做这个目的是想将业务侧的现有自动化测试案例跑起来,以此扩大系统的测试场景。
  2. 提供SQL命令行界面,解决日常分片数据查询操作问题。对于分片数据库,如果操作数据要到每一片去执行操作语句显然是不合适的。
  3. 多业务接入。最早MdbCluster只接入一个业务系统,随着测试的深入我们接入了更多的业务系统。并在此基础上优化了在线扩缩容的能力。
 
  下面我们继续讨论第二节中提到的最后一个问题:业务消息是如何校验、错误消息如何重定向、超时消息如何处理?
  我们先回顾下业务消息的大概处理流程:在MdbClient、MdbAgent、MdbRWNode都会保存一份完整的SlotList列表,以标明每个数据分片对应的节点。当业务消息从App通过dbc驱动发给MdbClient后,MdbClient会根据partitionid来计算数据的所属分片。并根据计算结果将消息转发给不同分片节点的 MdbAgent,其会对收到数据进行第一次较验。如果有错,会将消息返回,并带上正确的分片信息。MdbClient收到分片错误回复后,会进行消息重定向。如果没错,消息会传给本节点的MdbRWNode进行执行,如果是Insert操作,MdbRWNode则会再次较检数据是否正确。

  1. 业务消息如何校验,为什么需要校验?
  上面提到了消息的校验过程。MdbClient进行的第一次较验是为了找到正确的分片信息。MdbAgent进行第二次较验是为了保证收到的数据都是归属本分片的。在插入操作时,MdbRWNode进行第三次较验,双重较验保证本分片的新增数据不会出错。
  之所以设计这个看上去冗余的较验流程,主要是考虑在线扩缩容的场景下,MdbClient、MdbAgent、MdbRWNode三者的SlotList列表并非一直是一致的。当出现前两者(MdbClient和MdbAgent)不一致场景时,MdbAgent的较验保证分片节点入口数据的准确。而MdbRWNode除了接收MdbAgent的消息,还会收到其它进程的消息请求,因此需要增加校验保证不会往某个分片插入非本分片的数据(否则可能出现脏数据,这点是不可接受的)。
 
  2. 错误消息如何重定向?
  当进行扩缩容的数据迁移时,MdbAgent会最先收到某个slot的更新信息。MdbClient则最后才能收到。在MdbClient收到slot更新前,其所发出的关于这个slot的消息,都属于错误消息。考虑最大程度减少扩缩容时对正常业务的影响,MdbAgent在返回错误时,会带上正确分片的信息。MdbClient收到重定向消息时,会进行消息重定向,以继续正常流程。
  
  3. 超时消息如何处理?
  首先要讨论一下超时消息是如何产生的。当进行扩缩容操作,对某个slot进行数据迁移时,MdbAgent会对这个slot的数据进行锁定(可读不可写)。当数据迁移完毕后,才会放开。关于一个slot的锁定时间长短和库的大小成线性关系。假设库大小在163W条时,每个slot的锁定期大概为0.5秒(可以优化)。MdbClient在收到锁定期数据返回时,当然可以进行重试。但MdbAgent和MdbClient之间可能出现循环的消息风暴。并且App和MdbClient之间会有最大值为一个锁定期的消息队列堵塞(可能有300-500条堵塞消息)。对于一个实时系统来说这是不可接受的。由于在线消息刚好碰到某个slot锁定的概率(1/16384)较低,即当TPS压力为16384时每秒会遇到一条。因此,对于锁定消息,MdbClient会直接返回给App,由App进行相关处理。
 
  4. 多分片消息处理
  当一个查询为全表扫描或者涉及多个分片的数据操作时,MdbClient会分解这些操作,并将这些操作分别发向对应的分片节点。假设对一个有5个分片节点的库进行一次全表查询。MdbClient会给5个分片分别发送一条查询信息,在分别收到5条返回结果时,MdbClient会转发这5条消息给App的dbc驱动。由App的dbc驱动进行数据的汇总。最终,App会收到完整的数据。两个问题:
  a) 分片信息对App是隔离的,App的dbc驱动是如何知道要等待多少条返回信息? 诀窍在于,MdbClient在拆分消息时,会将拆分条数放在请求消息里面。消息返回时,拆分条数也会跟着带回。dbc驱动根据这个条数就知道需要等待的消息数。
  b) 为什么是dbc驱动等待,而不是MdbClient等待?由于dbc驱动的操作是同步的,MdbClient是异步的。所以放在dbc驱动进行消息等待并不会影响系统的效率。
 
  下一章我们会讨论一下在线扩缩容的架构设计,以及迁移数据的状态控制。

(四) MdbCluster分布式内存数据库——业务消息处理的更多相关文章

  1. (一) MdbCluster分布式内存数据库——基础架构介绍

    (一) MdbCluster分布式内存数据库--基础架构介绍   这个项目是怎么开始的我已经有些记不清楚了,大概是原来的内存数据库很不好用,一次次地让我们踩坑,我又自以为是地觉得可以做一个更好的出来. ...

  2. (二) MdbCluster分布式内存数据库——分布式架构1

    (二) MdbCluster分布式内存数据库--分布式架构1   分布式架构是MdbCluster的核心关键,业界有很多相关的实现,却很少有文章详细的解释每个架构实现背后的细节和这么做的原因.在Mdb ...

  3. (三) MdbCluster分布式内存数据库——节点状态变化及分片调整

    (三) MdbCluster分布式内存数据库--节点状态变化及分片调整   上一篇: (二) MdbCluster分布式内存数据库--分布式架构   昨天我们在测试节点动态扩缩容时,发现了一个小bug ...

  4. (四):C++分布式框架——状态中心模块

    (四):C++分布式框架--状态中心模块 上篇:(三):C++分布式实时应用框架--系统管理模块 技术交流合作QQ群:436466587 欢迎讨论交流 版权声明:本文版权及所用技术归属smartguy ...

  5. [.net 面向对象程序设计进阶] (25) 团队开发利器(四)分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境

    [.net 面向对象程序设计进阶] (25) 团队开发利器(四)分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境 本篇导读: 前面介绍了两款代码管理工具 ...

  6. MVC5+EF6 简易版CMS(非接口) 第四章:使用业务层方法,以及关联表解决方案

    目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...

  7. 17 个方面,综合对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 四个分布式消息队列

    原文:https://mp.weixin.qq.com/s/lpsQ3dEZHma9H0V_mcxuTw 一.资料文档 二.开发语言 三.支持的协议 四.消息存储 五.消息事务 六.负载均衡 七.集群 ...

  8. 综合对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 四个分布式消息队列

    来源:http://t.cn/RVDWcfe 一.资料文档 Kafka:中.有kafka作者自己写的书,网上资料也有一些.rabbitmq:多.有一些不错的书,网上资料多.zeromq:少.没有专门写 ...

  9. hadoop基础----hadoop理论(四)-----hadoop分布式并行计算模型MapReduce具体解释

    我们在前一章已经学习了HDFS: hadoop基础----hadoop理论(三)-----hadoop分布式文件系统HDFS详细解释 我们已经知道Hadoop=HDFS(文件系统,数据存储技术相关)+ ...

  10. MeayunDB-高性能分布式内存数据库

    MeayunDB(www.meayun.com)是一款分布式的NoSQL列式内存数据库,由C#编写,主要为高性能,高并发,高可伸缩及大数据系统提供技术解决方案.基于MeayunDB,可以简单,快速的构 ...

随机推荐

  1. C++重载的奥义之运算符重载

    0.引言 重载,顾名思义从字面上理解就是重复装载,打一个不恰当的比方,你可以用一个篮子装蔬菜,也可以装水果或者其它,使用的是同一个篮子,但是可以用篮子重复装载的东西不一样. 正如在之前的文章<重 ...

  2. 做个清醒的程序员之拥抱AI

    阅读时长约 13 分钟,共计约 3100个字. 昨天我体验了AI自动生成短视频,具体说来,首先我在域名为FreeGPT的免费网站,向它提问,然后生成一段文字.之后呢,再用剪映里面的"图文成片 ...

  3. Java方法的返回值及注意事项

    方法的返回值 为什么要有带返回值的方法呢? 调用处拿到方法的结果之后,才能根据结果进行下一步操作 带返回值方法的定义和调用: 如果在调用处,要根据方法的结果去编写另一段代码逻辑 为了在调用处拿到方法产 ...

  4. 关于 import 和 import static

    import 嘛,就是导包.比如说java的一些自带的包,例如 import java.lang.Matn: 又或者我们自己做的包,例如 import com.link.testImport; 一些实 ...

  5. office办公套件基础教程

    正文 1.网页端的应用-office全家桶 这里我选择先聊web端的应用,首先,我们来想象一下,只要你有网络,有浏览器,就能打开一个网页,在网页上进行编辑.处理一些word.报表.ppt等,你不需要复 ...

  6. 2022-10-07:给定员工的 schedule 列表,表示每个员工的工作时间。 每个员工都有一个非重叠的时间段 Intervals 列表,这些时间段已经排好序。 返回表示 所有 员工的 共同,正

    2022-10-07:给定员工的 schedule 列表,表示每个员工的工作时间. 每个员工都有一个非重叠的时间段 Intervals 列表,这些时间段已经排好序. 返回表示 所有 员工的 共同,正数 ...

  7. 2021-08-28:给定一个正数数组arr,长度一定大于6(>=7),一定要选3个数字做分割点,从而分出4个部分,并且每部分都有数,分割点的数字直接删除,不属于任何4个部分中的任何一个。 返回有没有

    2021-08-28:给定一个正数数组arr,长度一定大于6(>=7),一定要选3个数字做分割点,从而分出4个部分,并且每部分都有数,分割点的数字直接删除,不属于任何4个部分中的任何一个. 返回 ...

  8. react中useRef的应用

    何为useRef useRef是随着react函数式组件发展而来的,是react众多官方hook中的一个,调用useRef可以返回一个伴随这组件整个声明周期不发生改变的对象,这个对象常见的用途有两个: ...

  9. Blazor HyBrid 授权讲解

    Blazor HyBrid 授权讲解 本文介绍 ASP.NET Core 对 Blazor Hybrid 应用中的安全配置和管理及 ASP.NET Core Identity 的支持. Blazor ...

  10. 让你的代码动起来:Python进度条神器tqdm详解及应用实例

    各位Python高手,今天我要给大家介绍一个好用的库,它就是:tqdm tqdm在阿拉伯语中的意思是 "进展",所以这个库也被称为 "快速进展条".不得不说,这 ...