升讯威在线客服系统的并发高性能数据处理技术:实现拔网线也不丢消息的高可靠通信(附视频)
我在業(yè)余時間開發(fā)維護了一款免費開源的升訊威在線客服系統(tǒng),也收獲了許多用戶。對我來說,只要能獲得用戶的認可,就是我最大的動力。
客服系統(tǒng)開發(fā)過程中,最讓我意外的是對 TCP/IP 協(xié)議的認識。過去一直認為 TCP/IP 是可靠的連接,加上過去開發(fā)的軟件網(wǎng)絡(luò)環(huán)境比較穩(wěn)定,很少在這個問題上糾結(jié)。
直到客服系統(tǒng)的客戶越來越多,才重新讓我認識了基于 TCP/IP 協(xié)議的軟件應(yīng)該如何設(shè)計開發(fā)。
有許多客戶做的是外貿(mào)業(yè)務(wù),服務(wù)器部署在海外,比如香港、韓國、美國等,有些客服之前用基于網(wǎng)頁的客服系統(tǒng),最為困擾的問題就是丟消息!而使用我的客服系統(tǒng),做到了100%穩(wěn)定,不丟客戶不丟消息。
演示網(wǎng)絡(luò)中斷,直接禁用網(wǎng)卡,或者手機進入飛行模式,也不丟消息,不出異常。
視頻地址:https://v.youku.com/v_show/id_XNTEwNzQ5Mzg2OA==.html
我會通過一系列的文章詳細分析升訊威在線客服系統(tǒng)的并發(fā)高性能技術(shù)是如何實現(xiàn)的,使用了哪些方案以及具體的做法。本文將介紹如何為多線程處理同步數(shù)據(jù)。
先看實現(xiàn)效果
客服端
訪客端
本文將分幾個部分,詳細介紹基于 TCP/IP 協(xié)議開發(fā)時,應(yīng)該如何考慮復(fù)雜網(wǎng)絡(luò)環(huán)境下的消息傳輸。
TCP 報文的確認機制
首先我們回顧一下 TCP 協(xié)議,TCP 報文格式一般如下所示:
其中的 ACK ,表示對報文是否送達的一個回應(yīng)。
ACK是TCP標頭中的標志和字段。 發(fā)送一個消息至少需要一個標頭,再加上所有較低層的內(nèi)容。
下圖則顯示了 TCP 通信時,客戶端和服務(wù)端之間報文傳送的過程。
從圖中可以看到,發(fā)出的消息,和回應(yīng)的消息,都會有一個編號,如:#1、#2
在ACK報文回應(yīng)時,它回附帶上所收到的報文的編號,那么發(fā)送端只需根據(jù)收到的ACK報文中的編號,就能判定報文是否送達,已經(jīng)所送達的數(shù)據(jù)包。如果在一定時間內(nèi),沒有收到回應(yīng)的ACK消息,則發(fā)送端會在一定時間內(nèi)重新嘗試發(fā)送。
通過 C# 實現(xiàn)拔網(wǎng)線也不丟消息的高可靠通信
基于 TCP 協(xié)議自有的消息確認機制,我們在上層應(yīng)用中實現(xiàn)可靠的通信就比較簡單了。底層通信相關(guān)的類已經(jīng)幫我們實現(xiàn)好了可靠的 TCP 傳輸,一旦出現(xiàn)網(wǎng)絡(luò)異常,我們在上層都能夠收到相應(yīng)的通知。
客戶端自身網(wǎng)絡(luò)異常
這種情況最好處理。因為客戶端程序異常退出會直接引發(fā) ConnectionReset 的 Socket 異常。我們只需要在服務(wù)端捕獲這個異常進行處理即可:
public bool Send(byte[] data)
{
// 連接已經(jīng)斷開了
try
{
_networkStream.Write(data, 0, data.Length);
}
catch (Exception ex)
{
OnDisconnected(ex);
return false;
}
return true;
}
網(wǎng)絡(luò)鏈路異常
對于這種情況,我們只需要檢測 Socket 對象的 Connected 屬性。
但是需要特別注意:Socket 對象的 Connected 屬性獲取從 Socket 最后一個 i/o 操作到的的連接狀態(tài)。 當它返回時 false , Socket 要么從未連接,要么不再處于連接狀態(tài)。當 Socket 從另一個線程斷開連接時,它可能會在操作中止后返回。
如果需要確定連接的當前狀態(tài),請發(fā)出非阻止的零字節(jié)發(fā)送調(diào)用。 如果調(diào)用成功返回或引發(fā) WAEWOULDBLOCK 錯誤代碼 (10035) ,則套接字仍處于連接狀態(tài);否則,將不再連接套接字。
我們可以通過實現(xiàn)一個定時心跳,來對網(wǎng)絡(luò)鏈路進行檢測:
_heartbeatTimer = new Timer((state) =>
{
HeartbeatMessage heartbeatMessage = new HeartbeatMessage();
Send(heartbeatMessage);
}, null, 3000, 3000);
在定時器發(fā)送心跳時,如果網(wǎng)絡(luò)鏈路中斷,我們可以收到以下消息:
private void _socketClient_Disconnected(object sender, EventArgs e)
{
if (_heartbeatTimer != null)
_heartbeatTimer.Dispose();
if (_socketClient != null)
{
_socketClient.Close();
_socketClient = null;
}
}
只需針對 Disconnected 事件,進行處理,將兩端的狀態(tài),置于等待即可。
簡介
升訊威在線客服與營銷系統(tǒng)是一款客服軟件,但更重要的是一款營銷利器。
https://kf.shengxunwei.com/
- 可以追蹤正在訪問網(wǎng)站或使用 APP 的所有訪客,收集他們的瀏覽情況,使客服能夠主動出擊,施展話術(shù),促進成單。
訪* 客端在 PC 支持所有新老瀏覽器。包括不支持 WebSocket 的 IE8 也能正常使用。 - 移動端支持所有手機瀏覽器、APP、各大平臺的公眾號對接。
- 支持訪客信息互通,可傳輸訪客標識、名稱和其它任意信息到客服系統(tǒng)。
- 具備一線專業(yè)技術(shù)水平,網(wǎng)絡(luò)中斷,拔掉網(wǎng)線,手機飛行模式,不丟消息。同類軟件可以按視頻方式對比測試。
-
- 優(yōu)酷視頻:https://v.youku.com/v_show/id_XNTEwNzQ5Mzg2OA==.html
-
- bilibili 視頻:https://www.bilibili.com/video/BV1pK4y1N7UP?t=22
希望能夠打造: 開放、開源、共享。努力打造 .net 社區(qū)的一款優(yōu)秀開源產(chǎn)品。
鐘意的話請給個贊支持一下吧,謝謝~
總結(jié)
以上是生活随笔為你收集整理的升讯威在线客服系统的并发高性能数据处理技术:实现拔网线也不丢消息的高可靠通信(附视频)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 探索人工智能的世界:构建智能问答系统之环
- 下一篇: 设计模式(十三)职责链