Отправка задания на gearman из триггера mysql при больших обновлениях - PullRequest
0 голосов
/ 12 июня 2019

Я использую udf gearman для отправки фонового задания gearman из триггера после обновления.

документация гласит следующее:

Функции gman_do * принимают необязательный третий параметр, который является уникальный идентификатор работы. Это позволяет вам подать несколько работ под одним и тем же уникальный идентификатор, и они будут «объединены» в очередь для запуска только один раз. Обратите внимание, что gearmand будет объединять только те работы, которые находятся в очереди или работают, он не отслеживает уникальные идентификаторы после завершения работы. Например, следующее гарантирует, что вы запускаете задание только один раз для каждого хоста:

ВЫБРАТЬ gman_do_background ("реверс", хост, хост), как тест ОТ mysql.user;

Похоже, он готов обработать большое количество обновлений строк, не затопляя очередь моего механика.

Но когда я обновляю 30 тыс. Строк одновременно, мой демон gearman на некоторое время становится недоступным, и "netstat" показывает ~ 30 тыс. Соединений на порту 4730, что, я думаю, объясняет, почему.

Есть идеи, как предотвратить зависание, не слишком замедляя обновление? Мне нужно, чтобы задание gearman запускалось один раз после всего запроса на обновление, но, насколько я знаю, mysql / mariadb не обрабатывают после триггеров операторов.

1 Ответ

1 голос
/ 12 июня 2019

MySQL / MariaDB поддерживает только триггеры, которые выполняют FOR EACH ROW (вы, возможно, заметили эту обязательную часть синтаксиса триггера).

В любом случае, я бы никогда не рекомендовал вызывать UDF-редуктор в триггере.Вы не можете знать в триггере, будет ли зафиксировано обновление, которое породило триггер (или , когда будет зафиксировано).Служба gearman может получить уведомление об обновлении, которое оно не может просмотреть, поскольку оно еще не зафиксировано.

Вместо этого забудьте о триггере.Напишите код в своем приложении, чтобы выполнить обновление, а затем подтвердите, что оно успешно выполнено и транзакция зафиксирована.Только тогда уведомляйте gearman - вызывая API gearman из вашего приложения, а не используя MySQL UDF.

Тогда у вас есть возможность сделать одно уведомление для обновленной группы строк.

Естьпрактически нет хорошего способа использовать любую функцию UDF в MySQL, которая вызывает побочные эффекты за пределами области транзакции, и в любом случае в этом нет необходимости.

...