Netty+springboot開發即時通訊系統筆記(四)終

實時性

1.線程池多線程,把消息同步給其他端和對方用戶,其中數據持久化往往是最浪費時間的操作,可以使用mq異步存儲,因為其他業務不需要拿著整條數據,只需要這條數據的id進行操作。

2。消息校驗前置,放在tcp層(netty服務中)

可靠性

在這里插入圖片描述

tcp協議只能保證數據在傳輸過程中不丟失,但不能保證到某一端不會丟失,比如傳輸過程中接收方斷網,數據就無法發送到接收方 。

可靠性可以通過消息重發來保證消息一定送到了對方手中。可以通過雙重ack確認機制來實現:
在這里插入圖片描述

A向im服務端發送數據,服務端收到就返回一個ack,A收到這個ack就停止重發,否則就再次嘗試重發。當然重發需要設計上限次數的。

然后服務端接到A的數據,再發送給B,B接到之后告訴服務端,返回一個接受到的ack。服務端把收到的再傳回給A,此時A確定了此次傳輸是成功的。中間任何環節出問題,A就執行重發就ok了。

如果B不在線,服務端是可以感知到的,服務端可以代替B向A回復停止重發指令。

有序性

因為我們使用多線程保證了消息的實時性,那么就會導致消息有亂序的風險。

解決方案:

使用redis的incr命令實現原子性的遞增序列號,但是過度依賴redis可能會因為redis的崩潰而造成系統失效

冪等性

再im服務端存儲每次發過來的消息id(設置過期時間),重復發送的消息id將不再進行持久化但仍會給另一個客戶端發送消息。這樣就會導致另一個客戶端由于網絡問題如果沒有及時返回ack確認,那么他確實會收到2條相同的消息,但是在去重是完全可以處理的。

qq發消息失敗會有紅色感嘆號,當再次點擊重發時是把它當作一條新的消息id發送的,而不是之前的消息id。

消息已讀功能

在寫擴散中,每個人對自己的每條消息都可以直接獲取,已讀只不過是個字段罷了。

在讀擴散中,以群聊為例,可以在群成員表中加入一個字段,該字段表示改成員讀到的最后一條消息序列(保證有序性的那個遞增序列),在這條消息之前的就表示讀過了

離線消息存儲

IM(即時通訊)系統中的離線消息是指在目標用戶不在線或者不可達時,發送方發送的消息無法直接傳遞給目標用戶,而是被服務器暫時存儲起來,等到目標用戶上線或者可達時再進行投遞。

離線消息的存在是為了保證消息的可靠性和完整性。當發送方發送消息時,如果目標用戶在線,消息可以直接傳遞給目標用戶;但如果目標用戶不在線,服務器會將該消息存儲在消息隊列或者數據庫中,等到目標用戶上線后,服務器會將離線消息投遞給目標用戶。

離線消息通常具有以下特點:

  1. 持久化存儲:離線消息通常被存儲在服務器的數據庫或者消息隊列中,確保消息的持久性,即使服務器重啟或者斷電,消息也不會丟失。
  2. 時效性:離線消息通常會設置一個過期時間,在一定時間范圍內等待目標用戶上線,過期后會被清理或者丟棄。
  3. 投遞策略:服務器會在目標用戶上線后,根據一定的投遞策略(如先進先出、按時間戳等)將離線消息按順序投遞給目標用戶。
  4. 通知機制:當目標用戶上線后,服務器可能會發送通知給目標用戶,告知其有離線消息待接收。

這里的存儲使用redis,每人只存1000條,超過就淘汰最早的,使用zset存儲,使用消息的遞增序列號作為排序標準,zset支持查詢范圍內指定數量的元素(SMEMBERS命令)。

即使你錯過了離線消息的通知和消息盒子,你仍然可以通過滾動查看聊天記錄,找到之前的離線消息。

登錄之后的數據同步(歷史記錄的拉取)

不可能說每次登錄都把所有記錄都刪了重新拉取一遍的,所以這里采用增量拉取。

需要拉取的東西有會話,好友列表,好友申請,為每個需要拉取的數據記錄下他的遞增序列號,每次只拉取大于記錄里最大的序列號。

客戶端可以用數據庫sqllite

在線狀態設計

正常情況下,你的上線和下線等狀態應該通知給你的所有好友,和你在的所有群里的所有成員,這將是非常恐怖的數據量。

改進1:只推給在線用戶

改進2:

  1. 按需拉取:在按需拉取的策略下,IM 系統不會主動向所有好友和群成員發送上線和下線等狀態通知。相反,當其他用戶需要獲取某個用戶的狀態時,他們可以向服務器發送請求,然后服務器根據請求返回相應的狀態信息。這種方式可以避免將狀態通知廣播給所有人,只有真正需要獲取狀態信息的用戶才會發起請求,減少了不必要的數據傳輸和處理。
  2. 臨時訂閱:臨時訂閱是指用戶可以臨時訂閱某個好友或群組的狀態更新通知。當用戶訂閱了某個用戶或群組后,只有在被訂閱對象的狀態發生變化時,系統才會向訂閱者發送通知。這樣可以避免向所有好友和群成員廣播狀態更新,只有被訂閱的對象狀態發生變化時,才會發送通知給訂閱者。這種方式可以根據用戶的實際需求,選擇性地接收特定用戶或群組的狀態更新通知,減少了不必要的通知量。

陌生人發消息限制

  1. 計數限制:為每個用戶設置一個計數器,記錄他們發送給陌生人的消息數量。當陌生人發送消息時,系統會檢查計數器的值。如果計數器小于等于三,允許發送消息并將計數器加一;如果計數器大于三,拒絕發送消息。

  2. 時間限制:除了計數限制,可以設置一個時間限制,例如每小時或每天只允許陌生人發送三條消息。系統會記錄陌生人發送消息的時間,并在規定的時間段內檢查發送數量。如果超過限制,拒絕發送消息。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42722.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42722.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42722.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vim的插件管理器之Vundle

1、安裝Vundle插件管理器 Vim可以安裝插件,但是需要手動安裝比較麻煩,Vim本身沒有提供插件管理器,所以會有很多的第三方的插件管理器,有一個vim的插件叫做 “vim-easymotion”,在它的github的安裝說明里有列出對于不同…

GRPC 學習記錄

GRPC 安裝 安裝 grpcio、grpcio-tools、protobuf、 pip install grpcio -i https://pypi.tuna.tsinghua.edu.cn/simple pip install grpcio-tools -i https://pypi.tuna.tsinghua.edu.cn/simple pip install protobuf -i https://pypi.tuna.tsinghua.edu.cn/simple常用類型 p…

Minio知識點+linux下安裝+面試總結

一 Minio簡介 MinIO 是一個基于Apache License v2.0開源協議的對象存儲服務。它兼容亞馬遜S3云存儲服務接口,非常適合于存儲大容量非結構化的數據,例如圖片、視頻、日志文件、備份數據和容器/虛擬機鏡像等,而一個對象文件可以是任意大小&…

Apache Doris 入門教程31:計算節點

需求場景? 目前Doris是一個典型Share-Nothing的架構, 通過綁定數據和計算資源在同一個節點獲得非常好的性能表現. 但隨著Doris計算引擎性能持續提高, 越來越多的用戶也開始選擇使用Doris直接查詢數據湖數據. 這類場景是一種Share-Disk場景, 數據往往存儲在遠端的HDFS/S3上, 計…

msvcp110.dll是什么意思,msvcp110.dll丟失的解決方法

裝好軟件或游戲之后,一打開就跳出各種報錯信息的情況小伙伴一定見過,其中缺少各種msvcp110.dll文件最常見。小伙伴們一定奇怪,用得好好的電腦,怎么會缺文件呢?為啥其他游戲/應用就沒事呢?其實這些“丟失”的…

visual studio 2022配置

前提:我linux c 開發 一直在使用vscode 更新了個版本突然代碼中的查找所用引用和變量修改名稱不能用了,嘗試了重新配置clang vc都不行,估計是插件問題,一怒之下改用visual studio 2022 為了同步2個IDE之間的差別,目前…

QT的核心——信號與槽

目錄 回顧C 語言信號 1、信號與槽 2、關聯信號與槽 2.1自動關聯信號與槽 2.2手動關聯信號與槽 2.3斷開信號與槽 3、自定義信號 3.1自定義信號使用條件 3.2自定義槽函數使用條件 4、信號與槽參數傳遞 4.1自定義一個帶參的信號 4.2關聯帶參的信號與槽 4.3發送一個帶…

YOLOv5、YOLOv8改進:S2注意力機制

目錄 1.簡介 2.YOLOv5改進 2.1增加以下S2-MLPv2.yaml文件 2.2common.py配置 2.3yolo.py配置 1.簡介 S2-MLPv2注意力機制 最近,出現了基于 MLP 的視覺主干。與 CNN 和視覺Transformer相比,基于 MLP 的視覺架構具有較少的歸納偏差,在圖像識…

LVS-DR+keepalived實現高可用負載群集

VRRP 通信原理: VRRP就是虛擬路由冗余協議,它的出現就是為了解決靜態路由的單點故障。 VRRP是通過一種競選的一種協議機制,來將路由交給某臺VRRP路由。 VRRP用IP多播的方式(多播地址224.0.0.18)來實現高可用的通信&…

基于STM32+OneNet設計的物聯網智慧路燈

一、前言 近年來,構筑智慧城市、推動城鎮發展被國家列入重要工作范疇。發布的《超級智慧城市報告》顯示,全球已啟動或在建的智慧城市有1000多個,中國在建500個,遠超排名第二的歐洲(90個)。從在建智慧城市的…

(五)Unity開發Vision Pro——FAQ

常見問題 (FAQ) 1.問:我看到在visionOS 模擬器中運行的結果與在硬件上運行的結果不同 請注意,在模擬器中運行時,某些特定于硬件的功能不可用 - 最明顯的是 AR 數據。這可能意味著 VisionOS 模擬器中的模擬結果可能與 Vision Pro 耳機上的模…

Android oaid

官方GitHub地址 https://github.com/gzu-liyujiang/Android_CN_OAID 生成和用途介紹 https://www.jianshu.com/p/1c7ef27d6db4 圖片來源于上述網站 其他關于id的介紹 https://www.cnblogs.com/chenKnowledgeConllection/p/17380960.html https://zhuanlan.zhihu.com/p/55…

微信小程序拉起支付報: 調用支付JSAPI缺少參數: total_fee

1. 調用支付JSAPI缺少參數: total_fee 2. 檢查返回給前端調起支付的參數是否正確 一開始是params.put("package", prepay_id); 回來改回params.put("package", "prepay_id"prepay_id);

leetcode 415.字符串相加

?? 題目描述 🌟 leetcode鏈接:https://leetcode.cn/problems/add-strings/description/ ps: 從兩個字符串的末尾開始遍歷,依次相加,若大于等于 10 則使用一個變量記錄進位,遍歷的時候若兩個字符串其中一…

算法通關村——不簡單的字符串轉換問題

1. 轉換成小寫字母 給你一個字符串 s ,將該字符串中的大寫字母轉換成相同的小寫字母,返回新的字符串。 轉換成小寫字母 1.1 利用ASCII 首先需要直到常見的ASCII值 a-z: 97-122 A-Z: 65-90 0-9: 48-57 只需要將這個字符串先轉換成字符,然后…

ASR(自動語音識別)任務中的LLM(大語言模型)

一、LLM大語言模型的特點 二、大語言模型在ASR任務中的應用 淺度融合 淺層融合指的是LLM本身并沒有和音頻信息進行直接計算。其僅對ASR模型輸出的文本結果進行重打分或者質量評估。 深度融合 LLM與ASR模型進行深度結合,統一語音和文本的編碼空間或者直接利用ASR…

OKCC在系統安全方面做了哪些措施?

語音通信行業,運營者普遍比較關心的問題是,運營風險如何控制?運營安全如何保證?OKCC呼叫中心又有那些風控措施來保證運營安全。 當前階段,語音通信運營,最主要的風險主要包括以下幾個方面: 一、…

無涯教程-Perl - wait函數

描述 該函數等待子進程終止,返回已故進程的進程ID。進程的退出狀態包含在$?中。 語法 以下是此函數的簡單語法- wait返回值 如果沒有子進程,則此函數返回-1,否則將顯示已故進程的進程ID Perl 中的 wait函數 - 無涯教程網無涯教程網提供描述該函數等待子進程終止,返回已故…

Three.js 實現模型材質局部輝光效果和解決輝光影響場景背景圖顯示的問題

1.Three.js 實現模型材質局部輝光效果 2.解決輝光效果影響場景背景圖顯示的問題 相關API的使用: 1. EffectComposer(渲染后處理的通用框架,用于將多個渲染通道(pass)組合在一起創建特定的視覺效果) 2. …

MME: A Comprehensive Evaluation Benchmark for Multimodal Large Language Models

本文也是LLM系列相關文章,針對《MME: A Comprehensive Evaluation Benchmark for Multimodal Large Language Models》的翻譯。 MME:一個多模態大型語言模型的綜合評估基準 摘要1 引言2 MME評估套件3 實驗4 分析5 結論 摘要 多模態大語言模型(MLLM&…