会话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
因此在前端服务器中引入了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绑定uid - 通过
FrontendSession访问session的只读字段,不过对FrontendSession中与session中相同的只读字段的修改并不会反映到原始的session中。
BackendSession
BackendSession与FrontendSession类似,BackendSession是用于后端服务器的,可以看作是原始session的代理,其数据字段跟FrontendSession基本一致。
BackendSession是由BackendSessionService创建并维护的,在后端服务器接收到请求后,由BackendSessionService根据前端服务器RPC的参数进行创建。
服务 service
Pomelo框架有两个service服务:SessionService、BackendSessionService
SessionService
SessionService维护所有的原始session信息,包括不可访问的字段,绑定的uid以及用户自定义的字段。
SessionService只存在于前端服务器,Session以每个客户端请求自增1的形式生成,用于管理连接Pomelo的客户端。如果在前端服务器不进行相关控制对于每个请求都会产生一个Session,就是说客户端都会在前端的服务器中的sessionService产生一个会话,值得注意的是自Pomelo0.4.x支持同一账号多处登录,所以sessionService中的session对应的是一个数组。如果对session不做任何处理的话,每刷新一次页面都会对这个session数组自增1,从暴露的API可以看出sessionService可以用于对连接在前端服务器的客户端,踢下线或利用session id直接在前端服务器发消息给客户端。
BackendSessionService
对BackendSessionService的每次方法调用实际上都会生成一个远程过程调用,比如通过一个sid获取其BackendSession。同样对于BackendSession中字段的修改也不会反映到原始的session中,不过与FrontendSession一样,BackendSession也有push、bind、unbind调用,它们的作用与FrontendSession一样都是用来修改原始中的settings字段或绑定/解绑uid的,不同的是BackendSession的这些调用实际上都是namespace为sys的远程调用。
949

被折叠的 条评论
为什么被折叠?



