首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >面向大容量Java服务器的线程模型

面向大容量Java服务器的线程模型
EN

Stack Overflow用户
提问于 2016-08-08 18:39:14
回答 1查看 253关注 0票数 1

我正在为一个相当大的模拟创建一个Java服务器,我有几个高级设计问题。

一些背景:

  • 服务器将运行模拟。
  • 客户端将通过来自移动设备的TCP连接连接到服务器,并与模拟中的数据结构进行交互。最初,我将尝试在客户端中使用一个简单的轮询方案。我发现很难在移动设备和服务器之间维护长时间的TCP连接,我还不确定客户端是否会尝试保持一个打开的TCP连接,或者他们是否会为每一次传输设置并拆掉它。
  • 当客户端在移动设备上处于活动状态时,我希望客户机每分钟至少轮询服务器几次。
  • 不管客户端是否连接,模拟都将继续运行。
  • 现有客户的总数可能会非常大,成千上万。
  • 客户端大多轮询服务器的仿真状态,但有时也会向仿真发出控制命令。
  • 所有的消息都很小。
  • 我期望服务器在多核CPU服务器硬件上在Linux下运行.

目前,我对服务器中的线程模型有以下想法:

  • 仿真逻辑由几个线程执行。所述模拟逻辑线程从所述模拟数据结构中读取或写入所述模拟数据结构。
  • 对于每个客户端,都有一个Java线程对该客户端的套接字执行阻塞读取调用。当从客户端接收到轮询命令时,相应的客户端线程从模拟数据结构读取信息(一个客户端轮询通常对整个数据结构的一个小子集感兴趣),并在客户端的套接字上向客户端发送答复。因此,对数据结构的访问需要在客户端线程和模拟线程之间进行同步(我将尝试在较小的数据子集上设置锁)。如果从客户端接收到控制命令,则客户端线程将写入数据结构。

对于少数客户,我认为这会很好。

问题1:这种线程模式是否适用于大量(数千)连接的客户端?我不太熟悉这样一个Java实现中的内存/CPU开销。

问题2:我希望避免让服务器异步地向客户端发送消息,但在某些情况下,我可能需要让服务器异步地向一些或多个客户端发送“立即更新”消息,而我不太确定如何做到这一点。让模拟逻辑线程发送这些消息似乎不对.也许是一些“客户通知线程池”的概念?

EN

回答 1

Stack Overflow用户

发布于 2016-08-08 20:43:58

你问两个问题,我回答第一个问题。

我以前写过一个应用程序,其中包含了一个应用程序中的数千个线程。我们曾经遇到Linux服务器上最大线程数的问题;对我们来说,限制大约是1000个线程。这影响了我们的Java应用程序,因为Java线程使用本机线程。我们将限制设置得更高,应用程序扩展到大约2000个线程,这是我们所需要的,没有问题;我不知道如果我们需要更高的比例,会发生什么。

默认的最大线程数为1000个这一事实表明,在单个Linux服务器上运行过多的数千个线程可能是不明智的。我认为主要的问题是,需要为每个线程分配足够的堆栈内存。

我们的长期解决方案是更改为线程池中的线程服务于多个套接字的体系结构。这并不是什么大问题;对于每个套接字,线程只需在进入下一个套接字之前处理任何挂起的消息。您必须小心同步内存访问,但是您的应用程序已经需要这样做了,因为您的模拟已经与多个线程交互了,所以这个部分不会发生很大的变化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38836279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档