微服务体系结构任务系统问题



目前我正在用微服务架构编写我的新应用程序。关于我的应用程序将做什么的一个简短解释如下:

  • 微服务A会抓取多个电子商务产品页面,并将所有抓取的产品1比1发送到我的下一个微服务,从现在起我将调用B。对于每个带有running: trueno任务的产品,它会抓取该产品,并创建一个带有running: true的新任务
  • 微服务B将处理它接收到的每一个产品(更新我数据库中的数据(,并将与数据库相比所有更改的数据发送到我的下一个微服务,从现在起我将调用C
  • 微服务C收到一个更改后的产品,并向我的discord&松弛通道。完成后,将此产品的运行任务设置为running: false

我目前正在努力的是,我希望微服务A重新开始对微服务C处理过的产品进行抓取。为此,我想到了某种任务系统,每个被抓取的产品都有一个链接到它们的任务ID。我目前唯一的问题是:

  • 任务可能会冻结/失败或其他情况。为了解决这个问题,我有一些任务仍在运行(数据库中的变量(,并且在5分钟前开始,但已自动停止。这在我看来并不理想,因为这意味着一项任务可能需要5分钟才能完成
  • 由于每一个报废的产品都被分配了一项任务,我必须快速部署大量的微服务B来正确处理所有负载

我想问的是,如果有人有关于如何在我的微服务中改进/实现这样一个系统的方法或技巧。每一件产品都需要在上一件完成后立即刮削。目前,微服务A只是用setInterval检查是否能找到产品的运行任务。

所有这些都是在NodeJS&所有信息都保存在MongoDB数据库中。微服务之间的通信是通过rabbitMQ完成的。

非常感谢您的帮助。

我想为这个体系结构添加两点。似乎每个微服务都会随着时间改变数据的状态,但数据源是相同的。

1.为什么不改变每个微服务[状态]的数据状态

目前,您正在为启动running:true的一个作业使用布尔值。我们可以把它改成类似['scrapping', 'compare', 'notify']的东西

{
...
status : 'scrapping',
jobId : 23,
...
}

现在,当数据最后到达微服务C时,它可以为消费者发布一个状态为"通知"的新作业微服务A、A可以有条件地处理这种情况,并在需要时重新捕获。另一个好处是,每个微服务都可以根据工作状态有条件地识别一个工作也因此,在任何故障或重新启动的情况下,每个微服务都只执行一项任务如果符合其标准。例如,微服务B不会启动一个没有CCD_ 6作为状态。基本上,只有在使用channel.ack(message)完成工作后,才承认您的工作。

2.数据同步

我不建议作为消费者创建多个B微服务,可能会有问题在数据同步中[当多个消费者B使用不同的产品在同一页面上工作时]或者,您可以按页面衡量产品列表通过一些测试相应地调整队列配置(但不要太长的队列,因为这会降低速度并影响性能或者将它们捆绑为一个作业并发送进行处理。

探索更多关于:

  • 常见拉比问题
  • 正在计算队列大小

最新更新