网关(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();
}

上一篇:for语句嵌套使用 实现9*9乘法表


下一篇:REDIS 字典数据结构