首页 > 代码库 > 网关(Gatesvr) 设计(1)
网关(Gatesvr) 设计(1)
Gate解决的问题:
1、用户在服务端的实例可以在不同的进程中,也可以移动到同一个进程中。
2、用户只需要与服务端建立有限条连接,即可以访问到任意服务进程。这个连接的数量不会随服务进程的数量增长而线性增长。
要点:
1、作为服务listen两个端口:clients连接,backend连接;
2、能够将clients的消息转发到对应的backend。backend可以向Gate订阅自己关注的消息;
3、能够支持组播的需求,针对场景服务;
4、Gate有自己的协议,以支持以上需求;
Gate两个组件:
1、针对路由client消息的需求,这个组件叫Broker。
2、针对组播backend消息的需求,这个组件叫Multicast。
简要数据结构:
1、FrontendHandlerManager:
map<uid, Handler>
2、BackendHandlerManager:
map<key, set<Handler>>
3、Proxy:
map<key, map<uid, Handler>>
4、Multicast:
map<forwardid, set<uid>> //forwardid->uid
5、FrontendHandler:
a、handshake:
FrontendHandlerManager::Insert(uid, handler);
b、send:map3查已有backendhandler则发送,没有则从map2中选择一个
handler = Proxy::FindHandler(key, uid);
if (handler == NULL)
{
handler = BackendHandlerManager::GetHandler();
if (handler == NULL) return;
}
handler->SendMsg();
6、BackendHandler:
a、subscribe: insert map2
BackendHandlerManager::Insert(key, handler);
b、unicast: 查map1有则发
handler = FrontendHandlerManager::FindHandler(uid);
if (handler == NULL) return;
handler->SendMsg();
c、addforwards:insert map4
Multicast::Insert(forward, uid);
d、removeforwards: remove map4
Multicast::Remove(forward, uid);
e、multicast: 查map4,有则发
Multicast::Get(forward, uids);
for (uid in uids)
{
handler = FrontendHandlerManager::FindHandler(uid);
if (handler == NULL) continue;
handler->SendMsg();
}
网关(Gatesvr) 设计(1)