網關(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)