Architecture 如何使事件在服务响应用户后发送?

Architecture 如何使事件在服务响应用户后发送?,architecture,rabbitmq,Architecture,Rabbitmq,我需要使用外部任务管理器构建一个长期运行的任务服务。 它通过两个通道与用户通信:http\websocket和通过http\RMQ与任务管理器通信 通信模式为: 用户发送任务创建请求 我的服务将其发送给外部任务管理器 接收任务管理器的响应并进行一些任务数据后处理 向具有“taskId”的用户发送响应 用户等待任务事件并更新任务状态 问题是,在某些场景中(当任务失败或任务执行非常简单时),任务事件会很快出现在我的服务中,直到用户的请求完成,因为后处理可能比任务执行(特别是在失败场景中)花费稍长

我需要使用外部任务管理器构建一个长期运行的任务服务。 它通过两个通道与用户通信:http\websocket和通过http\RMQ与任务管理器通信

通信模式为:

  • 用户发送任务创建请求
  • 我的服务将其发送给外部任务管理器
  • 接收任务管理器的响应并进行一些任务数据后处理
  • 向具有“taskId”的用户发送响应
  • 用户等待任务事件并更新任务状态
问题是,在某些场景中(当任务失败或任务执行非常简单时),任务事件会很快出现在我的服务中,直到用户的请求完成,因为后处理可能比任务执行(特别是在失败场景中)花费稍长的时间

所以问题是:在我的服务响应用户之后,如何让事件发送? 现在我只是使用延迟,但我想这不是最佳实践,因为当连接不好时,我的延迟可能不够

视觉沟通图:


如果我理解您的问题,可以归结为以下几行:那么问题是:如何在我的服务响应用户后发送事件

这需要一些其他机制来允许激发和遗忘,但要保证消息传递;并且,完成状态(成功或失败)以某种方式中继回用户

这不是一个微不足道的问题,但幸运的是,在解决这类问题的方法上已经达成了一些共识,并且出现了一些共同的语言,您可以在这个答案中找到这些语言来帮助您进行搜索。这些思想通常属于定理的范畴。但一个实际的起点是一种叫做事务发件箱的东西(请参阅)

想到两个现成的解决方案(请原谅双关语):

DotNetCore的CAP: 即使您不是在DotNetCore中开发,您也可以在实现语言中找到类似的东西,或者推出自己的类似解决方案。基本思想是使用数据库捕获用户操作。只有将操作提交到数据库时,该操作才被视为已消化。然后,第二个操作保证所有持久化的操作都会执行:例如,发送该操作的所有事件。“完成”时,动作标记为完成。对于永远不会成功的操作,仪表板会提醒您进行干预。这是一个使用数据库的事务发件箱的实现。这是总的想法

大众运输: 有许多概念被整合在一起,以创建一个存储在内存中的事务发件箱。基本前提是RabbitMQ持久化需要发生的操作(以队列上的消息的形式)。您仅在操作“完成”后确认消息。MassTransit采用了一些策略来实现这一点。同样,您可以利用此框架,或者对其进行检查,以推出类似于您自己的解决方案

这两种解决方案都需要幂等性。也就是说,因为故障可以在任何时候发生,并且整个过程可以重新运行(操作、事件等),所以它们需要是可重复的,没有重复或副作用

在我当前的项目中,我们使用CAP DotNetCore进行交付,但不能失败


希望这能让你开始。

谢谢你的回答,似乎这就是我要找的。也谢谢你的链接,因为我在.NET上的项目很好。请将其标记为已接受的答案。如果它是公认的答案:-)是的,这需要一些时间,直到问题被标记为已回答:)