设计非实时,非阻塞,依赖于结果的系统

时间:2017-06-27 09:56:54

标签: java multithreading asynchronous architecture system-design

上下文

1)我们有一个调度程序,它通过以阻塞方式调用另一个rest-call来获取作业并处理它们。

2)调度程序线程需要等待其余调用完成,然后根据结果执行其他任务。

3)没有限制这是实时的。

问题陈述:

1)我们想要的是在外部呼叫完成后立即释放调度程序线程,因为外部调用需要很长时间才能完成。

2)我们应该知道从外部呼叫收到的结果,因为我们需要根据结果进行一些处理。

我的想法:

1)我们不是使用同步Http调用来调用外部系统    可以将事件推送到队列中。

2)另一个系统的Ap​​i消费者将从队列中读取事件并执行长时间运行的任务。后处理将结果推回到不同主题的队列中。

3)我们的系统现在可以从队列中读取响应(第二个主题)并执行必要的操作。

这是我的

的设计方法之一

我需要建议我们是否可以某种方式改进设计。

1)这可以在不引入队列的情况下完成吗?

2)有没有更好的方法来实现异步处理?

1 个答案:

答案 0 :(得分:0)

如果你想避免使用队列,我可以考虑其他两种选择,例如:

  

1)我们可以将事件推送到队列中,而不是使用同步Http调用来调用外部系统。

备选方案a)

你做一个同步HTTP GET告诉另一个系统你想要执行某个作业(另一个系统快速回复" 200 OK"确认它收到了请求)。

备选方案b)

你做一个同步HTTP GET告诉另一个系统你想要执行某个作业(另一个系统快速回复" 200 OK"以及一个唯一ID来识别要执行的作业)

  

2)另一个系统的Ap​​i消费者将从队列中读取事件并执行长时间运行的任务。后处理将结果推回到不同主题的队列中。   3)我们的系统现在可以从队列中读取响应(第二个主题)并执行必要的操作。

备选方案a)

收到请求后,另一个系统执行长时间运行的计算,然后当它准备就绪时,它会对原始系统进行同步HTTP调用,以通知该作业已准备就绪。

备选方案b)

在接收到请求时,另一个系统执行长时间运行的计算。 原始系统不知道作业是否完成,因此它会在某些时间轮询(对不同的REST API执行同步HTTP GET),提供作业ID,以确定作业是否准备就绪。