在大型更新时从 mysql 触发器向 gearman 发送作业



我正在使用 gearman 的 udf 从更新后的触发器向 gearman 发送后台作业。

文档声明如下:

gman_do* 函数采用可选的第三个参数,即 唯一的作业 ID。这允许您在同一下提交多个作业 唯一 ID,它们将在队列中"合并"以仅运行一次。 请注意,gearmand 只会合并处于队列或正在运行的作业, 它不会在作业完成后跟踪唯一 ID。例如 以下内容可确保仅为每个主机运行一次作业:

选择 gman_do_background("反向", 主机, 主机) AS 测试 mysql.user;

这使得它看起来已经准备好处理大量的线路更新,而不会淹没我的齿轮工队列。

但是当我一次更新 30k 行时,我的 gearman 守护程序在一段时间内无法访问,并且"netstat"在 4730 端口上显示 ~30k 连接,我想这解释了原因。

知道如何在不减慢太多更新的情况下防止冻结发生吗? 我只需要在整个更新查询后触发一次 gearman 作业,但据我所知,mysql/mariadb 在语句触发后不处理。

MySQL/MariaDB仅支持执行FOR EACH ROW的触发器(您可能已经注意到触发器语法的这一强制性部分)。

无论如何,我永远不会建议在扳机中调用齿轮工 UDF。您无法在触发器中知道是否将提交生成触发器的更新(或何时提交)。gearman 服务可能会收到有关它无法查看的更新的通知,因为它尚未提交。

相反,忘记触发器。在应用程序中编写代码以执行更新,然后确认更新成功且事务已提交。然后通知 gearman — 通过从您的应用程序调用 gearman API,而不是使用 MySQL UDF。

然后,您可以灵活地为一批更新的行发出一个通知。

在MySQL中使用任何UDF几乎没有好的方法,这些UDF会导致事务范围之外的副作用,无论如何也没有必要这样做。

相关内容

  • 没有找到相关文章

最新更新