pomelo源碼分析(8)--session

作者:shihuaping0918@163.com奸鬓,轉(zhuǎn)載請(qǐng)注明作者

pomelo中有session/frontendSession/backendSession/sessionService。名字看起來(lái)都有點(diǎn)像,這一篇準(zhǔn)備講session和sessionService。session是對(duì)用戶連接的一個(gè)抽象歌焦,它會(huì)調(diào)用sessionService途事。sessionService是session的具體實(shí)現(xiàn)底層。session只在frontend服務(wù)器中存在雨让。如果還有印象的話,應(yīng)該能記得gate負(fù)責(zé)接受外部連接忿等,做frontend的負(fù)載均衡栖忠,將連接分派到不同的frontend上。connector再做路由處理这弧,轉(zhuǎn)到不同的backend服務(wù)器上娃闲,也就是邏輯服務(wù)器。

在分析session.js前要先分析sessionService.js匾浪,因?yàn)閟ession實(shí)際是抽象了sessionService皇帮。從底向上更容易理解。

sessionService.js蛋辈,先看一下Session的定義属拾,Session中有一個(gè)id将谊,uid,還有一個(gè)frontendId渐白,還有一個(gè)socket尊浓。id就是sid,uid就是用戶id纯衍,socket就是連接對(duì)應(yīng)的socket栋齿。ftontendId就是frontend服務(wù)器id。sid和uid分別是從哪里來(lái)的呢襟诸?

/**
 * Session maintains the relationship between client connection and user information.
 * There is a session associated with each client connection. And it should bind to a
 * user id after the client passes the identification.
 *
 * Session is created in frontend server and should not be accessed in handler.
 * There is a proxy class called BackendSession in backend servers and FrontendSession 
 * in frontend servers.
 */
var Session = function(sid, frontendId, socket, service) {
  EventEmitter.call(this);
  this.id = sid;          // r
  this.frontendId = frontendId; // r
  this.uid = null;        // r 注意這里瓦堵,uid初始是null
  this.settings = {};

  // private
  this.__socket__ = socket;
  this.__sessionService__ = service;
  this.__state__ = ST_INITED;
};

sid實(shí)際上是socket創(chuàng)建時(shí)指定的一個(gè)id。sid = socket.id;歌亲,它是在connector中生成的菇用,對(duì)于sioconnector,有這樣一段代碼陷揪。

var curId = 1;

  sio.on('connection', function (socket) {
    var siosocket = new SioSocket(curId++, socket); //curId++就是sid
    self.emit('connection', siosocket);
    siosocket.on('closing', function(reason) {
      siosocket.send({route: 'onKick', reason: reason});
    });
  });

所以這個(gè)sid是connector內(nèi)部維護(hù)的惋鸥,在服務(wù)生命周期內(nèi)自增的一個(gè)ID。uid這這個(gè)時(shí)候是null悍缠,沒(méi)有賦值的卦绣。
connector.js

  session.on('bind', function(uid) {
    logger.debug('session on [%s] bind with uid: %s', self.app.serverId, uid);
    // update connection statistics if necessary
    if (self.connection) {
      self.connection.addLoginedUser(uid, {
        loginTime: Date.now(),
        uid: uid,
        address: socket.remoteAddress.ip + ':' + socket.remoteAddress.port
      });
    }
    self.app.event.emit(events.BIND_SESSION, session);
  });

connectorService.js

Session.prototype.bind = function(uid) {
  this.uid = uid;
  this.emit('bind', uid);
};

uid是在bind事件發(fā)生時(shí)出現(xiàn)的。這個(gè)bind被調(diào)用的時(shí)候飞蚓,把uid給賦進(jìn)去了迎卤。注意是sessionService里的Session.on('bind'...)。pomelo把這個(gè)session的名字復(fù)用了太多次玷坠。有點(diǎn)混亂。

為了避免概念上的混亂劲藐,下面總結(jié)一下八堡,先說(shuō)明一下session是指對(duì)客戶端連接的一個(gè)抽象,它里面包含uid,sid,socket聘芜,以后出現(xiàn)session這單個(gè)單詞兄渺,就是指連接的抽象。pomelo核心中有一個(gè)session component汰现,這個(gè)session component是對(duì)sessionService的抽象挂谍。sessionService位于service下,實(shí)現(xiàn)session管理的具體工作瞎饲。session的具體結(jié)構(gòu)是在sessionService中出現(xiàn)的口叙,叫Session。很繞啊嗅战,這就是名字取得不好的弊端妄田。

下面再來(lái)看一下session component和sessionService之間是什么樣的關(guān)系俺亮。

var SessionService = require('../common/service/sessionService');

module.exports = function(app, opts) {
  var cmp = new Component(app, opts);
  app.set('sessionService', cmp, true);
  return cmp;
};

/**
 * Session component. Manage sessions.
 *
 * @param {Object} app  current application context
 * @param {Object} opts attach parameters
 */
var Component = function(app, opts) {
  opts = opts || {};
  this.app = app;
  this.service = new SessionService(opts); //創(chuàng)建sessionService
 //這段話結(jié)尾有個(gè)(),代表函數(shù)調(diào)用
  var getFun = function(m) {
    return (function() {
          return function() {
            return self.service[m].apply(self.service, arguments); //arguments是隨調(diào)用變化的
          };
    })();
  };
  // proxy the service methods except the lifecycle interfaces of component
  var method, self = this;
  for(var m in this.service) { //遍歷sessionService的成員
    if(m !== 'start' && m !== 'stop') { //如果不是start和stop方法
      method = this.service[m]; //取出成員
      if(typeof method === 'function') { //如果成員是函數(shù)
        this[m] = getFun(m); //把函數(shù)加到自己模塊里
      }
    }
  }
};

Component.prototype.name = '__session__';

根據(jù)上面的分析疟呐,session component實(shí)際上是對(duì)sessionService做了一層代理脚曾。把sessionService的函數(shù)都加載到sesssion component里來(lái)了。這個(gè)代理的實(shí)現(xiàn)启具,下一篇文章會(huì)專門(mén)去講它本讥。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鲁冯,隨后出現(xiàn)的幾起案子拷沸,更是在濱河造成了極大的恐慌,老刑警劉巖晓褪,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堵漱,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡涣仿,警方通過(guò)查閱死者的電腦和手機(jī)勤庐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)好港,“玉大人愉镰,你說(shuō)我怎么就攤上這事【冢” “怎么了丈探?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)拔莱。 經(jīng)常有香客問(wèn)我碗降,道長(zhǎng),這世上最難降的妖魔是什么塘秦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任讼渊,我火速辦了婚禮,結(jié)果婚禮上尊剔,老公的妹妹穿的比我還像新娘爪幻。我一直安慰自己,他們只是感情好须误,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布挨稿。 她就那樣靜靜地躺著,像睡著了一般京痢。 火紅的嫁衣襯著肌膚如雪奶甘。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,158評(píng)論 1 308
  • 那天历造,我揣著相機(jī)與錄音甩十,去河邊找鬼船庇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛侣监,可吹牛的內(nèi)容都是我干的鸭轮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼橄霉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼窃爷!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起姓蜂,我...
    開(kāi)封第一講書(shū)人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤按厘,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后钱慢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體逮京,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年束莫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了懒棉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡览绿,死狀恐怖策严,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饿敲,我是刑警寧澤妻导,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站怀各,受9級(jí)特大地震影響倔韭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瓢对,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一狐肢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沥曹,春花似錦、人聲如沸碟联。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鲤孵。三九已至壶栋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間普监,已是汗流浹背贵试。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工琉兜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人毙玻。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓豌蟋,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親桑滩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子梧疲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容