我们需要实现一个异步web服务。
- web服务的行为:
我们向服务器发送对帐户的请求,服务器会发回带有确认ID的同步响应。之后,我们会收到多个包含该确认ID的回调请求。对确认ID的最后一个回调请求将在响应中包含一个文本(已完成:true),该文本将告诉我们这是该帐户和确认ID的上一次回调请求。这将帮助我们知道对特定帐户的异步调用已经完成,我们可以标记其最终状态。我们需要为多个帐户执行此web服务。因此,我们将收到许多帐户的回调请求。
- 问题:
处理多个帐户的多个回调请求的最佳方式是什么。
- 我们想到的解决方案:
- ExecutorService固定线程池:这将并行处理我们的回调请求,但问题是它没有维护序列。因此,我们很难确定确认ID(帐户)的最后一个回调请求是否已经到来。因此,我们将无法确定该账户的最终状态是否已完成
- ExecutorService单线程执行器:这里,池中只有一个线程具有未绑定的队列。如果我们使用它,那么处理将非常缓慢,因为实际上只有一个线程在处理
请提出实现内存和性能需求的最佳方式。
让我们明确一件事:HTTP是一个阻塞的同步协议。请求/响应对不是异步的。您所做的是生成异步请求,并返回给调用者,让他们知道请求是否正在处理(HTTP200)(HTTP500)。
我不确定我是否知道最适合这种情况,但还有其他考虑因素:
- 使用可以配置的
ExecutorServiceThreadPool
。确保您有一个前缀,可以将这些线程与其他线程区分开来 - 将请求任务添加到阻塞出队列中,并让使用者线程池处理它们。您可以调整出队列和使用者线程池的大小
- 如果处理非常密集,请将请求消息发送到另一台服务器上运行的队列。让队列侦听器池处理请求
您不能假设回调将按特定顺序返回。不要指望"最后"是"真的"。你必须把所有这些线程连接在一起才能知道它们什么时候完成。
听起来web服务应该有一个允许用户查询状态的URL。