Двухфазная фиксация - Как эффективно использовать мою очередь?

То, что я собираюсь описать, по сути является проблемой двухфазной фиксации между двумя разнородными системами, и я ищу совета, как с этим справиться. В нашем веб-приложении мы переносим некоторые дорогостоящие / сторонние операции, такие как отправка электронной почты, во внеполосные фоновые рабочие процессы (мы называем это нашей инфраструктурой работы).

Чтобы отправить электронное письмо, например, мы создать как объект электронной почты, так и задание электронной почты в нашей базе данных.Затем нам нужно дождаться, пока наш монитор вакансий заберет задание по электронной почте и отправит его. Монитор заданий по существу работает, опрашивая базу данных каждые несколько секунд, когда она простаивает.

Это, однако, добавляет задержку в отправку электронной почты и добавляет то, что я считаю чрезмерной нагрузкой на базу данных при опросе. Было бы намного лучше, если бы мы могли сразу же поместить задание электронной почты в очередь, как только письмо будет создано.

Однако в настоящее время это не удается по двум причинам. Во-первых, очередь часто намного быстрее, чем веб-запрос. Электронное письмо забирается для обработки до того, как веб-запрос зафиксирует транзакцию своей базы данных, поэтому он не может правильно сгенерировать электронное письмо. Во-вторых, если веб-запрос терпит неудачу, он откатывает транзакцию своей базы данных, что означает, что электронное письмо должно быть отправлено , а не . Однако, если он уже был помещен в очередь, он больше не находится под контролем запроса.

Есть ли хорошая стратегия для создания двухфазной фиксации между очередью и базой данных? Для справки мы используем RabbitMQ и MySQL с таблицами InnoDB. Одна из моих идей заключалась в том, чтобы поместить задания электронной почты в очередь после того, как транзакция базы данных была зафиксирована, но это оставляет возможность того, что электронное письмо никогда не попадет в очередь. Мне все равно придется создать процесс опроса, который отслеживает электронные письма, которые должны были быть отправлены, а не были.

7
задан skaffman 5 March 2012 в 09:17
поделиться