Session
Session会话是指一个客户端连接的抽象,Pomelo框架中有三个session会话的概念分别是Session、FrontendSession、BackendSession。
会话字段结构
{
id:<session id>//readonly
frontendId: <frontend server id> //readonly
uid: <bound uid> // readonly
settings: <key-value map> //read and write
__socket__: <raw_socket>
__state__: <session state>
//...
}
字段 | 权限 | 描述 |
---|---|---|
id | 只读 | 当前session会话的ID,全局唯一,自增方式来生成。 |
frontendId | 只读 | 维护当前session会话的前端服务器的ID |
uid | 只读 | 当前session会话所绑定的用户ID |
settings | 读写 | 维护key-value map用来描述session会话的自定义属性 |
__socket__ | 只读 | 底层原生socket的引用 |
__state__ | 只读 | 用来指明当前session会话的生命周期状态 |
一个session会话一旦建立,那么id
、frontendId
、uid
、__socket__
、__state__
都是确定的,都应该是只读不可写的。而settings
也不应该被随意修改。
因此在前端服务器中引入了FrontendSession可将其看作是一个内部session会话在前端服务器中的傀儡。
FrontendSession
的字段结构
{
id: <session id> // readonly
frontendId: <frontend server id> // readonly
uid: <bound uid> // readonly
settings: <key-value map> // read and write
}
FrontendSession
的作用
FrontendSession
可以对settings
字段进行设置值,然后通过调用FrontendSession
的push()
方法,将设置的settings
的值同步到原始的session会话中。FrontendSession
的bind
调用可以给session绑定uidFrontendSession
访问session的只读字段,不过对FrontendSession中与session中相同的只读字段的修改并不会反映到原始的session中。BackendSession
与FrontendSession
类似,BackendSession
是用于后端服务器的,可以看作是原始session
的代理,其数据字段跟FrontendSession
基本一致。
BackendSession
是由BackendSessionService
创建并维护的,在后端服务器接收到请求后,由BackendSessionService
根据前端服务器RPC
的参数进行创建。
service
Pomelo框架有两个service
服务:SessionService
、BackendSessionService
SessionService
维护所有的原始session
信息,包括不可访问的字段,绑定的uid
以及用户自定义的字段。
SessionService只存在于前端服务器,Session以每个客户端请求自增1的形式生成,用于管理连接Pomelo的客户端。如果在前端服务器不进行相关控制对于每个请求都会产生一个Session,就是说客户端都会在前端的服务器中的sessionService产生一个会话,值得注意的是自Pomelo0.4.x支持同一账号多处登录,所以sessionService中的session对应的是一个数组。如果对session不做任何处理的话,每刷新一次页面都会对这个session数组自增1,从暴露的API可以看出sessionService可以用于对连接在前端服务器的客户端,踢下线或利用session id直接在前端服务器发消息给客户端。
对BackendSessionService
的每次方法调用实际上都会生成一个远程过程调用,比如通过一个sid
获取其BackendSession
。同样对于BackendSession
中字段的修改也不会反映到原始的session
中,不过与FrontendSession
一样,BackendSession
也有push
、bind
、unbind
调用,它们的作用与FrontendSession
一样都是用来修改原始中的settings
字段或绑定/解绑uid
的,不同的是BackendSession
的这些调用实际上都是namespace
为sys
的远程调用。