我有一个mysql表,我在其中存储要处理的作业。主要是原始数据的文本字段,每个处理大约需要一分钟。
我有2台服务器从该表中提取数据然后删除它。
管理我目前正在使用亚马逊SQS的2台服务器之间的作业分配。我存储了需要在SQS中处理的所有行IDS,工作服务器轮询SQS以获取新行。
系统目前正在运行,但是SQS增加了一层复杂性和成本,我认为实现我正在做的事情是不够的。
我正在尝试在没有SQS的情况下实现相同的功能,并且想知道是否有任何方法可以读取一行锁定,这样如果一个工作者正在处理一行,则其他工作者无法选择该行。或者,如果有更好的方法可以做到这一点。
答案 0 :(得分:1)
一个简单的解决方法:在作业表中再添加一列is_taken_by INT
。
然后在你的工作人员中你会做这样的事情:
select job_id from jobs where is_taken_by is null limit 1 for update;
update jobs set is_taken_by = worker_pid where id = job_id;
SELECT ... FOR UPDATE
sets exclusive locks on rows it reads。这样您就可以确保没有其他工作人员能够完成同样的工作。
注意:您必须在显式事务中运行这两行。
使用SELECT FOR UPDATE锁定行以进行更新仅适用于禁用自动提交时(通过使用START TRANSACTION开始事务或将自动提交设置为0.如果启用了自动提交,则不会锁定与规范匹配的行。