0

我正计划构建一个独立的/基于 Web 的 Java 应用程序。它应该能够同时处理数千个请求。请求消息通过 TCP 端口(例如 6040)进入。我有一个专用线程来不断侦听来自客户端的消息。从套接字读取消息后,该线程将生成一个线程来服务请求。所以它基本上每个请求一个线程。

为请求提供服务涉及许多数据库操作,例如调用远程数据库中的存储过程、在本地数据库中执行更新/插入以及日志记录。服务请求后,应向客户端发送响应。

我希望情况很清楚。简而言之,我想构建一个强大的多线程可扩展应用程序(使用陈词滥调)。我的问题如下:

  1. 监听传入请求的主线程应该为每个请求生成一个线程,还是应该只从线程池中获取一个。我要问的是我应该在我的应用程序中使用线程生成还是线程池。
  2. 是否可以在集群上部署独立的 Java 应用程序?
  3. 使用我打算为管理目的开发的 Web 应用程序(部署在 JBoss 7.1 服务器上)部署和运行它是一个好主意,还是应该是一个独立的应用程序?
  4. 一般来说,在 Java 中构建强大的多线程可扩展应用程序时要考虑哪些问题
4

3 回答 3

2

为确保您的 Java 应用程序能够扩展,基本上需要遵循一条简单的规则:不要共享状态。

所有状态都应该在线程本地或在后备数据存储中。这确保您可以启动完全独立的应用程序的无限副本(无论是否在同一台机器上),并在前面使用简单的负载均衡器。

要具体回答您的线程问题,使用适当配置的线程池几乎总是更好。您可以避免将线程内联到您的请求的开销,并且您可以配置合理的限制以避免资源争用/耗尽。

于 2012-05-06T16:57:36.340 回答
2

考虑使用线程池而不是在请求到达时生成线程以节省一些响应时间。此外,您可以使用非阻塞 IO(检查New I/O以使单个线程监视许多连接。此外,Steven Schlansker 所说:不要共享状态!

于 2012-05-06T17:00:14.343 回答
0

我不确定它是否真的值得从头开始构建。从生产力的角度来看,重用现有的 Web 容器会快得多,比如 Jetty、Tomcat 等。如果你遵循 Servlet API,你只需要描述你的业务逻辑,容器会为你处理并发。

调整 Web 容器的性能需要花费大量时间。甚至大公司也选择Tomcat/Jetty,比如谷歌的App Engine。

于 2012-05-07T09:43:54.823 回答