Не ставьте задачи Dramatiq в очередь, пока транзакция Django не будет зафиксирована

В настоящее время я использую Celery, но я серьезно рассматриваю возможность перехода на Dramatiq (и django-dramatiq) из-за того, насколько все может быть проще. Celery кажется слишком сложным (особенно для моих случаев использования) и не очень надежным.

Однако одна из возможностей Celery, которую я использую, - это возможность добавить класс base для каждой задачи. Я добавляю TransactionAwareTask в качестве базового класса для большинства задач (вдохновленный этой записью в блоге ).

Этот базовый класс удерживает задачу (при вызове apply_async) и фактически отправляет ее в очередь только при достижении transaction.on_commit, что означает, что окружающая транзакция прошла успешно и задачу можно смело ставить в очередь.

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

Есть ли способ сделать это с помощью Dramatiq? Кажется, что промежуточное ПО dramatiq может быть полезным (и я могу отключить его для тестирования, где транзакции вообще не фиксируются), но я не совсем уверен. Кто-нибудь делал что-то подобное?

Вернуться на верх