Rest Service中长期运行的任务

时间:2018-08-01 18:01:00

标签: java spring rest spring-mvc spring-boot

我有一个Web服务(用java springboot编写),其中创建一些资源的请求到来,并且资源需要很长时间才能获得创建〜5-6小时。创建资源之后,我需要调用一些端点来通知创造。

有多种处理方法

  1. 一旦创建资源请求,将其存储在数据库中并返回200ok给客户端,并且在后台有一个长期运行的任务,该任务将轮询数据库并处理新任务,并在完成时通知端点。 这里的挑战是如何处理Web节点的故障,如何处理并发读取在elb后面的多个Web节点上并行运行的多个轮询器任务。

2。第二种方法是将两者解耦,使在单独堆栈中的轮询仅是普通工作节点,而不是在REST服务中进行,但是仍然存在锁定和故障转移策略的挑战。

以上2种方法哪种更好,以及如何处理锁定以避免多个轮询任务同时执行同一创建资源并处理失败情况?

1 个答案:

答案 0 :(得分:0)

答案是基于我的观点,可以有数百种不同的方式来完成工作。

仅不使用来自db的轮询,在扩展应用程序的并发性方面存在一些缺点。因为您需要完成一些锁定机制以防止处理相同的数据。而不是通过消息代理使用异步消息传递。

进行数据验证并将其保存到db,然后将诸如XResourceCreatedEvent之类的事件发布到Rabbitmq或类似的消息代理中。

编写一个消费者,该消费者监听XResourceCreatedEvent事件并执行长时间运行的任务,并在该消费者内部调用终结点。

看看spring boot和rabbitmq:https://spring.io/guides/gs/messaging-rabbitmq/