Интеграция Odoo и RabbitMQ
Брокер очередей для надёжного асинхронного взаимодействия Odoo с внешними системами без сбоев и потерь данных.
Получить консультациюПроблематика очередей
Odoo — транзакционная система. В результате такого подхода при интеграции с другими системами могут наблюдаться сбои по части отправки данных в случае отката выполняемой транзакции.
Также имеется проблема зависания рабочего процесса (worker) до момента получения ответа от удалённой системы. А если его и вовсе не последует?
Пример
Имеются инвойсы (account.move). Имеется планировщик, который должен отменить выставленные, но не оплаченные инвойсы, в определённое время.
Каждая отмена инвойса сопровождается отправкой уведомления клиенту через SMS или Телеграм. Это элемент бизнес-логики.
Предположим, что планировщик в цикле обрабатывает все такие инвойсы. Предположим, что в процессе работы планировщика произошёл сбой (таймаут, ошибка, рестарт сервера).
В результате во внешнюю систему уйдут SMS, т.к. в процессе будет сделан POST запрос к API шлюза, а «отмена инвойсов» отменится. В Odoo всё останется так, как было до запуска планировщика.
Решение
Для того, чтобы сообщения во внешнюю систему уходили после коммита транзакции, следует вместо прямого взаимодействия из функций классов с внешней системой использовать буферную модель.
Если в процессе выполнения задания транзакция откатится, то и записи, сделанные в буфер, удалятся.
Остаётся обработать буфер независимым планировщиком.
И вот что мы сделали
Вместо непосредственной отправки SMS или сообщения Телеграм, они помещаются в буфер заданий.
Примерно раз в минуту планировщик проверяет буфер на предмет новых заданий. И если они есть, помещает их в брокер очередей RabbitMQ.
Примерно раз в минуту исполнитель заданий проверяет очереди в брокере RabbitMQ и исполняет.
Сообщения в буфере помечаются как исполненные.
Отказоустойчивость на каждом уровне
Таким образом у вас теперь есть система, которая позволит асинхронно общаться с другими системами не вызывая нагрузки и сбоев.
Если сбой внутри Odoo и откат — сообщение не попадёт в буфер.
Если ляжет брокер — все задания исполнятся как только брокер поднимется.
Если лягут планировщики — все задания будут исполнены как только планировщики поднимутся.
Если ляжет внешняя система — исполнитель сможет исполнить все ошибочные задания после подъёма.
А как же модуль queue_job?
«А как же модуль queue_job?» — заметит внимательный и искушённый оппонент. У него есть свои ограничения, и нам показалось правильным использовать профессиональный внешний брокер.
Нужна надёжная интеграция Odoo?
Расскажите о вашем IT-ландшафте — подберём оптимальную архитектуру интеграции с использованием RabbitMQ.
Связаться с нами