簡體   English   中英

如何使用 ASP.NET 和 C# 管理大量 TCP 連接

[英]How to manage large number of TCP connections using ASP.NET and C#

我有一個連接到第三方服務器的應用程序,我們稱之為 Server-A。 我獲得了四個不同的端口,即 4000、40001、40002、40003。在每個端口上我可以創建 20 個連接,因此我可以創建與服務器 A 的總共 80 個連接。 我想創建一個服務層,它應該在提到的端口上與服務器 A 通信。 該技術將是 asp.net C#。

問題陳述

1- 應用程序應該是非阻塞/異步的,以每天處理 10 到 2000 萬個請求

2-每當服務層啟動時,它會在每個端口上創建 20 個連接。 (共 80 個連接)

2-所有連接應保持連接/活動 24/7 並在任何連接斷開/斷開時重新連接。 它會在空閑時間發送心跳消息。

我的問題

  • 我該如何管理這些連接? 當 TCP 套接字成功時,我是否應該將它們一一添加到 static 列表中?
  • 我怎么知道某個連接被丟棄/斷開了?
  • 如何在不同的端口上發送某些請求? 假設 a>b 在端口 4000 上發送,否則如果 a<=b 在 4001 上發送
  • 我怎樣才能使它異步?

首先,我在單個端口上創建了一個 TCP 連接,它按預期工作。 然后我為其他端口復制了相同的代碼,但我知道這是非常糟糕的方法,我必須復制相同的代碼 80 次才能建立 80 個連接。 我想要一種干凈且可擴展的方式來實現它,這樣將來我可能會將連接增加到 100 或更多。 有沒有我可以使用的框架? 任何幫助都會受到極大的評價。

要處理如此大量的流量,您需要做一些事情。

假設

  • 您正在連接到另一個客戶端的服務器。
  • 您有來自多台機器或任何給定機器上的多個工作進程的大量 web 流量。
  • 您知道如何創建 TCP 客戶端服務器對象並處理連接。

對於跨服務器的少於 80 個工作線程:

  • 因為每個線程都是同步處理的,所以你只需要為每個線程使用一個單獨的連接。
  • 如果沒有單個 web 服務器運行超過 20 個工作進程,那么您可以指定一個端口供每個服務器使用。 將端口粘貼在 web.config 文件中作為變量,並在創建連接時使用它。 你永遠不會達到極限。
  • 將您的連接存儲在整個應用程序可以使用的共享 object 中(可以將其放在您的 BLL 層中),如果您遇到連接錯誤,請在該線程上重新創建一個新連接。

對於跨服務器的 80 多個工作線程:

  • 執行與最后一步相同的操作,但此時您需要協商更多連接,或者您將在應用程序和您希望訪問的服務器之間添加一個新層。
  • 第二層充當雙方的代理,可以管理一個連接池,並在每次需要訪問 Server-A 時提取一個連接,並在完成后將其放回池中。
  • 每當您連接到代理應用程序時,都會產生一個新線程來進行處理,直到連接斷開或關閉。
  • 跟蹤您的開放連接和中提琴,您可以擁有任意數量的客戶端,但您的瓶頸將是這 80 個連接,即使您有數百或數千個連接。

@Kartoos Khan,我已經根據這些要求提供了一些服務,使用異步方法是在 C# 中創建高性能服務的最佳方式,因為:

  • 它不會阻塞 IO 外設,就像 sockets 一樣。
  • 最小化線程並提高性能。

讓我向您推薦《編寫高性能 .NET 代碼》一書。 4 章,異步編程提供了提高性能所需了解的信息。

根據我的經驗,這些是我的建議:

  1. 創建一個主要的威脅來處理主程序。

  2. 創建一個 class 來處理 Socket Server,它實現了一個異步過程來接受連接,使用方法BeginAcceptEndAccept這里是如何使用它的示例。 創建另一個 class 來處理套接字連接,它具有Socket object 作為屬性。

    2.1 創建一個方法來啟動Reading進程,Server class會調用這個方法來啟動端點之間的通信。 此方法將以異步方式啟動讀取過程。

    2.2 異步讀寫,需要從socket中獲取NetworkStream ,使用BeginReadEndRead方法接收數據, BegineWriteEndWrite方法發送數據。 這里有文檔。

如果你的服務只需要連接到一個Server,忽略第1步,執行Client class來啟動到特定EndPoint的連接。

  1. 使用集合 class,也可以是DictionaryKey-Value-Pair集合,來存儲每個 Client Class 並使用套接字 ID 作為訪問每個 Client Class 的鍵。

  2. 由於每個客戶端套接字都處理它自己的套接字,我用來實現一種在同一個客戶端套接字上重新連接的方法,這樣每個客戶端都對自己負責。

  3. 主程序將負責創建每個客戶端服務器並根據需要設置每個客戶端的端點,並開始連接每個客戶端。 在這種情況下, TCPClient允許您使用BeginConnectEndConnect方法開始異步連接過程。

在這里,您可以查看有關此問題的更多詳細信息。

我希望這可能對你有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM