非正式全面解析NebulaGraph中Session管理
NebulaGraph论坛最近有些讨论帖,各种姿势来问NebulaGraphSession管理相关的事情,我寻思这也不是一个法子,还是来写一篇文章来讲述下NebulaGraph中的Session管理。由于本文设定为非正式的Session讲解,所以本文主要分为理论和实操部分,在实操部分主要摘录了论坛用户的一些关于Session的理解,以及本人对Session相关问题的解答。客户端交互流程
在之前的源码解读系列的客户端部分,我们讲过Session相关的知识点,这里来回顾下。
通过下图你能了解客户端和服务端连接时,背后的工作原理:
简单来说,整个workflow由ConnectionPool、Session、Connection构成,用户通过Session和计算引擎进行交互,但真正和计算引擎graphd发生数据处理关系的是连接池当中的Connection。ConnectionPool
在连接池初始化阶段,用户使用Session之前需要先创建并初始化一个连接池ConnectionPool,连接池会在初始化时会对用户指定的NebulaGraph服务所在地址建立连接Connection。如果在用集群部署方式部署了多个Graph服务,连接池会采用轮询的策略来平衡负载,对每个地址建立近乎等量的连接。
连接池如何管理连接Connection呢?连接池内维护了两个队列,空闲连接队列idleConnectionQueue和使用中的连接队列activeConnectionQueue,连接池会定期检测过期空闲的连接并将其关闭。这两个队列在增删元素的时候会通过读写锁来确保多线程执行的正确性。当Session向连接池请求连接时,会检查空闲连接队列中是否有可用的连接,如果有则直接返回给Session供用户使用;如果没有可用连接并且当前的总连接数没有超过配置中限定的最大连接数maxConnSize,则新建一个连接给Session;如果已经到达了最大连接数的限制,返回错误。
大概流程和下面流程图类似:
一般来说,只有在客户端程序退出时才需要关闭连接池,在关闭时池中所有的连接都会被断开。Session
客户端会话Session通过连接池ConnectionPool生成,用户需要提供用户密码进行校验,在校验成功后用户会获得一个Session实例,并通过Session中的连接与服务端进行通信。最常用的接口是execute(),如果在执行时发生错误,客户端会检查错误的类型。如果是网络原因或者和session通信的graph服务down掉,客户端会自动重连,尝试绑定一个可用的连接重发请求。
需要注意的是,一个Session不支持被多个线程同时使用,正确的方式是用多个线程申请多个Session,每个线程使用一个Session。Session被释放时,其持有的连接会被放回到连接池的空闲连接队列idleConnectionQueue中,以便于之后被其他Session复用。Connection
连接Connection每个连接实例都是等价的,可以被任意Session持有。这样设计的目的是这些连接可以被不同的Session复用,减少反复开关Transport的开销。连接会将客户端的请求发送到服务端并将其结果返回给Session。社区用户实践
这里主要收录了用户在使用连接池、Session遇到的比较有代表性的问题。如何获取多个Session
可通过https:discuss。nebulagraph。com。cnttopic3765查看完整的交流对话。
Sharry2021gu提问:连接池怎么会有多个Session呢?用来测试并发性能。像下面的pipeline里怎么才能获取不同的session?
答:因为你给Session包了一层,你直接用javaclient的ConnectionPool拿Session就可以了,ConnectionPool是支持多线程调用getSession的接口。对Session管理的理解
下面部分收录社区用户wuyou对Session管理的理解,你可以通过https:discuss。nebulagraph。com。cnttopic8777了解全部内容。这块的内容同上面客户端交互流程有所重叠,不过都是需要注意的使用点。NebulaPool的maxConnSize是最大连接数,一个Session只能使用一个连接,可以简单地认为maxConnSize就是这个NebulaPool里面支持的最大Session数量,适当调整就行了;NebulaPool使用常规的单例就行,应用程序结束时记得关闭就行了。Session的话可以在graph配置中设置sessionidletimeoutsecs让其自动销毁就行了;Session的创建和销毁是有开销的,会有五次IO交互:Client和Graphd会有3次IO交互以及Graphd和Metad有2次IO交互。Client和GraphdIO交互:第一次是检测连接是否是正常的;第二次是做一次认证获取sessionId;第三次是USESPACE;Graphd和MetadIO交互:第一次是生成sessionId;第二次是获取space信息。所以,一般情况下不建议每次请求都从poolgetSession,execute之后再release,这会有性能开销,而且还会在服务端生成很多只用一次的Session。Session是线程不安全的,多个线程使用同一Session会直接报错。应对多线程可以自己维护一份Session列表。如果是多个space的话,可以针对每个space维护一份session列表。这一点目前需要自己实现,暂时没有官方的好的方式。自维护Session
wuyou提问:官方说需要自己维护Session是什么意思,感觉NebulaPool已经在维护了,应用层只需要每次直接getSession就完事儿了,每次执行完nGQL之后session。release释放掉Session,让其回到pool中就可以。
答:这里解释下如何理解需要自己维护Session。NebulaPool维护的只是Connection,Connection是无状态的。Session的维护是指多线程使用的情况下复用Session做多次查询,比如:Session内部分sessionInUse和idleSession队列,新建的Session放idle队列,用的时候起一个线程持有这个Session并且移到inUse队列,用完之后不用释放Session放回idleSession供下次使用。Connection的释放
wuyou提问:放回连接池的Connection什么时候会被释放?
答:有两种方式来释放Connection。第一种,手动关闭连接池时里面的连接会被释放。另外一种是,连接池里的对象池通过setSoftMinEvictableIdleTimeMillis()自动定期释放。空闲会话超时设置
可通过https:discuss。nebulagraph。com。cnttopic9037查看完整的交流对话。
Ian提问:设置空闲会话超时时间为8小时,是以SHOWSESSIONS结果的updatetime来加8小时吗?如果一直在用,就不会过期?
答:是udpatetime8H。使用过程中session的idletime会更新,如果你一直在用会话就不会过期。
谢谢你读完本文()
要来近距离体验一把图数据库吗?现在可以用用NebulaGraphCloud来搭建自己的图数据系统哟,快来节省大量的部署安装时间来搞定业务吧NebulaGraph阿里云计算巢现30天免费使用中
想看源码的小伙伴可以前往GitHub阅读、使用、()star它GitHub:https:github。comvesoftincnebula
夜雨丨陈益石缝里,长出一棵苦蒿石缝里,长出一棵苦蒿陈益后院鱼池外,石缝里长出一株小苗弱弱的,没留意因为它实在太小太小况且这地没土没水心想它很难活,也许会死掉谁……
512414!抱歉了詹姆斯46年来唯一尴尬纪录被你达成了在今日湖人vs快船的比赛中,虽然湖人打得非常顽强,多次在落后10分数的情况下追上比分,一度还反超了比分,但最终功亏一篑,以6分之差不敌快船,遭遇了开赛2连败。吃到这场败仗……
中国组合徐一璠杨钊煊入围WTA年终总决赛,本赛季两站巡回赛夺据国际女子网球协会WTA北京时间今天凌晨的消息,中国组合杨钊煊徐一璠入围了2022赛季WTA年终总决赛。她们成为第六支锁定年终盛事双打资格的团队。本赛季杨钊煊徐一璠组合在……
前景堪忧,跳水世界杯遇大冷,全红婵参赛项目更是遭遇尴尬情况不管是那个竞技体育的世界杯,都是各支参赛队伍非常看重的世界大赛。然而,目前正在德国柏林举行的跳水世界杯,却遭遇到了很大的尴尬。从这次跳水世界杯的参赛队伍来看,不得不说,跳水这个……
三星又造了一个巨大的相机传感器,将搭载在VivoX80上三星是全球第二大移动设备摄像头传感器制造商,基本上所有的智能手机品牌都使用过三星的传感器。在过去的几年中,这家韩国科技巨头已经推出了多种大型相机传感器,包括ISOCELLGN1……
杜锋塞翁失马提前认输,郭艾伦读秒砸球,直播镜头马上切换CBA季后赛火爆来袭,辽粤大战在一片争议声中落下帷幕,此役大比分拿下广东,郭艾伦此役表现低迷,在比赛过程中更是不满裁判判罚,理论过程中还吃到技犯,赛后读秒阶段更是情绪失控,赢了……
血栓并非悄无声息,医生手脚出现这4个变化,建议早做检查爱乐养生血栓是指血液在心血管系统血管内面剥落时或修补处的表面形成的小块,主要是由不溶性纤维蛋白沉积的血小板以及聚集性白细胞,红细胞构造。正常情况下来说,血液本身具有……
七言诗劝老三首人生不过几十载,冷暖炎凉数万天人生苦乐难能定,万物兴衰任意行斩断人间三千愁,忘却红尘一段情世事短暂如春梦,人情淡薄似秋云人生哪能多如意,万事只求半称心……
娘对我撒了一辈子的谎大家好,我是气盛方为年轻人,喜欢分享个人成长的干货,育儿带女的苦乐,人生经历的小嗑。您的每一次浏览点赞都是我前进的罗盘!一千位母亲有一千种爱,一千种爱却是同一种情怀。天下……
肌张力低是唐氏?高是脑瘫?教你自测宝宝肌张力是否异常宝宝体检的时候,医生会拉拉宝宝的小手小腿,评估宝宝的肌张力发育情况。对于肌张力这个词,很多家长都比较陌生,但去网上查一查,就会看到一种说法肌张力低是唐氏儿,肌张力高是脑瘫……
登泰山记五岳之首的泰山是我期盼已久的徒步攀登地,上周看周末天气不错,临时决定独自前往,因为前期已研究过行程,所以怀着无比崇敬的心情向往着并规划沿前人的足迹从遥参亭、岱庙、红门以登高必自……
稳住基本盘,抓住现金流,开辟增长点,适应新周期当下经济形势波动,如何判断未来行业发展潜力?是否与内外环境强关联、是否是必选消费。我们基本上从两个维度去判断一个行业的未来发展。第一,行业发展与内外环境的变化……