码迷,mamicode.com
首页 > 其他好文 > 详细

网关(Gatesvr) 设计(1)

时间:2017-07-12 23:24:09      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:move   backend   问题:   数据结构   nts   连接   ast   rds   自己的   

 

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)

标签:move   backend   问题:   数据结构   nts   连接   ast   rds   自己的   

原文地址:http://www.cnblogs.com/jasw/p/7157597.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!