本质上,我已经用 Java 编写了一个服务,它将执行初始同步处理(对其他 Web 服务的几个简单调用)。然后,处理完成后,我向调用者返回一条确认消息,表示我已验证他们的请求,现在后台正在异步进行下游处理。
简而言之,我关心的是异步处理的复杂性。这些异步调用的总和最多可能需要 2-3 分钟,具体取决于发送的某些参数。我的想法是:如果有大量流量同时访问我的服务,并且后台有一堆挂起的线程,正在执行大量处理,该怎么办?会不会因此产生不良数据? (比如一个请求与前一个请求混合在一起等)
代码遵循以下结构:
- 验证正文中的 header 和参数
- 同步处理
- 向调用者返回确认消息
- 异步处理
对于#4,我只是创建了一个新线程并调用一个方法来执行其中的所有异步处理。喜欢:
new Thread()
{
@Override
public void run()
{
try {
makeDownstreamCalls(arg1, arg2 , arg3, arg4);
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
我基本上想知道大量流量访问我的服务会产生意想不到的后果。我正在考虑的一个例子:一个线程执行请求 A 的下游调用,然后另一个请求进来,必须创建一个新线程来执行请求 B 的下游调用。在这种情况下请求 B 是如何处理的,而仍在进行中的请求 A 会发生什么情况?在这种情况下,请求 A 中的异步调用会终止吗?或者每个不同的请求和线程是否可以并行执行并且完整地执行,而不会产生任何奇怪的后果?
最佳答案
嗯,答案取决于您的代码,您发布了其中的一小部分,所以我的答案包含一些猜测。我假设我们正在讨论某种接受客户端请求的多线程服务器,并且这些请求到达某个执行您提到的 4 个步骤的 handleRequest()
方法。我还将假设这些请求不以任何方式相关,并且不会相互影响(因此,例如,代码不会执行类似“如果先前请求中已存在线程,则不要创建新线程”或类似的操作)。
如果是这种情况,那么您的 handleRequest()
方法可以同时被不同的服务器线程同时调用。每个步骤都将执行您概述的四个步骤。如果两个请求同时发生,那么一个服务器线程将执行请求 A 的处理程序,而另一个线程将同时执行请求 B 的处理程序。如果在处理请求期间创建了一个新线程,则将为 A 创建一个线程,为 B 创建另一个线程。这样,您最终将得到两个执行 makeDownstreamCalls()
的线程,其中一个带有 A 的参数,一个带有 B 的参数。
实际上,这可能是一个非常糟糕的主意。程序创建的线程越多,操作系统需要执行的上下文切换就越多。您确实不希望请求数量无休止地增加应用程序中的线程数量。现代操作系统能够处理数百甚至数千个线程(只要它们受 IO 而不是 CPU 的约束),但这是有代价的。您可能需要考虑使用 Java executor线程数量有限,以避免破坏您的进程甚至操作系统。
如果服务器上的负载太大,您就不能指望您的应用程序能够处理它。在申请的范围内处理您能处理的事情,并拒绝进一步的请求。满载时接受更多请求意味着您的应用程序崩溃,并且不会处理任何请求 - 这称为“负载卸载”。
关于java - 从服务返回同步消息,然后进行异步处理 - 担心挂起线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48173161/