0

我来自客户端编程背景(主要是 C++)。但是,我现在偶尔需要参与一些 Java 中的小型服务器端项目,因此需要有经验的服务器端人员的一些建议。我不太了解应用程序服务器。

是否有任何经验法则或考虑因素来决定程序何时需要应用程序服务器(如 GlassFish 或 JBoss)?

我有 2 台用 Java 编写的服务器都在专用机器上运行。一台服务器在 Tomcat 上运行,没有任何 App Server。第二台服务器在应用服务器(Glassfish)上运行。

我需要编写一个位于中间的相当简单的程序。这就是程序要做的事情

  • 听一个套接字。当连接来自第一台服务器时,它会创建一个线程来接受连接并继续侦听。

  • 线程从第一台服务器获取少量数据(比如 100-200 字节),对数据进行非常小的格式化并通过 web 服务调用将其传递给第二台服务器。它获取 web 服务调用的返回值,并基于它进行一些处理 - 可能是大约 10-20 行代码 - 这不是一些主要处理 - 只是在不同的(第 3 个)服务器上调用一些 web 服务。在此之后,它将一些数据返回给第一台服务器——同样不多——可能是 50 字节。

  • 我的程序不是网络服务。它只是从第一台服务器以特定格式获取消息,并根据从第一台服务器接收到的数据对第二台服务器进行网络服务调用。在某些情况下,您可以这样想——它充当第一台服务器的代理,向第二台服务器发出 web 服务调用。

所有主要工作都由运行在 Tomcat 服务器上的应用程序运行的第一台服务器和运行在 GlassFish 上的 Web 服务完成。这两个都是经过良好测试的程序。我想写的中间程序很简单,半天就能搞定。但是,我担心的是它是否能够承受负载。

有哪些规则/注意事项可以确定我是否可以将这个 Java 程序作为常规 Windows 服务运行,或者我是否需要 Glassfish 或任何其他应用程序服务器之类的东西。

我应该考虑每分钟/小时的连接数吗?我将为每个连接分叉一个线程,但线程本身的寿命不会很长。我应该考虑应用服务器的连接数阈值是多少?还有其他考虑吗?如果可能的话,我非常希望避免使用应用程序服务器。

是否在 App Server 下运行它只是一个问题——我这里还有什么问题吗?

4

3 回答 3

4

应用程序服务器并不神奇,因为它们不会创造更好的性能。实际上,对于您所概述的简单应用程序,应用程序服务器可能会产生相反的效果,因为大多数应用程序服务器都会引入所有额外开销。

应用服务器提供基础设施组件、​​企业级开发的实用模式和标准规范的实现。它们主要用于组织更大规模的开发工作,并针对大量相对较短的连接进行规模化设置。也就是说,如果您已经熟悉轻量级服务器(如 Tomcat 或 Jetty)提供的基础架构,则可以使用它们。特别是,它们会为您提供入站 HTTP 连接处理。

我认为根据您的问题描述,您最好使用Apache HttpComponents等库编写独立的 java 服务来处理 HTTP 和 WebService 客户端功能。目前尚不清楚您需要多少额外的工作来处理入站连接。如果是简单的套接字,那么自己编程很容易。

您对需要同时支持多少个连接的描述含糊不清(而且都是相对的)。如果您需要每个连接一个线程并希望支持数百个连接,那么我建议您使用线程连接池来实现连接处理,确保在用尽服务器功能之前阻止新连接。如果走这条路,请查看 Java 5+ ExecutorService和相关类。

如果您的需求很简单,我怀疑应用程序服务器会带来很多好处。

于 2012-12-10T17:51:11.003 回答
1

评估任何工具时的基本规则也应该适用于此:它会让我的工作更轻松吗?

所以问题是:应用程序服务器为我的用例提供的功能是否完整,限制不会限制我。

根据您的用户案例的描述:

应用服务器将JavaEE提供 Servlet 抽象来轻松管理HTTP请求(理论上其他类型的请求可以由您实现,您需要自己通过在应用服务器的实现中添加新东西来实现)。它还将提供通过Jax-WSJax-RS抽象来创建 Web 服务端点。

这些抽象的代价是应用服务器将管理线程。大多数实现将使用线程池进行HTTP连接,因此每个请求都没有线程创建成本。

此外,fullJavaEE将为您提供简单的声明式事务和安全性 ( EJB)、持久消息传递JMS等。

由您来平衡提供的抽象的附加价值和它们的成本(更少的控制,在大多数情况下,更少的控制将导致更好的行为,因为 Java 标准已经制定以匹配大多数用例,然后比普通程序员执行得更好代码...)。

因此,在您的情况下,您应该查看您需要的功能,使用最简单的方法(快速)来满足您的功能并制作 POC 来进行一些负载测试。

顺便说一句,Tomcat一个应用服务器,它只是没有实现所有的 JavaEE 部分,它只实现了基本的 web 相关功能(servlet,但默认情况下没有 WS 或 restfull ws,但这可以通过 libs 轻松添加)。与 Tomcat 相比,新的 Jboss 和 Glassfich 提供了更多的功能(在部署时容易加载),具有相似的大小和性能。

于 2012-12-10T18:00:57.150 回答
1

我认为性能问题将更多地受到您的网络拓扑和机器硬件的影响,而不是您选择的应用程序服务器。一些应用服务器,如 JBoss,提供用于创建和管理集群的管理工具,但所有应用服务器都可以使用正确的工具进行类似的设置。也就是说,我认为像jettygrizzly这样的可嵌入 servlet 容器会很好地为您服务。这将为您提供应用程序服务器所带来的配置和可移植性优势,而无需额外负担您不太可能需要的 EE 合规性,并且可以轻松设置您的开发配置。

于 2012-12-10T18:14:28.080 回答