实现基于并发表的队列的最佳方法


11

我在MySQL中有一张表,代表要处理的链接队列。链接由外部应用程序一个接一个地处理,最后被删除。这是一个高容量队列,我有多个处理应用程序实例,分布在多个服务器上。

如何确保每个记录仅由一个应用程序选择?有没有办法标记/锁定记录?

现在,为了避免两个或多个拾取同一链接,我允许每个实例仅拾取一组特定的记录(基于其ID的MOD),但这不是增加队列处理的透明方法通过添加新实例来提高速度。


我的口头禅:“不要排队,就去做”。也就是说,不要将任务扔到队列中,而是启动一个流程来执行任务。
里克·詹姆斯

Answers:


8

首先:MySQL是实现此功能的最糟糕的软件之一,特别是如果它非常动态。原因是像MEMORY和MyISAM这样的引擎只有全表锁,而像InnoDB这样更合适的引擎则有更高的写代价(以提供ACID属性),并且针对访问在空间和时间上都接近的记录(已在内存中设置)进行了优化。 )。对于MySQL来说,也没有一个好的变更通知系统-必须将其实现为轮询。有几十个软件该任务更加优化

话虽这么说,但如果性能/效率要求不是很高,我已经看到成功实现了这种访问。许多人无力仅凭一小部分业务逻辑就引入和维护完整的独立技术。

SELECT FOR UPDATE您正在寻找的是-读取序列化。尽管UPDATE / DELETE总是在运行MYSQL事务期间锁定该行,但是您可能希望避免在进程进行过程中进行大事务,因此:

START TRANSACTION;
SELECT * FROM your_table WHERE state != 'PROCESSING' 
  ORDER BY date_added ASC LIMIT 1 FOR UPDATE;
if (rows_selected = 0) { //finished processing the queue, abort}
else {
UPDATE your_table WHERE id = $row.id SET state = 'PROCESSING'
COMMIT;

// row is processed here, outside of the transaction, and it can take as much time as we want

// once we finish:
DELETE FROM your_table WHERE id = $row.id and state = 'PROCESSING' LIMIT 1;
}

MySQL将在选择行时锁定除一个并发选择之外的所有并发选择。由于这可能同时导致大量锁定的连接,因此请使初始事务尽可能小,并尝试一次处理多于1行的数据。


谢谢。您认为更大的锁定(通过将LIMIT更改为10)可以提高性能吗?
Miguel E

@MiguelE通常,是的,花费的时间越多,与其他交易发生冲突的可能性就越小。但这可能取决于某些情况-也可能导致相反的效果(更多事务被锁定)。始终先进行测试。适当地索引表也很重要,否则在某些隔离模式下您可能会获得完整的表锁定。
jynus

1
最好跟踪一下开始处理行的日期,以防进程挂起并且您希望实现超时机制。
朱利安(Julian)

3

正如我在本文中所解释的,MySQL 8引入了对SKIP LOCKED和NO WAIT的支持。

“跳过锁定”对于实现作业队列(又名批处理队列)很有用,因此您可以跳过已被其他并发事务锁定的锁定。

NO WAIT有助于避免等待并发事务释放我们也希望锁定的锁。没有NO WAIT,我们要么必须等到锁被释放(在当前持有锁的事务在提交或释放时),要么锁获取超时。因此,NO WAIT的作用类似于锁定超时,值为0

有关“跳过锁定”和“不等待”的更多详细信息,请参阅本文


0

我对脱机DBCC检查做了类似的事情(两台服务器进行备份还原,然后执行DBCC checkdb)。一台服务器昨天收集了所有31台服务器的备份,并将它们放入队列中,然后从该队列中取出另一台服务器。尽管服务器数量不多,但方法应保持不变:让应用服务器针对队列运行更新查询,以使用该应用服务器的名称或更好的数字ID更新日期/时间字段和“应用服务器”字段。这将导致锁定,或者如果已经有来自另一台服务器的锁定获得了下一行,它将被阻止并等待其他应用完成下一行的获取。然后,您将希望该应用程序从队列中为其应用程序字段拉回最近的记录,并从中获取所需的任何信息。使用MySQL'

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.