GaussDB(DWS)中共享消息队列实现的三大功能
摘要:本文将详细介绍GaussDB(DWS)中共享消息队列的实现。
本文分享自华为云社区《GaussDB(DWS)CBB组件之共享消息队列介绍》,作者:疯狂朔朔。
1)共享消息队列是什么?
在前文中,我们讲解了SysCache的实现原理,GaussDB(DWS)通过SysCache缓存表元数据,以加速查询,然而在并发查询过程中,不可避免地会出现需要同步元数据的情况,举个简单例子,假设存在以下语句执行流程:
- Create table abc(会话1)
- Select * from abc(会话1)
- Drop table abc(会话2)
- Select * from abc(会话1)
在会话1中,会连续两次执行Select表操作(b和d),在b语句执行后,会话1将对abc的元数据进行缓存,缓存到SysCache中,以备后续使用。然而,在c语句执行后,需要对会话1中的元数据进行失效,否则,会话1将在执行d语句过程中发生错误,读取已删除的数据。
那么,会话2如何“通知”会话1失效哪些数据呢?答案是共享消息队列。
2)共享消息队列存储结构
如图所示,为共享消息队列数据结构
图示中主要包括两部分,下面部分为ThreadLocal结构,主要记录的是每个线程内部的数据,线程间数据是独立的,无法互相访问,上面部分为共享消息队列中的数据,共享消息队列存在于共享内存中,可同时被多个线程访问,共享消息队列的访问场景是典型的一写多读场景。
在共享消息队列中,核心变量有三个,nextMsgNum、minMsgNum、MaxMsgNum,其中nextMsgNum记录了每个线程消息读取到的位置,minMsgNum记录了共享消息队列中最早消息的位置,maxMsgNum记录了共享消息队列中最新消息的位置,对于每个线程而言,需要定期(在表加锁/事务开始/收到信号时触发)从共享消息队列中读取失效消息,利用失效消息(共享消息队列中的每个消息)更新线程内部数据,同时,若线程内部产生失效消息(通常DDL语句在事务提交时产生大量失效消息),则需要向共享消息队列中插入失效数据,供其他线程读取。另外,还有两个参数,hasMessages、resetState,其中hasMessages用于标记对应线程是否存在未读取的失效消息,resetState用于标记对应线程是否需要失效全部消息。
NOTE:失效数据有哪些?失效消息一共有六类(源自PG),有兴趣的同学可以研读PG源码,在此处我们不再展开,仅需知道线程需要从共享消息队列中读取/插入消息,以实现数据同步。
3)共享消息队列接口实现
共享消息队列本质上对于外部接口只需要提供三个功能:读取共享消息队列中消息、向共享消息队列中写入消息、清理共享消息队列。
3.1)读取共享消息队列
如图所示,为失效消息读取过程。在线程同步失效消息过程中,有几个关键点:
- 若共享内存中线程对应的hasMessage为True,则表示有失效消息需要读取,否则直接返回,无新的失效消息。
- 读取失效消息过程中,需要持有读共享锁,以保证读取的消息不会被清理掉。
- 若读取失效消息过程中,发现resetState被置为True,说明该线程已经无法使用共享消息队列中的消息进行追增,需要对缓存进行全失效。缓存全失效相当于追增全部数据,需要将nextMsgNum置为maxMsgNum。缓存全失效将严重降低SQL执行性能,尽量减少缓存全失效的发生频率。
- 在追增数据过程中,会推进线程自身的nextMsgNum,以标记数据追增位置。
NOTE:在读取共享消息队列过程中,每个线程推进自己的nextMsgNum位置,以方便记录数据追增情况。
3.2)向共享消息队列中写入消息
如图所示,为失效消息写入过程。有以下几个关键点:
- 写入失效消息过程,需要调用清理共享消息队列接口,以保证有足够多的空位写入失效消息。
- 在写入失效消息过程中,会更新maxMsgNum。
- 写入失效消息完毕以后,需要将其他线程的hasMessage标记为True。
- 写入失效消息过程,需要持排他写锁,阻塞其他线程写操作,但不阻塞读。
NOTE:写入失效消息过程实际上是推进maxMsgNum的过程,同时告知其他线程有新的失效消息需要读取。
3.3)清理共享消息队列
如图所示,清理共享消息队列过程中,有以下几个关键点:
- 清理共享消息队列需要持有排他读锁和排他写锁,阻塞读过程。其主要原因是,清理共享消息队列会推进minMsgNum,若不持读锁,可能导致nextMsgNum读取过期数据。
- 清理共享消息队列会推进minMsgNum。
- 清理共享消息队列过程,会将所有没有及时追增失效消息的线程执行全失效。
- 在清理共享消息队列最后步骤,会对距离minMsgNum最近的线程,发送追增信号,以确保不会频繁发生全失效。该步骤主要考虑的情况是,若线程长时间处于idle状态,需要外部信号触发其及时追增消息。
NOTE:清理共享消息队列过程,实际上是推进minMsgNum的过程,同时对所有没有及时追增失效消息的线程执行全失效。
根据以上共享消息队列接口可知,读取共享消息队列主要负责推进各个线程自身的nextMsgNum;写入失效消息主要负责推进maxMsgNum;清理共享消息队列主要负责推进minMsgNum。通过共享消息队列,可有效实现各个线程之间的数据同步。
点击关注,第一时间了解华为云新鲜技术~
GaussDB(DWS)中共享消息队列实现的三大功能相关推荐
- 【Android 异步操作】手写 Handler ( Message 消息 | ThreadLocal 线程本地变量 | Looper 中的消息队列 MessageQueue )
文章目录 一.Message 消息 二.ThreadLocal 线程本地变量 三.Looper 中的消息队列 MessageQueue 一.Message 消息 模仿 Android 中的 Messa ...
- OSSIM中分布式消息队列应用
OSSIM中分布式消息队列应用 1. 消息队列处理 企业日志数量正在以指数级形式高速增长,日志数据的具有海量.多样.异构等特点,基于传统的单一节点混合式安装的OSSIM平台(指OSSIM 4.4及以 ...
- python队列来做什么_python分布式爬虫中的消息队列是什么?
当排队等待人数过多的时候,我们需要设置一个等待区防止秩序混乱,同时再有新来的想要排队也可以呆在这个地方.那么在python分布式爬虫中,消息队列就相当于这样的一个区域,爬虫要进入这个区域找寻自己想要的 ...
- RTOS中的消息队列的原理以及应用
消息队列的原理 RTOS中的消息队列是一种用于任务间通信的机制,它可以实现任务之间的异步通信,从而实现任务间的解耦.消息队列是一个先进先出的数据结构,任务可以向队列中发送消息,也可以从队列中接收消息. ...
- 智能家居DIY连载教程(2)——在实际项目中运用消息队列与邮箱
前言 千呼万唤始出来,智能家居 DIY 教程连载第二篇终于登场了!本文将重点给大家介绍如何将消息队列与邮箱运用到实际项目中去.一起来看看吧~ DIY 回顾上期: 1.智能家居DIY连载教程(1)--如 ...
- Linux中的消息队列、共享内存,你确定都掌握了吗?
消息队列(message queue) 消息队列是消息的链表,存放在内存中,由内核维护 消息队列的特点 1.消息队列中的消息是有类型的. 2.消息队列中的消息是有格式的. 3.消息队列可以实现消息的随 ...
- 详解SpringCloud中RabbitMQ消息队列原理及配置,一篇就够!
作者:kosamino cnblogs.com/jing99/p/11679426.html 一.MQ用途 1.同步变异步消息 场景:用户下单完成后,发送邮件和短信通知. 运用消息队列之后,用户下单完 ...
- C#中使用消息队列服务
C#中使用Windows消息队列服务 http://www.cnblogs.com/xinhaijulan/archive/2010/08/22/1805768.html http://h2appy. ...
- win7系统中的消息队列服务器,高手分析win7系统安装消息队列的详细
win7系统是计算机学员最喜欢使用的电脑系统,却有一些学员在操作过程中应该会面临对win7系统安装消息队列进行布置的情景.几乎所有的初学者计算机知识还很薄弱,关于win7系统安装消息队列的情况,仍旧一 ...
最新文章
- C++中的Socket编程使用协议发送图片
- Cesium入门11 - Interactivity - 交互性
- 图文方式管理Linux服务器(Webmin)
- pwntools用docker实现,进行pwn题解答
- 中断技术之中断的定义,中断服务程序的设计方法,中断处理的过程以及中断向量表的建立
- 利用go语言创建web server的两种方式
- Android事件总线
- PST转换软件 v6.3
- 浅谈Js对象的概念、创建、调用、删除、修改!
- C语言链表翻转的三种实现方式(栈、头插法、递归法)
- 喜马拉雅FM下载的音频文件保存在哪_怎么导出来
- 工商管理专业的毕业论文怎么选题?
- 2021-07-27 Vue修改主页
- C++重学之路 1 计算机和C++简介
- 学习通考试刷题(ocs网课助手)
- 【Android Studio】Android Studio 搭建开发环境(Linux Ubuntu篇)
- nginx限制ip访问次数
- 2021年中国电子商务政策汇总分析:电子商务行业体系不断完善,跨境电商、农村电商蓬勃发展[图]
- 【方法】如何使用DeepMask和SharpMask
- css弹性布局笔记一(垂直居中、水平居中、居中)(display:flex)