1. 程式人生 > >網關(Gatesvr) 設計(1)

網關(Gatesvr) 設計(1)

一個 tin 用戶 要點 urn cast 協議 fin return

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)