微服务架构任务系统问题
Microservices architecture tasks system problem
此时此刻,我正在使用微服务架构编写我的新应用程序。我的应用程序将做什么的简短说明如下:
- 微服务A会抓取多个电商产品页面,并将所有抓取的产品1个1发送到我的下一个微服务,从现在开始我将其称为B。对于每个具有 没有 任务和
running: true
的产品,它会抓取该产品并创建一个新任务 running: true
。
- 微服务 B 将处理它接收到的每个产品(更新我的数据库中的数据),并将与数据库相比的所有更改数据发送到我的下一个微服务,从现在开始我将其称为 C。
- 微服务 C 收到更改的产品并向我的 discord & slack 频道发送消息。完成后,它会将此产品的 运行 任务设置为
running: false
我目前正在苦苦挣扎的是,我希望微服务 A 再次开始对微服务 C 处理过的产品进行抓取。为此,我想到了某种任务系统,其中每个产品都被抓取也有一个链接到它们的任务 ID。我目前唯一的问题是:
- 一项任务可能 freeze/fail 或其他。为了尝试解决这个问题,我的任务仍然是 运行(数据库中的变量)并且在 5 分钟前开始,自动停止。这在我看来并不理想,因为这意味着一项任务可能需要 5 分钟才能完成。
- 由于每个被抓取的产品都被分配了 1 个任务,我将不得不快速部署大量微服务 B 以正确处理所有负载。
我想问的是,如果有人有关于如何在我的微服务中 improve/implement 这样的系统的方法或技巧。每个产品都需要在前一个产品完成后立即被刮掉。目前微服务 A 只是检查它是否可以找到产品的 运行 任务,具有 setInterval.
所有这些都是在 NodeJS 中开发的,所有信息都保存在 MongoDB 数据库中。微服务之间的通信是通过rabbitMQ完成的。
非常感谢任何帮助。
我想对这个架构补充两点。似乎每个微服务都会根据时间改变数据状态,但数据源是相同的。
1.为什么不更改每个微服务 [state] 的数据状态?
目前您正在为您开始的一项工作使用布尔值 running:true
。
我们可以将其更改为 ['scrapping', 'compare', 'notify']
{
...
status : 'scrapping',
jobId : 23,
...
}
现在,当数据最后到达微服务 C 时,它可以为消费者发布状态为 'notify' 的新作业
微服务 A,A 可以有条件地处理这种情况,并在需要时重新报废。
另一个好处是每个微服务都可以根据工作状态有条件地识别工作
以及。因此在任何失败或重启的情况下,每个微服务只会执行一个任务
如果它符合它的标准。例如,微服务 B 不会启动一个没有
scrapping
作为状态。
基本上,只有在使用 channel.ack(message)
.
完成后才承认你的工作
2.Data同步
我不建议创建多个 B 微服务作为消费者,这可能会有问题
在数据同步中[同时多个消费者 B,在不同产品的同一页面上工作]
或者,您可以衡量每页的产品列表
通过一些测试相应地调整您的队列配置(但队列不要太长,因为这会降低速度并影响性能
或将它们捆绑为一个作业并发送以供处理。
探索更多:
此时此刻,我正在使用微服务架构编写我的新应用程序。我的应用程序将做什么的简短说明如下:
- 微服务A会抓取多个电商产品页面,并将所有抓取的产品1个1发送到我的下一个微服务,从现在开始我将其称为B。对于每个具有 没有 任务和
running: true
的产品,它会抓取该产品并创建一个新任务running: true
。 - 微服务 B 将处理它接收到的每个产品(更新我的数据库中的数据),并将与数据库相比的所有更改数据发送到我的下一个微服务,从现在开始我将其称为 C。
- 微服务 C 收到更改的产品并向我的 discord & slack 频道发送消息。完成后,它会将此产品的 运行 任务设置为
running: false
我目前正在苦苦挣扎的是,我希望微服务 A 再次开始对微服务 C 处理过的产品进行抓取。为此,我想到了某种任务系统,其中每个产品都被抓取也有一个链接到它们的任务 ID。我目前唯一的问题是:
- 一项任务可能 freeze/fail 或其他。为了尝试解决这个问题,我的任务仍然是 运行(数据库中的变量)并且在 5 分钟前开始,自动停止。这在我看来并不理想,因为这意味着一项任务可能需要 5 分钟才能完成。
- 由于每个被抓取的产品都被分配了 1 个任务,我将不得不快速部署大量微服务 B 以正确处理所有负载。
我想问的是,如果有人有关于如何在我的微服务中 improve/implement 这样的系统的方法或技巧。每个产品都需要在前一个产品完成后立即被刮掉。目前微服务 A 只是检查它是否可以找到产品的 运行 任务,具有 setInterval.
所有这些都是在 NodeJS 中开发的,所有信息都保存在 MongoDB 数据库中。微服务之间的通信是通过rabbitMQ完成的。
非常感谢任何帮助。
我想对这个架构补充两点。似乎每个微服务都会根据时间改变数据状态,但数据源是相同的。
1.为什么不更改每个微服务 [state] 的数据状态?
目前您正在为您开始的一项工作使用布尔值 running:true
。
我们可以将其更改为 ['scrapping', 'compare', 'notify']
{
...
status : 'scrapping',
jobId : 23,
...
}
现在,当数据最后到达微服务 C 时,它可以为消费者发布状态为 'notify' 的新作业
微服务 A,A 可以有条件地处理这种情况,并在需要时重新报废。
另一个好处是每个微服务都可以根据工作状态有条件地识别工作
以及。因此在任何失败或重启的情况下,每个微服务只会执行一个任务
如果它符合它的标准。例如,微服务 B 不会启动一个没有
scrapping
作为状态。
基本上,只有在使用 channel.ack(message)
.
2.Data同步
我不建议创建多个 B 微服务作为消费者,这可能会有问题 在数据同步中[同时多个消费者 B,在不同产品的同一页面上工作] 或者,您可以衡量每页的产品列表 通过一些测试相应地调整您的队列配置(但队列不要太长,因为这会降低速度并影响性能 或将它们捆绑为一个作业并发送以供处理。
探索更多: