关于Session管理的问题续集

  • nebula 版本:v3.1.0
  • 部署方式:分布式,7台实例
  • 安装方式:RPM
  • 是否为线上版本:Y
  • 硬件信息
    • 磁盘:SSD
    • CPU、内存信息:64c 512g
  • 问题的具体描述
    关于session的使用问题,参考 关于Session管理的问题 ,有余下疑问:
    1、设置空闲会话超时时间为8小时,是以show sessions结果的update_time来加8小时吗?如果一直在用,就不会过期?
    2、NebulaPoolConfig使用问题:NebulaPoolConfig的idleTime是配置什么的?

程序启动,show sessions结果显示创建了60个了,我自己缓存了session,一个线程一个session,程序只使用20个线程,却创建了60个session。
这个问题是我的代码问题

3、这个问题是supervisor的问题

程序做了优雅停机,执行了session.release()和NebulaPool.close(),show sessions观察到session数量还是没有减少

从 3.0 开始不允许永不过期的 session 了,idle 的时间一定要大于 0;不过一直用的话,就不存在空闲的时间也就不会过期。

  1. 是的, 使用过程中 session 的 idle time 会更新, 一直在用就不会过期
  2. 部署的服务之前使用过的话可能会有旧的session在, 能确认这60个session都是你的程序创建的吗? 可以通过 CreateTime 判断下
  3. show sessions 是怎样执行的? 等程序退出后再重新运行程序吗? 一个简单的方法是用 console 验证, 比如启动两个console, 此时 session 数应该是2, 然后在 console1 里执行 exit, 用 console2 执行 show sessions, 应该只有 console2 创建的 session 在, 我本地测试没有问题
2 个赞

nebula-java是否有判断session是否过期的方法

没有, session 的 ping() 方法只检测 session 持有的连接是否可用, 对 session 本身的过期判断在服务端做的, 如果用过期的 session 发请求给 server 会返回错误

我可以理解为:即使session已经过期,ping() 方法也会返回连接可用?

对, session和连接独立

关于session管理,是否有什么建议或者有一些经典的使用案例可供参考呢?
目前使用的nebula版本是3.1.0, 在使用过程中,有两种方案:

  1. 每次执行GQL语句都从nebulaPool里获取session, 然后执行 use space命令.用后执行release方法(graph-ocean目测是使用这种方案)
  2. 在nebulaPool基础上,封装一个sessionManager, 维护session核心,最大数量和GQL任务执行队列(类似AQS实现方式).这样实现session的复用.

对这两种方案是否可行,更推荐使用哪一种方案呢?是否还有其他方案可以推荐一下吗?

求解答 :pray: :pray: :pray:

1 个赞

我用的是java 3.0.0的版本,因为有多线程应用的场景,所以自己维护了一个session列表, 系统启动创建10个空闲的session,用了就归还,但是过一晚上就会碰到了session超期的问题,
具体异常为:
2022-07-05T11:00:49.961118696+08:00 Caused by: com.vesoft.nebula.client.graph.exception.IOErrorException: java.net.SocketException: Broken pipe (Write failed)

2022-07-05T11:00:49.961123024+08:00 at com.vesoft.nebula.client.graph.net.SyncConnection.executeWithParameter(SyncConnection.java:192)

2022-07-05T11:00:49.961126954+08:00 at com.vesoft.nebula.client.graph.net.Session.executeWithParameter(Session.java:113)

2022-07-05T11:00:49.961132681+08:00 at com.vesoft.nebula.client.graph.net.Session.execute(Session.java:78)
通过链接发现,默认的session超期时间为8小时 (session_idle_timeout_secs=28800)
我的问题是:

  1. 可以设置session_idle_timeout_secs=0 表示session永不超期吗 ?
  2. 如果不可以,那么通过什么方式来判断session超期?难道只能通过cache异常来判断吗?

好问题

  1. 可以用不过期么?
    不可以,为了防止客户端误用导致服务端过多 session,最大可以是 7 天,604800
    未来服务端也可能会主动断掉 session,比如管理员改了这个 session 用户的密码,或者更改权限。

  2. 如果不可以,那么通过什么方式来判断session超期?难道只能通过cache异常来判断吗?
    是的,可以 execute 的时候捕获,也可以写一个定时任务,定时检查 session 列表里的所有 session。比如执行一个 yield 1

2 个赞

非常感谢解答