Pomelo的Router

  在pomelo中,對服務器的擴充很是簡單,只須要修改一下配置文件config/servers.json,多添幾臺服務器配置就好了,若是咱們的connector和chat都具備多臺服務器,所以須要考慮對用戶請求的服務器分配問題前端

1.對於gate服務器來講,因爲有多個connector,因此須要從中選擇一個服務器的信息進行返回,這裏咱們增長了一個工具函數dispatch,它完成具體的分配運算,他使用用戶的uid的crc32的校驗碼與connector服務器的個數取餘,從而獲得一個connector服務器,大體代碼以下:json

module.exports.dispatch = function(key, list) {
  var index = Math.abs(crc.crc32(key)) % list.length;
  return list[index];
};後端

 

2.對應chat服務器,須要選擇由哪臺chat服務器來服務,也就是前端服務器把這個客戶端請求路由到哪一個後端服務器上。配置路由使用application的route調用,這裏咱們也使用了前面提到的工具函數dispatch,使用一樣的服務器分配策略,示例以下:服務器

var chatRoute = function(session, msg, app, cb) {
  var chatServers = app.getServersByType('chat');session

  if(!chatServers || chatServers.length === 0) {
    cb(new Error('can not find chat servers.'));
   return;
  }app

  var res = dispatcher.dispatch(session.get('rid'), chatServers);函數

  cb(null, res.id);
};工具

app.configure('production|development', function() {
  app.route('chat', chatRoute);
});ui

  其中chatRoute就是路由函數,他接受四個參數,返回一個其選擇的後端服務器id,四個參數中,第一個是專門用做路由計算的參數,前端服務器路由請求給後端服務器發rpc調用時,會使用session做爲計算路由的參數,可是當用戶自定定義rpc的時候,用戶徹底能夠本身定義這個參數的含義,固然也可使用session。第二個參數msg描述了當前rpc調用的全部信息,包括調用的服務器類型,服務器名字,具體的調用方法等信息。第三個參數是一個上下文變量,通常狀況下會由app來充當,第四個是一個得到到後端服務器id後的回調函數。spa

  pomelo若是採用hybridconnector的方式,路由信息還能夠壓縮,即在客戶端與服務器創建鏈接的握手過程當中,服務器會將整個字典傳給客戶端,這樣在之後的通訊中,對於路由信息,將所有使用定義的小整數進行標記,大大地減小了額外信息開銷,目前pomelo提供了基於字典的路由信息壓縮。

  • 對於服務端,pomelo會掃描全部的Handler信息
  • 對於客戶端,用戶須要在config/dictionary.json中聲明全部客戶端使用的路由。

好比,在config/dictionary.json裏
[
  'onChat',
  'onAdd',
  'onLeave'
]

而後在app.js中配置

app.configure('production|development','connector', function() {
  app.set('connectorConfig', {
    connector: pomelo.connectors.hybridconnector,
    heartbeat: 3,
    useDict: true // enable dict
   });
});

app.configure('production|development','gate', function() {   app.set('connectorConfig', {     connector: pomelo.connectors.hybridconnector,     useDict: true // enable dict    });});

相關文章
相關標籤/搜索