非正式全面解析 NebulaGraph 中 Session 管理
NebulaGraph 论坛最近有些讨论帖,各种姿势来问 NebulaGraph Session 管理相关的事情,我寻思这也不是一个法子,还是来写一篇文章来讲述下 NebulaGraph 中的 Session 管理。由于本文设定为非正式的 Session 讲解,所以本文主要分为理论和实操部分,在实操部分主要摘录了论坛用户的一些关于 Session 的理解,以及本人对 Session 相关问题的解答。
客户端交互流程
在之前的源码解读系列的客户端部分,我们讲过 Session 相关的知识点,这里来回顾下。
通过下图你能了解客户端和服务端连接时,背后的工作原理:
简单来说,整个 workflow 由 ConnectionPool、Session、Connection 构成,用户通过 Session 和计算引擎进行交互,但真正和计算引擎 graphd 发生数据处理关系的是连接池当中的 Connection。
Connection Pool
在连接池初始化阶段,用户使用 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.nebula-graph.com.cn/t/topic/3765 查看完整的交流对话。
Sharry2021gu 提问:连接池怎么会有多个 Session 呢?用来测试并发性能。像下面的 pipeline 里怎么才能获取不同的 session?
答:因为你给 Session 包了一层,你直接用 java-client 的 ConnectionPool 拿 Session 就可以了,ConnectionPool 是支持多线程调用 getSession 的接口。
对 Session 管理的理解
下面部分收录社区用户 wuyou 对 Session 管理的理解,你可以通过 https://discuss.nebula-graph.com.cn/t/topic/8777 了解全部内容。这块的内容同上面客户端交互流程有所重叠,不过都是需要注意的使用点。
NebulaPool 的
maxConnSize
是最大连接数,一个 Session 只能使用一个连接,可以简单地认为 maxConnSize 就是这个 NebulaPool 里面支持的最大 Session 数量,适当调整就行了;NebulaPool 使用常规的单例就行,应用程序结束时记得关闭就行了。Session 的话可以在 graph 配置中设置
session_idle_timeout_secs
让其自动销毁就行了;Session 的创建和销毁是有开销的,会有五次 IO 交互:Client 和 Graphd 会有 3 次 IO 交互以及 Graphd 和 Metad 有 2 次 IO 交互。
- Client 和 Graphd IO 交互:
- 第一次是检测连接是否是正常的;
- 第二次是做一次认证获取 sessionId;
- 第三次是 USE SPACE;
- Graphd 和 Metad IO 交互:
- 第一次是生成 sessionId;
- 第二次是获取 space 信息。
所以,一般情况下不建议每次请求都从 pool getSession,execute 之后再 release,这会有性能开销,而且还会在服务端生成很多只用一次的 Session。
- Client 和 Graphd IO 交互:
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.nebula-graph.com.cn/t/topic/9037 查看完整的交流对话。
Ian 提问:设置空闲会话超时时间为 8 小时,是以 SHOW SESSIONS 结果的 update_time 来加 8 小时吗?如果一直在用,就不会过期?
答:是 udpate_time + 8H。使用过程中 session 的 idle time 会更新,如果你一直在用会话就不会过期。
谢谢你读完本文 (///▽///)
要来近距离体验一把图数据库吗?现在可以用用 NebulaGraph Cloud 来搭建自己的图数据系统哟,快来节省大量的部署安装时间来搞定业务吧~ NebulaGraph 阿里云计算巢现 30 天免费使用中,点击链接来用用图数据库吧~
想看源码的小伙伴可以前往 GitHub 阅读、使用、(з)-☆ star 它 -> GitHub;和其他的 NebulaGraph 用户一起交流图数据库技术和应用技能,留下「你的名片」一起玩耍呢~
非正式全面解析 NebulaGraph 中 Session 管理的更多相关文章
- 2016-1-30 Servlet中Session管理(Sesssion追踪)
Session管理(Sesssion追踪)是Web应用程序开发中非常重要的一个主题.这是因为HTTP是无状态的,在默认情况下,Web服务器不知道一个HTTP请求是来自初次用户,还是来自之前已经访问过的 ...
- 解析 PHP 中 session 的实现原理以及大网站应用应该注意的问题
一 PHP SESSION原理 session 是在服务器端保持用户会话数据的一种方法,而 cookie 是在客户端保持用户数据.HTTP 协议是一种无状态协议,服务器响应完之后就失去了与浏览器的联系 ...
- Shiro权限管理框架(四):深入分析Shiro中的Session管理
其实关于Shiro的一些学习笔记很早就该写了,因为懒癌和拖延症晚期一直没有落实,直到今天公司的一个项目碰到了在集群环境的单点登录频繁掉线的问题,为了解决这个问题,Shiro相关的文档和教程没少翻.最后 ...
- How Tomcat works — 八、tomcat中的session管理
在使用shiro的session的时候感觉对于tomcat中session的管理还不是特别清楚,而且session管理作为tomcat中比较重要的一部分还是很有必要学习的. 目录 概述 session ...
- Tomcat中session的管理机制
1. 请求过程中的session操作: 简述:在请求过程中首先要解析请求中的sessionId信息,然后将sessionId存储到request的参数列表中.然后再从 request获取s ...
- [转]tomcat中的session管理
转载地址:http://blog.csdn.net/iloveqing/article/details/1544958 当一个sesson开始时,Servlet容器会创建一个HttpSession对象 ...
- 跟我一起学WCF(8)——WCF中Session、实例管理详解
一.引言 由前面几篇博文我们知道,WCF是微软基于SOA建立的一套在分布式环境中各个相对独立的应用进行交流(Communication)的框架,它实现了最新的基于WS-*规范.按照SOA的原则,相对独 ...
- ASP.NET Core中的OWASP Top 10 十大风险-失效的访问控制与Session管理
不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: https://dotnetcoretutorials.com/201 ...
- 分布式 WEB应用中Session(会话管理)的变迁之路
一.Session 介绍 Session 一词直译为 "会话",意指有始有终的一系列动作/消息.Session 是 Web 应用蓬勃发展的产物之一.在 Web 应用中隐含有&quo ...
- tomcat架构分析 (Session管理)
Session管理是JavaEE容器比较重要的一部分,在app中也经常会用到.在开发app时,我们只是获取一个session,然后向session中存取数据,然后再销毁session.那么如何产生se ...
随机推荐
- C# AsyncLocal 是如何实现 Thread 间传值
一:背景 1. 讲故事 这个问题的由来是在.NET高级调试训练营第十期分享ThreadStatic底层玩法的时候,有朋友提出了AsyncLocal是如何实现的,虽然做了口头上的表述,但总还是会不具体, ...
- 没有虚拟DOM版本的vue(Vue Vapor)
前言 随着Svelte和SolidJS的流行,无虚拟DOM模式逐渐开始火了起来.vue也推出了无虚拟DOM模式的版本,就是我们今天要讲的Vue Vapor. 什么是Vue Vapor Vue Vapo ...
- Spring缓存是如何实现的?如何扩展使其支持过期删除功能?
前言:在我们的应用中,有一些数据是通过rpc获取的远端数据,该数据不会经常变化,允许客户端在本地缓存一定时间. 该场景逻辑简单,缓存数据较小,不需要持久化,所以不希望引入其他第三方缓存工具加重应用负担 ...
- vue动画appear 实现页面刚展示出来的时候,入场效果
<style> /* 给动画添加一组过度效果 */ .v-enter, .v-leave-to { opacity: 0; transform: translateY(80px); } . ...
- 基于OpenIM 实现聊天机器人功能
### 简要描述 使用 OpenIM 中的 Webhook 机制实现聊天机器人功能.发送文本消息或图片消息给聊天机器人后,机器人会返回相同的消息.开发者可以替换此逻辑,在LangChain框架上调用L ...
- 从零开始配置vim(27)——代码片段
我们之前介绍过缩写相关的内容,缩写是可以自动帮我们将缩写的单词展开成一段完整的话.但是代码本身是结构话的,仅仅使用缩写来配置是无法完成自动生成代码这个步骤的.好在我们大量的插件来进行配置.本篇我们将要 ...
- 从 WebStorm 转到 VSCode!使用一周体验报告
前言 最近我的 Jetbrains 开源项目授权到期了,想要续订的时候发现 Jetbrains 提高了开源项目申请门槛,我的 StarBlog 项目因为名字里包含 blog 这个词无法申请,虽然我在 ...
- 使用三方jar中的@RestControllerAdvice不起作用
背景 公司封装了自己的基础核心包core-base,里边包含了Validation的异常捕获处理类:同时开发项目有全局异常捕获处理类,经测试发现,core-base里边的不起作用 可能原因: 未扫描外 ...
- 从零构建医疗领域知识图谱的KBQA问答系统:其中7类实体,约3.7万实体,21万实体关系。
从零构建医疗领域知识图谱的KBQA问答系统:其中7类实体,约3.7万实体,21万实体关系. 项目效果 以下两张图是系统实际运行效果: 1.项目运行方式 运行环境:Python3 数据库:neo4j 预 ...
- PGL图学习之图游走类metapath2vec模型[系列五]
PGL图学习之图游走类metapath2vec模型[系列五] 本项目链接:https://aistudio.baidu.com/aistudio/projectdetail/5009827?contr ...