我正在设计一个应用程序,其中许多客户端连接到中央服务器。这台服务器保持这些连接,每隔半小时发送一次keepalive。服务器具有嵌入式HTTP服务器,该服务器提供到客户端连接的接口(例如,http://server/isClientConnected?id=id)。我想知道什么是最好的方式去做这件事。我目前的实现是使用Java,而我只有一个带有ID的Map作为关键字,但每个连接都启动一个线程,我不知道这是否是真正实现此目的的最佳方式。任何指针将不胜感激。
谢谢,
艾萨克·沃勒如何设计具有多个持久连接的服务器
2
A
回答
6
使用java.nio包,如本页所述:Building Highly Scalable Servers with Java NIO。请仔细阅读本页:Architecture of a Highly Scalable NIO-Based Server。
就我个人而言,我不打扰NIO内部并使用像Apache MINA或xSocket这样的框架。 NIO很复杂,很容易在很模糊的方面出错。如果你希望它“只是工作”,那么使用一个框架。
2
如果客户端将连接了很长一段时间,分配每个客户端线程可能会出现问题。服务器上的每个线程都需要一定量的资源(例如堆栈的内存)。
您可以使用Jetty Continuations通过使用异步servlet处理线程数较少的客户端请求。
3
对于每个连接单线程,通常可以在单台机器上扩展到大约10,000个连接。对于Windows 32计算机,您可能会达到1000个连接的限制。
要避免这种情况,您可以更改程序的设计,也可以向外扩展(水平)。你必须用硬件成本来减轻开发成本。
每个用户的单线程和单个连续连接通常是最简单的编程模型。我会坚持使用这个模型,直到达到当前硬件的极限。此时,我会决定更改代码或添加更多硬件。
0
阅读更多关于反应堆模式。在Java中有一个实现(它使用通道代替客户端的线程)。 它很容易实现,非常有效。
相关问题
- 1. 持久连接的基本客户端 - 服务器设计?
- 2. 用于服务器到服务器连接的单个持久性TCP连接
- 3. Petapoco具有用于多个服务器连接的工厂设计模式
- 4. 在Golang服务器中接受一个持久的tcp连接
- 5. 连接到HTTP服务器的urllib.request连接的持久性
- 6. 如何测试HTTP服务器中的持久连接?
- 7. 如何使用JavaScript创建与服务器的持久连接?
- 8. ASMX Web服务中的持久连接
- 9. 如何使用xmemcached或spymemcached持久连接到memcached服务器
- 10. 支持我的代理服务器中的持久HTTP连接
- 11. 测试Web服务中的持久或非持久连接
- 12. WCF服务Http持久连接/会话
- 13. RESTful服务 - 如何设计具有多个参数的URL
- 14. HTTP服务器不支持持久连接
- 15. 如何关闭Web服务调用的持久连接
- 16. winsock连接持续多久?
- 17. 多个请求的服务持久性
- 18. 将多个客户端连接到后端服务器的单个HTTP持久连接
- 19. 从Android到Node.js服务器的持久HTTP连接
- 20. 来自Java服务器的持久http连接
- 21. Web服务器上的持久连接HTTP1.1
- 22. 如何使用持久连接创建服务工作者
- 23. 如何在node.js中设计持久性服务
- 24. 具有多个接口(Linux)的服务器上接收多播
- 25. 如何实现与服务器的持久HTTP连接的代理缓存?
- 26. 持久连接
- 27. 如何使用Java建立与数据库服务器的持久连接?
- 28. 如何连接到GSS中的多服务器计算机?
- 29. 机器人服务持久
- 30. 如何让多个gevent服务器永久服务?