分布式會話原理 - 分布式登錄系統(tǒng)逐步實現(xiàn)(二)

《分布式登錄系統(tǒng)逐步實現(xiàn)》系列文章,有興趣可以持續(xù)關(guān)注。
轉(zhuǎn)發(fā)請說明來源。

單服務(wù)器會話

此模式應(yīng)該是最常見的會話模式了,只有一臺機(jī)器進(jìn)行服務(wù)。大多數(shù)服務(wù)語言都有自帶的基礎(chǔ)Session服務(wù)庫,提供本機(jī)器內(nèi)的 Session 讀寫。

簡單Session模型

PHP Session

這里用PHP Session Functions做為例子,此模塊封裝了一系列對會話信息處理的流程,默認(rèn)以文件作為 Session 會話信息的存儲載體。里面最具有代表性就是函數(shù)就是:session_start。此函數(shù)用作初始化當(dāng)前會話信息。

session_start 原理(文件方式)

字段簡述:

  • PHPSESSID 為 PHP 默認(rèn) cookie 標(biāo)識會話的鍵名。
  • SESS_ 為 PHP Session 信息存儲文件默認(rèn)前綴。
  • R 為隨機(jī)字符串
  • $_SESSION 為Session信息全局變量

相關(guān)流程:

  • 讀取名為 PHPSESSID 的 cookie 值,假使為 X
  • 若讀取到 PHPSESSID 這個 COOKIE,創(chuàng)建 $_SESSION 變量,并從相應(yīng)的目錄中(目錄可配置)讀取 SESS_X 文件,將字符裝在入 $_SESSION 變量中;
  • 若沒有讀取到 PHPSESSID 這個 COOKIE,也會創(chuàng)建 $_SESSION 變量,同時創(chuàng)建一個 SESS_R 的session文件,同時將 SESS_R 作為 PHPSESSID 的cookie 值返回給瀏覽器端。

這個流程具有通用性,可以根據(jù)不用的業(yè)務(wù)需求采用不同的 Session 讀寫策略,包括使用更加安全更加少沖突的 session_id 和 讀寫性能更高的存儲服務(wù)(如:redis、memcached)。

跨服務(wù)器會話

當(dāng)整體系統(tǒng)業(yè)務(wù)開始繁忙,單服務(wù)器已經(jīng)滿足不了當(dāng)前的整體系統(tǒng)業(yè)務(wù),需要用多臺機(jī)器部署同一份代碼提供服務(wù)。

此時,不能再用上面本機(jī)存儲 Session 信息的解決方案。

這是由于:

同一套整體系統(tǒng)代碼部署多機(jī)器的時候,由于每臺機(jī)器自己的會話信息是相互獨(dú)立的,用戶在 機(jī)器A 登錄之后,在機(jī)器B 通過 Cookie 中的 session_id 讀取不到相應(yīng) Session 信息,所以會產(chǎn)生需要用戶多次登錄的異常情況。

此時需要尋求一個更好的方法。

共用 Session 存儲服務(wù)

由于不同服務(wù)器的之間存儲空間在邏輯上是獨(dú)立的,所以需要有一個共用的存儲會話信息的服務(wù)器去對會話信息進(jìn)行讀寫。

共用會話存儲服務(wù)

此處可以根據(jù)業(yè)務(wù)需求,選用不同的會話存儲服務(wù)如:

性能低、高可用:mysql
性能高、低可用:memcached、memcache
性能高、高可用:codis、couchbase

由于 Session 讀寫非常頻繁,而且要求讀性能比較高,所以基本不會用 mysql 用作會話信息存儲服務(wù)。
但本系列后續(xù)會根據(jù) mysql 作為存儲服務(wù),完全用 PHP 實現(xiàn)一個簡單的 Session 模塊。

memcached(舉個例子)

在 PHP 當(dāng)中可以把 session 的存儲處理從默認(rèn)的文件讀寫模式轉(zhuǎn)為 memcached 讀寫。從而實現(xiàn)會話服務(wù)共享。

當(dāng)然,需要安裝 memcached 服務(wù)。

案例配置如下(php.ini):

session.save_handler = memcached 
session.save_path = "10.1.1.1:11211"

跨業(yè)務(wù)會話

當(dāng)一個系統(tǒng)大到一定程度的時候,很自然的會產(chǎn)生業(yè)務(wù)拆分。例如淘寶,會拆分成,支付業(yè)務(wù),訂單業(yè)務(wù),商品業(yè)務(wù),用戶登錄業(yè)務(wù)等等。

此時跟跨機(jī)器會話類似,會有一個多機(jī)器共享的會話存儲服務(wù)。但是對于會話信息的讀寫權(quán)限針對于業(yè)務(wù)的不同會有所不同。

用戶登錄業(yè)務(wù):

擁有讀寫權(quán)限,專門處理用戶登錄賬號密碼驗證模塊,成功則寫入公用會話信息。

其他業(yè)務(wù):

一般只擁有只讀權(quán)限,根據(jù) cookie 從會話服務(wù)讀取當(dāng)前賬號登陸會話信息,去進(jìn)行一些操作。

跨業(yè)務(wù)會話集群模型

跨業(yè)務(wù)會話集群模型

感謝

PHP之session_start()詳解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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