【问题标题】:long running task in Rest Service休息服务中长时间运行的任务
【发布时间】:2019-01-09 09:32:27
【问题描述】:

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

有多种处理方法

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

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

以上两种方法哪种更好,如何处理锁以避免多个轮询任务并发执行相同的创建资源并处理失败情况?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      • 2016-05-23
      • 2020-11-20
      • 1970-01-01
      • 2013-07-08
      • 2014-09-10
      相关资源
      最近更新 更多