sql - 水平缩放应用程序中的后台线程
问题描述
目前的情况是我有一个使用一个 SQL 数据库水平扩展的应用程序。定期运行一个后台进程,但我只希望一次调用该后台进程。我试图通过使用数据库行和锁定来实现这一点,但我被卡住了。要求是每天只能成功完成一个批处理作业。
目前我有一个名为 lock 的表,它包含三列:timestamp、lock_id、status。Status 是一个具有三个值的枚举,0 = 未运行,1 = 运行,2 = 完成。
问题是如果批处理作业失败并且状态等于 0,我如何确保只有一个后台进程会重试。如何保证重试场景中只有一个后台进程在运行?
在理想情况下,我想做一个 SELECT 语句来检查锁定表中的状态,如果状态 = 0 表示未运行,则启动后台作业并将状态更改为 1 = 正在运行。但是,如果所有水平扩展的进程同时执行此操作,是否可以保证只执行一个?
谢谢!
解决方案
推荐阅读
- c++ - UE4 沿其他样条移动样条
- javascript - jQuery 验证规则没有功能
- m - Azure LogAnalytics 范围 KQL
- laravel - 在多个分叉存储库之间共享 Laravel Eloquent 模型是可能的吗?
- angular - 单击复选框时要选择当前页面记录,例如只有 10 条记录
- docker - docker 上的解析服务器,使用 https
- reactjs - 扩展使用 withTranslation() 的反应类组件
- laravel - Lumen 电子邮件有时会因“连接到 tcp://smtp.mailgun.org:587 超时”而失败,但未使用 Mailgun
- python-3.x - 为 Django 应用程序的所有 url 显示相同的模板
- git - git:推送后从提交中删除不必要的文件