繁体   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