日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

3.Utm详细实现-用户生命流程

發布時間:2025/5/22 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 3.Utm详细实现-用户生命流程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么80%的碼農都做不了架構師?>>>

Utm詳細實現-用戶生命流程

?

1.??????用戶生命流程:

?

首先,最基本的 就是“游客” 和“用戶” 之間身份的轉變:

客戶端連接到服務端后,這個時候認為連接的客戶端是一個游客;客戶端請求登錄且登錄成功后則轉變成一個用戶;如果用戶退出,則又變回游客。

?

? ? ? ? ? ? ? ?

?

??????

?

然后,再看每個操作(登錄、退出、斷線)的具體流程:

????????

????????

用戶登錄:

用戶登錄過程主要分成兩部分:登錄檢查(OnUserLoginCheckHandler) 和 登錄(OnUserLoginHandler)

  • 登錄檢查:對用戶的賬號密碼等信息經行驗證(在這個階段,這個請求時屬于一個游客發起的請求,由游客請求線程池中的線程處理)

  • 登錄:專注于處理登錄業務(在這個階段,這個請求已經屬于一個用戶發起的請求了,由utm線程調度)。(默認情況下,游客請求線程池和用戶請求線程池是同一個線程池,可以根據需要更改(建議通過更改游客請求過濾器(IVisitorRequestFilter)實現類實現))

  • ?

    詳細流程:

  • 當用戶發送登錄請求到服務端后,先經過UTM過濾器(UserThreadModeFilter)再到 游客請求過濾器(默認實現為VisitorRequestFilterNotQueue),在游客請求過濾器中調用游客請求線程池處理該請求(觸發對OnUserLoginCheckHandler的調用)。

  • ?

  • 在登錄檢查中將調用抽象方法loginCheck驗證用戶名密碼等信息,如果失敗則直接在loginCheck方法給前端返回登錄失敗信息,如果成功則會調用UserFlagBusiness 的設置用戶標志位(SetLoginFlag)方法(用戶登錄標志位 是 utm最重要的標志位,用于標識用戶是否已經登錄,在哪里登錄,詳細解釋可以看類UserLogoutCheckBussiness注釋);如果用戶沒有登錄,則直接將 登錄任務(OnUserLoginHandler)放入用戶的處理隊列中,由qtm線程處理;如果用戶已經登錄了,則先通知在登錄的用戶退出登錄,然后將用戶的登錄信息放入到UserLogoutCheckBussiness的”等待退出用戶隊列”中,由UserLogoutCheckBussiness繼續處理(utm會保證舊的用戶退出了才允許新的用戶登錄)。

  • ?

  • UserLogoutCheckBussiness是自己一個獨立的線程在運行,它周期性的檢查所有在隊列中的用戶,如果有用戶已經退出了,則將 登錄任務(OnUserLoginHandler)放入用戶的處理隊列中,由qtm線程處理;如果舊的用戶超過一定時間依然沒有退出,則會調用UserLogoutCheckBussiness.waitLogoutTimeOut方法,可以在其中通知前端登錄失敗信息。

  • ?

  • 接下來就到登錄處理(OnUserLoginHandler),會先調用loginLinkCheck方法檢查該連接是否依然在線,如果返回false則會終止登錄過程并回收申請了的相關資源,如果成功則執行userLogin方法,在userLogin中處理登錄的業務。

  • ?

    關于loginLinkCheck的詳細說明:

    登錄成功連接檢查

    (該用戶已經通過了登錄檢查,現在再次確認下連接是否還在,

    如果連接已經斷開了,那么將會觸發回收處理

    (userResource.failInLoginLinkCheck和serFlagBusiness.rollBackLoginFlagWhenLinkDisable ))

    ?

    關于為什么要有loginLinkCheck問題:

    有些socket的封裝框架給的不是說一個socket斷開了的事件或者回調(例如SmartFoxServer),而是在當用戶登錄后才會有用戶的斷線事件,設置這個loginLinkCheck方法就是為了處理這樣的問題,在loginLinkCheck里面可以調用這些封裝框架的登錄處理,如果登錄失敗(用戶已經斷開了),那么就認為是在登錄處理過程中用戶斷線了,也視為沒有登錄成功,將會回收相應的資源和標志位,如果登錄成功,則接下來用戶如果斷線了,那么Disconect事件就會被觸發=>OnUserDisconectHandler必定被觸發。(也就是在loginLinkCheck中要設置用戶已經登錄的標志)

    ?

    這個方法如果返回true, 則接下來將會執行userLogin方法,

    而且用戶斷線OnUserDisconectHandler必定被觸發,且一定在userLogin方法之后(斷線事件會被放到qtm隊列中,qtm保證一個用戶的任務被順序執行)

    ?

    ?

    ??(圖片看不清可以右鍵保存到本地后再打開瀏覽)

    ?

    ?

    用戶退出或用戶斷線:

    用戶斷線和用戶退出只有一個會被觸發,因為用戶調用退出后,其將變成游客,所以他的斷線不會觸發用戶斷線事件。用戶斷線和用戶退出是為了處理業務上更方便區分,其都是繼承AbstractOutHandler的。

    ?

    詳細流程:

  • 當用戶發送退出請求到服務端后,先經過UTM過濾器(UserThreadModeFilter)再到 用戶請求過濾器(默認實現為RequestFrequentFilter),在用戶請求過濾器中將 退出任務(OnUserLogoutHandler)放入用戶的處理隊列中,由qtm線程處理(觸發對OnUserLogoutHandler的調用)。 注:如果是用戶斷線,則會封裝成一個用戶斷線請求

  • ?

  • 在用戶退出或斷線處理中(AbstractOutHandler),首先會檢查用戶是否是登錄狀態(user.isLogining),如果不是登錄狀態則不處理(防止在用戶退出后馬上掉線,這個時候用戶退出任務未被處理,此時認為該連接對應的是一個用戶,所以會將斷線事件放入任務隊列中,導致用戶斷線和用戶退出被重復調用),如果是登錄狀態則調用相應的業務處理方法userLogout/userDisconect

  • ?

  • 分發用戶退出或者用戶斷線事件

  • ?

  • 通知 資源管理器 用戶退出

  • ?

  • 調用UserFlagBusiness. removeLoginFlag 回收用戶標志位(詳細解釋可以看類UserLogoutCheckBussiness注釋)

  • ?

    ?

    ?(圖片看不清可以右鍵保存到本地后再打開瀏覽)

    ?

    ?

    ?

    ?

    1.Utm簡介

    2. Utm 模塊設計

    3. Utm詳細實現-用戶生命流程

    4. Utm詳細實現-用戶資源管理

    5.Utm線程模型

    6. Utm示例-公共部分

    7. Utm示例-SmartFoxServer集成

    8. Utm示例-Netty集成

    9.(1.0.2版本更新)用戶隊列管理 與 用戶異常處理

    ?

    轉載于:https://my.oschina.net/DaemonChen/blog/648320

    總結

    以上是生活随笔為你收集整理的3.Utm详细实现-用户生命流程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。