4

我正在尝试使用 JSP 和 Servlet 开发一个非常简单的 Java Web 应用程序。

1)页面上有一个文本框和一个提交按钮,
2)用户在文本框中输入他的名字,比如约翰,然后单击按钮,
3)字符串被转发到我的 servlet,
4)在 doPost 方法我的 servlet,我访问发布的字符串变量,
5)我将使用的 Web 服务有一个sayHello方法,该方法接受一个参数并返回"Hello "与参数连接,
6)所以,我调用sayHelloWeb 服务的方法,获取返回变量并将其转发给 JSP,该 JSP 基本上写入Hello John.

我有两个问题:

1) 泛滥:如何避免对我的 servlet 的请求泛滥?我该如何处理?我想创建一个线程来联系 Web 服务并打个招呼。当请求到达时,我检查线程是否正在运行/忙,如果没有,我处理请求。因此,我每单位时间最多回答 1 个请求。听起来怎么样?

2) 可扩展性:假设今晚有 1,000,000 亿人访问我的 Web 应用程序,并让我的应用程序每次打招呼十次。我如何确保这个应用程序能够很好地扩展?除了服务器所依赖的硬件之外,我还能对 JSP/Servlet 部分做些什么?

我知道这些问题有点笼统,所以我尽量提供尽可能多的细节。我真的很感激一个彻底而中肯的答案=)

提前致谢。

4

2 回答 2

4

您可以做很多事情来使其“可扩展”。

一方面,servlet 的负载很小,因此不太可能出现负载问题;网络服务是。您可以在此处提供两种类型的缩放 - 水平和垂直。

水平扩展是指您以相同的速度处理请求,但可以处理更多请求。这是通过负载平衡提供的,通过 F5 或其他负载平衡器,并让 Web 应用程序由多个 Web 服务器提供服务。

垂直缩放是当您在问题上投入更快的处理器时。横向比较好。

处理服务本身是您的可伸缩性故障点,因为它是实际工作完成的地方。在这种情况下,您有一个简单的服务,因此您可以对 Web 服务执行与使用 servlet 相同的操作。但是,如果问题“更难”——好吧,这就是您开始使用 JMS 提供异步服务的地方,这样您的服务提供者就可以使用请求并尽快提供答案。这为您提供了一个自然的地方来添加更多消费者,因此如果您发现您的 JMS 服务无法处理请求,您可以添加另一个消费者(另一个服务器正在侦听队列);如果不能跟上,清洗,冲洗,重复。

Of course, there are also cloud solutions to the problem; I work for GigaSpaces Technologies, which provides a service for horizontal scalability for web services, and we do a much better job than the solution I just outlined. To see something of how it works, see http://www.youtube.com/watch?v=YTEqFzrfVss .

于 2011-05-15T11:35:22.600 回答
2
  1. 您的解决方案可能会避免洪水泛滥,但会对应用程序的可用性产生非常糟糕的影响。洪水泛滥的主要原因是来自同一台机器的过多请求,这些恶意意图阻止您的应用程序。所以我建议将会话 ID 与线程 ID 相关联。换句话说,您一次只处理一个用户的请求。只有当第一个完成时才会处理下一个。

  2. 我宁愿选择@Joseph Ottinger 的解决方案

于 2011-05-15T11:29:22.807 回答