【问题标题】:Microservices architecture tasks system problem微服务架构任务系统问题
【发布时间】:2020-12-16 00:05:57
【问题描述】:

此时我正在编写具有微服务架构的新应用程序。我的应用程序将执行的操作的简要说明如下:

  • 微服务 A 会抓取多个电商商品页面,并将所有抓取的商品一一发送到我的下一个微服务,从现在开始我将其称为 B。对于每个 no 带有running: true 的任务的产品,它会抓取该产品并创建一个带有running: true 的新任务。
  • 微服务 B 将处理它接收到的每个产品(更新我的数据库中的数据),并将所有与数据库相比发生变化的数据发送到我的下一个微服务,从现在开始我将其称为 C。
  • 微服务 C 收到更改的产品并向我的 discord & slack 频道发送消息。完成后,它将将此产品的运行任务设置为running: false

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

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

我想问的是,如果有人有关于如何在我的微服务中改进/实施这样一个系统的方法或提示。每个产品都需要在前一个产品完成后立即进行刮擦。目前微服务 A 只是检查它是否可以通过 setInterval 找到产品的运行任务。

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

非常感谢任何帮助。

【问题讨论】:

  • 很少查询,1.当A空闲时,它会再次处理C完成的任务,基本上在任务系统中状态为{running:false,id:123},你提到你正在努力争取这个权利并且只需要关于这个或整体的推荐/最佳方法吗? 2. 在最后几行中,您提到 m(A) 检查 running : true 以查找要报废的产品数据。但是,如果要处理已完成的任务,为什么要检查正在运行的任务呢?第1点和第2点对我来说似乎是一个悖论,你能澄清一下吗?
  • @bron10 感谢您的评论。我已经编辑了关于这个的问题。总的来说,我想要一些关于这个问题的建议/最佳方法。

标签: node.js mongodb rabbitmq microservices


【解决方案1】:

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

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

现在,您正在为您开始的一项工作使用布尔值running:true。 我们可以把它改成['scrapping', 'compare', 'notify']

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

现在当数据最后是微服务C时,它可以发布一个状态为'notify'的新工作给消费者 微服务 A、A 可以有条件地处理这种情况,并在需要时重新报废。 另一个好处是每个微服务都可以有条件地根据工作状态识别工作 也是。因此,在任何失败或重启的情况下,每个微服务都只会执行一个任务 如果它符合它的标准。例如微服务 B 不会启动一个没有 scrapping 作为状态。 基本上,只有在使用 channel.ack(message) 完成后才能确认您的工作。

2.数据同步

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

探索更多:

【讨论】:

  • 非常感谢您提供的信息。我刚刚根据您的建议更新了我的代码,目前它运行良好!
  • 很高兴知道:)
猜你喜欢
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
  • 2021-05-17
  • 2015-04-20
  • 2019-11-11
  • 2021-11-19
  • 2020-06-23
  • 2020-11-14
相关资源
最近更新 更多