Has*_*ram 12 mysql sql concurrency redis node.js
我们可以自动登录不同的网站并对网站帐户执行一些操作。要求只有一个 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 |
|---------------------|------------------|------------------------|------------------------|
Run Code Online (Sandbox Code Playgroud)
准确地说,我们使用此查询获取凭据:
SELECT `credentials`.* FROM `credentials` WHERE `credentials`.`locked_at` IS NULL ORDER BY last_fetched_at asc LIMIT 1
Run Code Online (Sandbox Code Playgroud)
然后我们用当前时间更新 locked_at 字段以锁定下一个进程的凭证行。
这发生在一个以 mysql 作为后端数据库的 node.js 应用程序中,并且被多个 BOT 进程同时访问。我们希望确保两个进程不会获得相同的凭据和使用的事务/选择更新以使此操作原子化,但到目前为止还没有好的成功方法/查询。
我们对任何第三方集成(如 redis)持开放态度,或者节点中是否有一些我们可以用来实现这一目标的东西。
感谢您的时间。
Cah*_*hit -1
这里的挑战是处理会破坏预期流程的各种异常以及如何从中恢复。为了设计实际的解决方案,您需要考虑平均处理时间、有多少个机器人在多少个网站上运行、故障的严重程度以及是否可以将其作为副流程修复。如果网站在您的控制范围内(不是第三方网站),我更愿意使用消息传递(发布-订阅)类型的解决方案,其中您的基础设施通知网站上的代理来处理更新,并且同一代理确保一次仅进行一次更新(根据您的要求)。
如果这种类型的设置不可能,那么您的下一个选择是使用 @Akina 建议的内容,但也要针对可能发生的每个陷阱提出恢复操作,包括处理竞争条件、机器人超时或返回不完整任务、返回意外响应的网站等。如果有人不密切关注流程并调整它以处理您在长期内必然会看到的每个意外惊喜,那么一段时间后这可能会变得有点累人。