高效的&使用C#.Net 4.5

时间:2016-12-21 07:10:00

标签: c# windows multithreading sockets tcp

要求: 需要基于Windows服务的C#.NET 4.5始终(至少很长)连接TCP服务器架构,并进行垂直和水平扩展,每个服务器可以处理最大可能的连接。客户可以是任何物联网(物联网)。

我知道港口的限制​​,但仍然想知道为什么这个技术时代的限制(我们总是有限制,但为什么还有旧的?!)。临时的tcp / http连接也可以很好地扩展,但这里不是必需的。

设计:

  • 每个服务器的单个线程用于异步接受新连接(服务器的生命周期)。    代码:rawTcpClient = await tcpListener.AcceptTcpClientAsync();

  • 每个客户端连接一个线程(循环)以保持客户端连接? (见下面我的Q)

  • 执行客户操作的任务(短期,间歇性 操作)

我的优化问题(如果可能?): 如何优化/管理在一组线程/线程池中保存所有客户端连接而不是每个连接一个线程,因为这是客户端生命周期,可能持续很长时间?
例如:每台服务器只分配50个基于线程的任务来保存连接的客户端,以便在等待客户端数据时不会断开连接?

1 个答案:

答案 0 :(得分:0)

  

高效&可伸缩的

您需要决定的第一件事是如何您想要的效率。如果效率是您的首要任务,套接字API可以极其复杂。然而,即使许多人认为,效率几乎从未成为首要任务。问题是复杂性会随着效率/可扩展性呈指数级增长,如果您只是最大限度地提高效率/可扩展性,那么您最终将得到一个几乎无法维护的系统。因此,您需要决定在该范围内绘制线的位置。

特别是如果你有横向缩放,你可能不需要使用极高效的套接字API。

  

我知道港口的限制​​,但仍然想知道为什么在这个技术时代存在这些限制(我们总是有限制,但为什么还有旧的?!)。

兼容性。特别是端口由16位值表示。这种情况发生变化的唯一方法就是新标准的出台,以及所有升级的标准。 NIC,网关,ISP和IoT设备。这是一个很高的命令,可能永远不会发生。

  

每个服务器的单个线程用于异步接受新连接(服务器的生命周期)。

没关系。如果您有大量的连接转换,您也可以拥有多个接受线程。只需将待办事项保持在高位(默认情况下,Windows Server操作系统应该很高)。

  

每个客户端连接一个线程(循环)以保持客户端连接?

呃,没有。

您肯定希望使用异步I / O.

您应该在所有连接的客户端上进行连续(异步)读取,然后根据需要执行(异步)写入。此外,如果协议允许,您应该定期向每个连接的客户端写入心跳消息;否则,您需要为每个客户端提供一个计时器才能断开连接。根据写入的性质,您可能需要为每个客户端设置一个待处理写入队列。

  

执行客户操作的任务(短期,间歇性   操作)

如果您使用异步任务,那么所有实际代码都将在任何可用的线程池线程上运行。根本不需要专门的任务。

您可能会发现我的TCP/IP .NET Sockets FAQ有帮助。