几年前,我开发了一个服务器应用程序(C#,.NET 4.0),它有多个连接到它的客户端。我这样做的方法是为每个连接创建一个线程,并维护这些连接的列表。当我测试应用程序时,它处理了我国50个客户端的连接。它运行正常(从我看到的)。
我的问题是这些:
我知道这有点模糊,但是自从我不久前开发这个项目以来,我已经忘记了一些更复杂的细节。我有兴趣为.NET中的服务器应用程序开发可扩展的解决方案,并希望从一开始就知道我之前的方法有哪些改进。
更新1
我没有使用实例化的线程轮询。我实际上为方法创建了一个Thread(让我们称之为方法threadLife)。
在threadLife中的我有一个while(true)
语句,我在等待来自客户端的消息。在那段时间我会等待客户端,所以发送一条消息(所以一直被阻止,直到我收到消息)
在我的应用程序中,连接非常稳定(即客户端将长时间保持连接),因此连接保持活动直到客户端断开连接(在每条消息之后没有关闭连接,我会非常接受频繁的消息,让我知道客户状态)
答案 0 :(得分:2)
每个连接的线程不是一个可扩展的解决方案。
为了好好扩展,您应该专门使用异步套接字方法。问题是是在一个线程上复用它们还是使用线程池。线程池比多路复用更好地扩展,但它引入了多线程复杂性。
许多开发人员同时尝试学习套接字编程和多线程,这太过分了。
答案 1 :(得分:0)
可以使用消息队列,负载平衡,调度等等。没有单一的答案。有些解决方案很好地解决了一些问题,有些则没有。
好的起点可以是:
答案 2 :(得分:0)
每个连接一个线程不可扩展。
我建议线程可以处理一组连接的客户端。如果连接的客户端数量增加,服务器应用程序应该能够添加处理加速所需的多个线程。如果事情继续增长,那么其他服务器实例。
不是拥有执行所有操作的线程(如应用程序实例所做的那样),而是让一些专用线程分别处理相同的任务并以同步方式共享内存数据。
这越来越像IIS的工作方式。可通过控制面板管理工作进程数,线程数和线程池数。
我记得OpenSim项目(虚拟世界平台)以这种方式运行:每个连接客户端一个线程。它已经按照上面解释的方式进行了重构。
显然你已经开始使用多线程了。也许这free ebook会帮助你进一步挖掘。
当我开始多线程时,我起初遇到了一些麻烦,这意味着它意味着同时执行相同的代码,主要在同一个实例中。