我正在为一个非常大的模拟创建一个Java服务器,我有几个高级设计问题。
对于少数客户,我认为这样可以正常工作。
问题1:此线程模型是否适用于大量(数千)连接的客户端?我不熟悉这种Java实现中的内存/ CPU开销。
问题2:我想避免让服务器异步向客户端发送消息,但在某些情况下我可能需要让服务器发送"现在自己更新"消息与某些或许多客户端异步,我不太清楚如何做到这一点。让模拟逻辑线程发送这些消息似乎没有...可能是某些"客户端通知线程池"概念
答案 0 :(得分:0)
你问两个问题;我会回答第一个问题。
我之前编写的应用程序涉及一个应用程序中的数千个线程。我们曾经遇到过Linux服务器上最大线程数问题;对我们来说,我认为限制大约是1000个线程。这影响了我们的Java应用程序,因为Java线程使用本机线程我们将限制设置得更高,应用程序扩展到大约2000个线程,这是我们所需要的,没有问题;如果我们需要将它扩大得更高,我不知道会发生什么。
默认的最大线程数为1000表明在单个Linux服务器上运行数千个线程可能并不明智。我认为主要问题是需要为每个线程分配足够的堆栈内存。
我们预期的长期修复方法是更改为一个体系结构,其中来自线程池的线程每个服务多个套接字。这真的不是一个问题;对于每个套接字,线程只需处理任何挂起的消息,然后再转到下一个套接字。您必须小心同步内存访问,但您的应用程序已经需要这样做,因为您的模拟已经与多个线程进行交互,因此该部分不会发生巨大变化。