我有一些需要处理的数据,并希望在服务器之间分配工作量。
我有:
选择操作的操作队列表。
用户表。
将用户连接到队列的用户排队。
记录给定用户的操作完成时间。
现在我有一个服务,它运行一个查询来获取排队的数据,并为每个数据打开一个线程。
一旦一个人结束,下一个人进入后,该线程就会一次通过用户10,依此类推,直到完成为止。
我想在游戏中添加另一台服务器,这将占用一些负载,所以一切都完成得更快,因为现在它需要半天而且太多了。
如何让两台服务器协同工作而不存在重复风险?
到目前为止,我想到了以下内容:
将服务修改为锁定以进行读取,选择所需的用户数(之后为10)。
插入日志,以便其他人无法选择这些用户。
解锁并让线程处理数据并在完成后更新日志。
这会有用吗?
还有另一种更好的做法吗?
答案 0 :(得分:0)
多个会话可以保留特定表格的READ
锁定,因此在这种情况下无法帮助您。
在两台服务器中,检查工作时。使用WRITE
锁定相应的表格,如下所示:
LOCK TABLE queue_table WRITE
使用LOCK TABLES ...
锁定多个表格。始终确保以相同的顺序锁定表格。
只要两个服务器在开始抓取工作之前都这样做,它就会序列化操作。当一个服务器具有锁定时,另一个服务器将等待。
然后,做任何你需要做的事情来将队列标记为正在处理,以便其他服务器不会抓取它们,然后释放锁。
使用MyISAM,它不像InnoDB的选项那样精细或可扩展。