3.Utm详细实现-用户生命流程
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>>
Utm詳細(xì)實現(xiàn)-用戶生命流程
?
1.??????用戶生命流程:
?
首先,最基本的 就是“游客” 和“用戶” 之間身份的轉(zhuǎn)變:
客戶端連接到服務(wù)端后,這個時候認(rèn)為連接的客戶端是一個游客;客戶端請求登錄且登錄成功后則轉(zhuǎn)變成一個用戶;如果用戶退出,則又變回游客。
?
? ? ? ? ? ? ? ?
?
??????
?
然后,再看每個操作(登錄、退出、斷線)的具體流程:
????????
????????
用戶登錄:
用戶登錄過程主要分成兩部分:登錄檢查(OnUserLoginCheckHandler) 和 登錄(OnUserLoginHandler)
登錄檢查:對用戶的賬號密碼等信息經(jīng)行驗證(在這個階段,這個請求時屬于一個游客發(fā)起的請求,由游客請求線程池中的線程處理)
登錄:專注于處理登錄業(yè)務(wù)(在這個階段,這個請求已經(jīng)屬于一個用戶發(fā)起的請求了,由utm線程調(diào)度)。(默認(rèn)情況下,游客請求線程池和用戶請求線程池是同一個線程池,可以根據(jù)需要更改(建議通過更改游客請求過濾器(IVisitorRequestFilter)實現(xiàn)類實現(xiàn)))
?
詳細(xì)流程:
當(dāng)用戶發(fā)送登錄請求到服務(wù)端后,先經(jīng)過UTM過濾器(UserThreadModeFilter)再到 游客請求過濾器(默認(rèn)實現(xiàn)為VisitorRequestFilterNotQueue),在游客請求過濾器中調(diào)用游客請求線程池處理該請求(觸發(fā)對OnUserLoginCheckHandler的調(diào)用)。
?
在登錄檢查中將調(diào)用抽象方法loginCheck驗證用戶名密碼等信息,如果失敗則直接在loginCheck方法給前端返回登錄失敗信息,如果成功則會調(diào)用UserFlagBusiness 的設(shè)置用戶標(biāo)志位(SetLoginFlag)方法(用戶登錄標(biāo)志位 是 utm最重要的標(biāo)志位,用于標(biāo)識用戶是否已經(jīng)登錄,在哪里登錄,詳細(xì)解釋可以看類UserLogoutCheckBussiness注釋);如果用戶沒有登錄,則直接將 登錄任務(wù)(OnUserLoginHandler)放入用戶的處理隊列中,由qtm線程處理;如果用戶已經(jīng)登錄了,則先通知在登錄的用戶退出登錄,然后將用戶的登錄信息放入到UserLogoutCheckBussiness的”等待退出用戶隊列”中,由UserLogoutCheckBussiness繼續(xù)處理(utm會保證舊的用戶退出了才允許新的用戶登錄)。
?
UserLogoutCheckBussiness是自己一個獨(dú)立的線程在運(yùn)行,它周期性的檢查所有在隊列中的用戶,如果有用戶已經(jīng)退出了,則將 登錄任務(wù)(OnUserLoginHandler)放入用戶的處理隊列中,由qtm線程處理;如果舊的用戶超過一定時間依然沒有退出,則會調(diào)用UserLogoutCheckBussiness.waitLogoutTimeOut方法,可以在其中通知前端登錄失敗信息。
?
接下來就到登錄處理(OnUserLoginHandler),會先調(diào)用loginLinkCheck方法檢查該連接是否依然在線,如果返回false則會終止登錄過程并回收申請了的相關(guān)資源,如果成功則執(zhí)行userLogin方法,在userLogin中處理登錄的業(yè)務(wù)。
?
關(guān)于loginLinkCheck的詳細(xì)說明:
登錄成功連接檢查
(該用戶已經(jīng)通過了登錄檢查,現(xiàn)在再次確認(rèn)下連接是否還在,
如果連接已經(jīng)斷開了,那么將會觸發(fā)回收處理
(userResource.failInLoginLinkCheck和serFlagBusiness.rollBackLoginFlagWhenLinkDisable ))
?
關(guān)于為什么要有l(wèi)oginLinkCheck問題:
有些socket的封裝框架給的不是說一個socket斷開了的事件或者回調(diào)(例如SmartFoxServer),而是在當(dāng)用戶登錄后才會有用戶的斷線事件,設(shè)置這個loginLinkCheck方法就是為了處理這樣的問題,在loginLinkCheck里面可以調(diào)用這些封裝框架的登錄處理,如果登錄失敗(用戶已經(jīng)斷開了),那么就認(rèn)為是在登錄處理過程中用戶斷線了,也視為沒有登錄成功,將會回收相應(yīng)的資源和標(biāo)志位,如果登錄成功,則接下來用戶如果斷線了,那么Disconect事件就會被觸發(fā)=>OnUserDisconectHandler必定被觸發(fā)。(也就是在loginLinkCheck中要設(shè)置用戶已經(jīng)登錄的標(biāo)志)
?
這個方法如果返回true, 則接下來將會執(zhí)行userLogin方法,
而且用戶斷線OnUserDisconectHandler必定被觸發(fā),且一定在userLogin方法之后(斷線事件會被放到qtm隊列中,qtm保證一個用戶的任務(wù)被順序執(zhí)行)
?
?
??(圖片看不清可以右鍵保存到本地后再打開瀏覽)
?
?
用戶退出或用戶斷線:
用戶斷線和用戶退出只有一個會被觸發(fā),因為用戶調(diào)用退出后,其將變成游客,所以他的斷線不會觸發(fā)用戶斷線事件。用戶斷線和用戶退出是為了處理業(yè)務(wù)上更方便區(qū)分,其都是繼承AbstractOutHandler的。
?
詳細(xì)流程:
當(dāng)用戶發(fā)送退出請求到服務(wù)端后,先經(jīng)過UTM過濾器(UserThreadModeFilter)再到 用戶請求過濾器(默認(rèn)實現(xiàn)為RequestFrequentFilter),在用戶請求過濾器中將 退出任務(wù)(OnUserLogoutHandler)放入用戶的處理隊列中,由qtm線程處理(觸發(fā)對OnUserLogoutHandler的調(diào)用)。 注:如果是用戶斷線,則會封裝成一個用戶斷線請求
?
在用戶退出或斷線處理中(AbstractOutHandler),首先會檢查用戶是否是登錄狀態(tài)(user.isLogining),如果不是登錄狀態(tài)則不處理(防止在用戶退出后馬上掉線,這個時候用戶退出任務(wù)未被處理,此時認(rèn)為該連接對應(yīng)的是一個用戶,所以會將斷線事件放入任務(wù)隊列中,導(dǎo)致用戶斷線和用戶退出被重復(fù)調(diào)用),如果是登錄狀態(tài)則調(diào)用相應(yīng)的業(yè)務(wù)處理方法userLogout/userDisconect
?
分發(fā)用戶退出或者用戶斷線事件
?
通知 資源管理器 用戶退出
?
調(diào)用UserFlagBusiness. removeLoginFlag 回收用戶標(biāo)志位(詳細(xì)解釋可以看類UserLogoutCheckBussiness注釋)
?
?
?(圖片看不清可以右鍵保存到本地后再打開瀏覽)
?
?
?
?
1.Utm簡介
2. Utm 模塊設(shè)計
3. Utm詳細(xì)實現(xiàn)-用戶生命流程
4. Utm詳細(xì)實現(xiàn)-用戶資源管理
5.Utm線程模型
6. Utm示例-公共部分
7. Utm示例-SmartFoxServer集成
8. Utm示例-Netty集成
9.(1.0.2版本更新)用戶隊列管理 與 用戶異常處理
?
轉(zhuǎn)載于:https://my.oschina.net/DaemonChen/blog/648320
總結(jié)
以上是生活随笔為你收集整理的3.Utm详细实现-用户生命流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入Linux PAM体系结构
- 下一篇: Apache简介