繁体   English   中英

微服务架构任务系统问题

[英]Microservices architecture tasks system problem

此刻,我正在编写具有微服务架构的新应用程序。 我的应用程序将做什么的简短说明如下:

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

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

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

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

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

很感谢任何形式的帮助。

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

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

现在,您正在为您开始running:true一项作业使用布尔值running:true 我们可以将其更改为['scrapping', 'compare', 'notify']

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

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

2.数据同步

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

探索更多:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM