Не ставьте задачи Dramatiq в очередь, пока транзакция Django не будет зафиксирована
В настоящее время я использую Celery, но я серьезно рассматриваю возможность перехода на Dramatiq (и django-dramatiq) из-за того, насколько все может быть проще. Celery кажется слишком сложным (особенно для моих случаев использования) и не очень надежным.
Однако одна из возможностей Celery, которую я использую, - это возможность добавить класс base для каждой задачи. Я добавляю TransactionAwareTask в качестве базового класса для большинства задач (вдохновленный этой записью в блоге ).
Этот базовый класс удерживает задачу (при вызове apply_async) и фактически отправляет ее в очередь только при достижении transaction.on_commit, что означает, что окружающая транзакция прошла успешно и задачу можно смело ставить в очередь.
Таким образом, я (например) никогда не отправлю письмо клиенту, когда его действие на самом деле не удалось. И задача никогда не будет выполняться до фиксации транзакции (что технически может произойти, если процесс каким-то образом будет медленнее очереди задач).
Есть ли способ сделать это с помощью Dramatiq? Кажется, что промежуточное ПО dramatiq может быть полезным (и я могу отключить его для тестирования, где транзакции вообще не фиксируются), но я не совсем уверен. Кто-нибудь делал что-то подобное?