脚本宝典收集整理的这篇文章主要介绍了GaussDB(DWS)中共享消息队列实现的三大功能,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
摘要:本文将详细介绍GaussDB(DWS)中共享消息队列的实现。
本文分享自华为云社区《GaussDB(DWS)CBB组件之共享消息队列介绍》,作者:疯狂朔朔。
在前文中,我们讲解了SysCache的实现原理,GaussDB(DWS)通过SysCache缓存表元数据,以加速查询,然而在并发查询过程中,不可避免地会出现需要同步元数据的情况,举个简单例子,假设存在以下语句执行流程:
在会话1中,会连续两次执行Select表操作(b和d),在b语句执行后,会话1将对abc的元数据进行缓存,缓存到SysCache中,以备后续使用。然而,在c语句执行后,需要对会话1中的元数据进行失效,否则,会话1将在执行d语句过程中发生错误,读取已删除的数据。
那么,会话2如何“通知”会话1失效哪些数据呢?答案是共享消息队列。
如图所示,为共享消息队列数据结构
图示中主要包括两部分,下面部分为ThreadLocal结构,主要记录的是每个线程内部的数据,线程间数据是独立的,无法互相访问,上面部分为共享消息队列中的数据,共享消息队列存在于共享内存中,可同时被多个线程访问,共享消息队列的访问场景是典型的一写多读场景。
在共享消息队列中,核心变量有三个,nextMsgNum、minMsgNum、MaxMsgNum,其中nextMsgNum记录了每个线程消息读取到的位置,minMsgNum记录了共享消息队列中最早消息的位置,maxMsgNum记录了共享消息队列中最新消息的位置,对于每个线程而言,需要定期(在表加锁/事务开始/收到信号时触发)从共享消息队列中读取失效消息,利用失效消息(共享消息队列中的每个消息)更新线程内部数据,同时,若线程内部产生失效消息(通常DDL语句在事务提交时产生大量失效消息),则需要向共享消息队列中插入失效数据,供其他线程读取。另外,还有两个参数,hasMessages、resetState,其中hasMessages用于标记对应线程是否存在未读取的失效消息,resetState用于标记对应线程是否需要失效全部消息。
NOTE:失效数据有哪些?失效消息一共有六类(源自PG),有兴趣的同学可以研读PG源码,在此处我们不再展开,仅需知道线程需要从共享消息队列中读取/插入消息,以实现数据同步。
共享消息队列本质上对于外部接口只需要提供三个功能:读取共享消息队列中消息、向共享消息队列中写入消息、清理共享消息队列。
如图所示,为失效消息读取过程。在线程同步失效消息过程中,有几个关键点:
NOTE:在读取共享消息队列过程中,每个线程推进自己的nextMsgNum位置,以方便记录数据追增情况。
如图所示,为失效消息写入过程。有以下几个关键点:
NOTE:写入失效消息过程实际上是推进maxMsgNum的过程,同时告知其他线程有新的失效消息需要读取。
如图所示,清理共享消息队列过程中,有以下几个关键点:
NOTE:清理共享消息队列过程,实际上是推进minMsgNum的过程,同时对所有没有及时追增失效消息的线程执行全失效。
根据以上共享消息队列接口可知,读取共享消息队列主要负责推进各个线程自身的nextMsgNum;写入失效消息主要负责推进maxMsgNum;清理共享消息队列主要负责推进minMsgNum。通过共享消息队列,可有效实现各个线程之间的数据同步。
点击关注,第一时间了解华为云新鲜技术~
以上是脚本宝典为你收集整理的GaussDB(DWS)中共享消息队列实现的三大功能全部内容,希望文章能够帮你解决GaussDB(DWS)中共享消息队列实现的三大功能所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。