高可用性TCP服务器应用程序

问题描述 投票:-1回答:1

在我的项目中,我有一个运行C#应用程序的云托管虚拟机,它需要:

  1. 接受来自多个外部客户端的TCP连接(大约500个)
  2. 从连接的客户端异步接收数据(不是高频,大约每分钟1条消息)
  3. 对接收到的数据进行一些处理
  4. 将接收到的数据转发给其他参与者
  5. 回复给连接的客户端,并可能进行一些异步发送(基于内部时间检查)

在我看来,设计非常简单。我提供了一个侦听器,该侦听器接受传入的TCP连接,在建立新连接时会产生一个新线程;该线程在循环中运行(执行活动从2到5),并检查相关的套接字活动性(如果套接字已死,则线程退出循环并最终终止;稍后,将尝试从属于该套接字的外部客户端尝试建立新连接)。

所以现在的问题是,对于数量有限的外部客户端(我想说是200/300),所有设备都运行正常,但是随着数量的增长(或当客户端以更高的频率发送数据时),通信将变得非常缓慢且受阻。

例如,我在考虑更好的设计:

  • 使用任务而不是线程
  • 使用线程池
  • 用类似1Thread10Socket的东西替换1Thread1Socket

甚至是一些扩展策略:

  • 在同一应用程序中打开两个不同的TCP侦听器(不同的端口)(重新配置客户端,使它们的一半针对每个侦听器)
  • 在同一虚拟机上为两个相同的应用程序提供两个不同的TCP侦听器(不同的端口)
  • 设置两个不同的虚拟机,并在每个虚拟机上运行相同的应用程序(重新配置客户端,使它们的一半针对每个虚拟机地址)

最后一个问题:目前的设计是糟糕的还是天真的?您认为我处理沟通的方式是否有重大批评?您是否还有其他更健壮和有效的选项(在上述选项中,还是在其他选项中)?

谢谢

c# multithreading tcp communication scalability
1个回答
0
投票

听众的数量不太可能成为限制因素。在Stack Overflow,我们每个实例处理约60k个套接字,而我们需要多个侦听器的唯一原因是我们可以在多个端口上分配流量以避免负载均衡器上的临时端口耗尽

© www.soinside.com 2019 - 2024. All rights reserved.