升訊威在線客服系統的併發高性能數據處理技術:實現拔網線也不丟消息的高可靠通信(附視頻)

我在業餘時間開發維護了一款免費開源的升訊威在線客服系統,也收穫了許多用戶。對我來說,只要能獲得用戶的認可,就是我最大的動力。

客服系統開發過程中,最讓我意外的是對 TCP/IP 協議的認識。過去一直認爲 TCP/IP 是可靠的連接,加上過去開發的軟件網絡環境比較穩定,很少在這個問題上糾結。

直到客服系統的客戶越來越多,才重新讓我認識了基於 TCP/IP 協議的軟件應該如何設計開發。

有許多客戶做的是外貿業務,服務器部署在海外,比如香港、韓國、美國等,有些客服之前用基於網頁的客服系統,最爲困擾的問題就是丟消息!而使用我的客服系統,做到了100%穩定,不丟客戶不丟消息


演示網絡中斷,直接禁用網卡,或者手機進入飛行模式,也不丟消息,不出異常。

視頻地址:https://v.youku.com/v_show/id_XNTEwNzQ5Mzg2OA==.html


我會通過一系列的文章詳細分析升訊威在線客服系統的併發高性能技術是如何實現的,使用了哪些方案以及具體的做法。本文將介紹如何爲多線程處理同步數據。

先看實現效果

客服端

訪客端


本文將分幾個部分,詳細介紹基於 TCP/IP 協議開發時,應該如何考慮複雜網絡環境下的消息傳輸。


TCP 報文的確認機制

首先我們回顧一下 TCP 協議,TCP 報文格式一般如下所示:
其中的 ACK ,表示對報文是否送達的一個迴應。
在這裏插入圖片描述
ACK是TCP標頭中的標誌和字段。 發送一個消息至少需要一個標頭,再加上所有較低層的內容。

下圖則顯示了 TCP 通信時,客戶端和服務端之間報文傳送的過程。
從圖中可以看到,發出的消息,和迴應的消息,都會有一個編號,如:#1、#2
在ACK報文迴應時,它回附帶上所收到的報文的編號,那麼發送端只需根據收到的ACK報文中的編號,就能判定報文是否送達,已經所送達的數據包。如果在一定時間內,沒有收到迴應的ACK消息,則發送端會在一定時間內重新嘗試發送。
在這裏插入圖片描述

通過 C# 實現拔網線也不丟消息的高可靠通信

基於 TCP 協議自有的消息確認機制,我們在上層應用中實現可靠的通信就比較簡單了。底層通信相關的類已經幫我們實現好了可靠的 TCP 傳輸,一旦出現網絡異常,我們在上層都能夠收到相應的通知。

客戶端自身網絡異常

這種情況最好處理。因爲客戶端程序異常退出會直接引發 ConnectionReset 的 Socket 異常。我們只需要在服務端捕獲這個異常進行處理即可:

 public bool Send(byte[] data)
        {
            // 連接已經斷開了
            try
            {
                _networkStream.Write(data, 0, data.Length);
            }
            catch (Exception ex)
            {
                OnDisconnected(ex);
                return false;
            }

            return true;
        }

網絡鏈路異常

對於這種情況,我們只需要檢測 Socket 對象的 Connected 屬性。
但是需要特別注意:Socket 對象的 Connected 屬性獲取從 Socket 最後一個 i/o 操作到的的連接狀態。 當它返回時 false , Socket 要麼從未連接,要麼不再處於連接狀態。當 Socket 從另一個線程斷開連接時,它可能會在操作中止後返回。
如果需要確定連接的當前狀態,請發出非阻止的零字節發送調用。 如果調用成功返回或引發 WAEWOULDBLOCK 錯誤代碼 (10035) ,則套接字仍處於連接狀態;否則,將不再連接套接字。

我們可以通過實現一個定時心跳,來對網絡鏈路進行檢測:

_heartbeatTimer = new Timer((state) =>
            {
                HeartbeatMessage heartbeatMessage = new HeartbeatMessage();
                Send(heartbeatMessage);

            }, null, 3000, 3000);

在定時器發送心跳時,如果網絡鏈路中斷,我們可以收到以下消息:

 private void _socketClient_Disconnected(object sender, EventArgs e)
        {
            if (_heartbeatTimer != null)
                _heartbeatTimer.Dispose();

            if (_socketClient != null)
            {
                _socketClient.Close();
                _socketClient = null;
            }
        }

只需針對 Disconnected 事件,進行處理,將兩端的狀態,置於等待即可。


簡介

升訊威在線客服與營銷系統是一款客服軟件,但更重要的是一款營銷利器。

https://kf.shengxunwei.com/

  • 可以追蹤正在訪問網站或使用 APP 的所有訪客,收集他們的瀏覽情況,使客服能夠主動出擊,施展話術,促進成單。
    訪* 客端在 PC 支持所有新老瀏覽器。包括不支持 WebSocket 的 IE8 也能正常使用。
  • 移動端支持所有手機瀏覽器、APP、各大平臺的公衆號對接。
  • 支持訪客信息互通,可傳輸訪客標識、名稱和其它任意信息到客服系統。
  • 具備一線專業技術水平,網絡中斷,拔掉網線,手機飛行模式,不丟消息。同類軟件可以按視頻方式對比測試。

希望能夠打造: 開放、開源、共享。努力打造 .net 社區的一款優秀開源產品。

鐘意的話請給個贊支持一下吧,謝謝~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章