mysql - 循环中Mysql表消费者进程的行轮换

标签 mysql sql node.js redis concurrency

我们可以自动登录不同的网站并对网站帐户执行一些操作。要求只有一个 BOT 可以同时登录到一个特定的帐户,以避免自动化流程的不一致。
我们有一个表,我们在其中存储了网站凭据:

|---------------------|------------------|------------------------|------------------------|
|         id          |       email      |        locked_at       |    last_fetched_at     |
|---------------------|------------------|------------------------|------------------------|
|          1          |   abc@gmail.com  |2020-09-14 14:35:35 UTC |2020-09-14 14:35:35 UTC |
|---------------------|------------------|------------------------|------------------------|
|          2          |   def@gmail.com  |           NULL         |           NULL         |
|---------------------|------------------|------------------------|------------------------|
|          3          |   xyz@gmail.com  |2020-09-14 14:35:35 UTC |2020-09-14 14:35:35 UTC |
|---------------------|------------------|------------------------|------------------------|
|          4          |   ran@gmail.com  |           NULL         |           NULL         |
|---------------------|------------------|------------------------|------------------------|
准确地说,我们使用此查询获取凭据:
SELECT  `credentials`.* FROM `credentials` WHERE `credentials`.`locked_at` IS NULL ORDER BY last_fetched_at asc LIMIT 1
然后我们用当前时间更新 locked_at 字段以锁定下一个进程的凭证行。
这发生在一个以 mysql 作为后端数据库的 node.js 应用程序中,并且被多个 BOT 进程同时访问。我们希望确保两个进程不会获得相同的凭据和使用的事务/选择更新以使此操作原子化,但到目前为止还没有好的成功方法/查询。
我们对任何第三方集成(如 redis)持开放态度,或者 Node 中是否有一些我们可以用来实现这一目标的东西。
感谢您的时间。

最佳答案

这里的挑战是处理会破坏预期流程的各种异常以及如何从中恢复。为了设计实际的解决方案,您需要考虑平均处理时间、在多少网站上工作的机器人数量、故障的严重程度以及是否可以作为辅助流程进行修复。如果网站在您的控制范围内(而不是第 3 方网站),我更愿意使用消息传递(发布 - 订阅)类型的解决方案,您的基础设施通知网站上的代理处理更新,并且相同的代理确保一次只进行一次更新(根据您的要求)。
如果这种类型的设置是不可能的,那么您的下一个赌注是使用类似 @Akina 建议的内容,但还要针对可能发生的每个陷阱提出恢复措施,包括处理竞争条件、机器人超时或返回不完整任务、网站返回意外响应等。如果有人不密切关注流程并对其进行调整以处理您在长期内必然会看到的每一个意外惊喜,这可能会在一段时间后变得有点累。

关于mysql - 循环中Mysql表消费者进程的行轮换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64251837/

相关文章:

mysql - 如果添加 block 代码,请在其中选择

node.js - ENOENT : no such file or directory while exporting csv files in electron app

javascript - Nodejs主进程是否使用了所有CPU内存?

javascript - 无法从对象内部访问数组(未初始化)

mysql - 转换 2016-12-28 14 :14:00 UTC date time format to 12/06/2016 11:28 PM format in rails application

mysql - 如何加快获取每个用户最近交易的 AVG 的 MySQL 查询?

mysql - 当不同名称的数量小于 200 mysql 时获取名称

sql - ORDER BY 索引列仍然很慢

mysql - 在mysql中的单个查询中获取行数

php - 一次按多个条件进行分组