我有一个连接到第三方服务器的应用程序,我们称之为Server-A。我得到了四个不同的端口,即 4000, 40001, 40002, 40003.在每个端口上,我可以创建 20 个连接,因此我可以与服务器 A 创建总共 80 个连接。我想创建一个服务层,该层应该在上述端口上与服务器 A 通信。该技术将 asp.net C#。
问题陈述
1-应用程序应该是非阻塞/异步的,以每天处理1000万到2000万个请求
2-每当服务层启动时,它在每个端口上创建20个连接。(共 80 个连接)
2-所有连接应保持24/7连接/活动状态,并在任何连接断开/断开连接时重新连接。它将在空闲时间发送检测信号消息。
我的问题
- 如何管理这些连接?当TCP套接字成功时,我应该将它们一一添加到静态列表中吗?
- 我如何知道某个连接已断开/断开连接?
- 如何在不同的端口上发送某些请求?假设 a>b 在端口 4000 上发送,否则如果 a<=b 在 4001 上发送
- 如何使其异步?
对于初始启动,我在单个端口上创建了一个TCP连接,它按预期工作。然后我为其他端口复制了相同的代码,但我知道这是非常糟糕的方法,我必须复制相同的代码 80 次才能建立 80 个连接。我想要一种干净且可扩展的方式来实现它,以便将来我可以将连接增加到 100 或更多。 是否有任何我可以使用的框架? 任何帮助都会得到极大的评价。
@Kartoos Khan,我已经根据这些要求制作了一些服务,使用异步方法是在 C# 中创建高性能服务的最佳方式,因为:
- 它不会像套接字那样阻塞 IO 外围设备。
- 最小化线程并提高其性能。
让我向您推荐《编写高性能 .NET 代码》一书。第 4 章"异步编程">包含提高性能所需的信息。
根据我的经验,这些是我的建议:
-
创建主要威胁来处理主程序。
-
创建一个类来处理套接字服务器,该套接字服务器使用方法
BeginAccept
和EndAccept
实现一个异步进程来接受连接,下面是如何使用它的示例。 创建另一个类来处理套接字连接,该套接字连接的属性是Socket
对象。2.1 创建一个方法来启动读取过程,服务器类将调用该方法以启动端点之间的通信。此方法将以异步方式启动读取过程。
2.2 要以异步方式读写,需要从套接字获取
NetworkStream
,并使用BeginRead
和EndRead
的方法接收数据,BegineWrite
和EndWrite
发送数据。这里有文档。
如果您的服务只需要连接到服务器,请忽略步骤 1 并实现 Client 类以启动与特定终结点的连接。
- 使用集合类
(可以是
Dictionary
键值对集合)来存储每个客户端类,并使用套接字 ID 作为访问每个客户端类的键。
由于每个客户端套接字都处理自己的套接字,我用来实现一种在同一客户端套接字上重新连接的方法,这样每个客户端都对自己负责。
主程序将负责创建每个客户端服务器并根据需要设置每个客户端的端点,并开始连接每个客户端。在这种情况下,
TCPClient
允许您使用方法开始异步连接过程BeginConnect
和EndConnect
.
在这里,您可以看到有关此问题的更多详细信息。
我希望这对你有用。
要处理如此大量的流量,您需要做一些事情。
假设
- 您正在连接到另一个客户端的服务器。
- 您有大量来自多台计算机或任何给定计算机上的多个工作进程的 Web 流量。
- 您知道如何创建 TCP 客户端服务器对象并处理连接。
对于服务器上少于 80 个工作线程:
- 由于每个线程都是同步处理的,因此只需为每个线程使用一个连接。
- 如果没有单个 Web 服务器运行超过 20 个工作进程,则可以为每个服务器指定一个要使用的端口。 将端口作为变量粘贴到 web.config 文件中,并在创建连接时使用它。 你永远不会达到极限。
- 将连接存储在整个应用程序可以使用的共享对象中(可以将其放在 BLL 图层中),如果出现连接错误,请在该线程上重新创建新连接。
对于跨服务器的 80 多个工作线程:
- 执行与最后一步相同的操作,但此时您需要协商更多连接,或者您将在应用程序和您希望访问的服务器之间添加一个新层。
- 第二层充当双方的代理,可以管理连接池,并在每次需要访问 Server-A 时提取连接,并在完成后将其放回池中。
- 无论何时连接到代理应用程序,生成一个新线程来执行处理,直到连接断开或关闭。
- 跟踪您的打开连接和中提琴,您可以根据需要拥有任意数量的客户端,但即使您有数百或数千个连接,您的瓶颈也将是这 80 个连接。