我们需要实现异步 Web 服务。
- 网络服务的行为:
我们向服务器发送帐户请求,服务器发回带有确认 ID 的同步响应。之后,我们收到多个包含该确认 ID 的回调请求。确认 ID 的最后一个回调请求将在响应中包含一个文本 (completed:true),该文本将告诉我们这是该帐户和确认 ID 的最后一个回调请求。这将帮助我们知道特定帐户的异步调用已完成,并且我们可以标记其最终状态。我们需要为多个帐户执行此 Web 服务。因此,我们将收到许多帐户的回调请求。
- 问题:
处理来自多个帐户的多个回调请求的最佳方式是什么。
- 我们想到的解决方案:
- ExecutorService 固定线程池:这将并行处理我们的回调请求,但问题是它不会维护顺序。所以我们很难判断最后一个确认ID(账户)的回调请求是否已经到来。因此,我们无法确定该帐户的最终状态为已完成。
- ExecutorService 单线程执行器:这里,池中只有一个线程具有未绑定(bind)的队列。如果我们使用它,那么处理速度将会非常慢,因为只有一个线程在实际处理。
请提出一种实现内存和性能要求的最佳方法。
最佳答案
让我们明确一件事:HTTP 是一种阻塞、同步协议(protocol)。请求/响应对不是异步的。您正在做的是生成异步请求并返回给调用者,让他们知道请求正在处理(HTTP 200)或未处理(HTTP 500)。
我不确定我是否知道这种情况的最佳选择,但还有其他考虑因素:
- 使用可配置的
ExecutorServiceThreadPool
。确保您有一个前缀,可以让您将这些线程与其他线程区分开来。 - 将请求任务添加到阻塞出队,并让消费者线程池处理它们。您可以调整出队和消费者线程池的大小。
- 如果处理量很大,请将请求消息发送到另一台服务器上运行的队列。让队列监听器池处理请求。
您不能假设回调将按特定顺序返回。不要依赖“最后”就是“真实”。您必须将所有这些线程连接在一起才能知道它们何时完成。
听起来 Web 服务应该有一个允许用户查询状态的 URL。
关于multithreading - 用于异步 Web 服务的 Java ExecutorService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37320249/