Перейти к содержимому
Решения

Интеграция Odoo и RabbitMQ

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

Получить консультацию

Проблематика очередей

Odoo — транзакционная система. В результате такого подхода при интеграции с другими системами могут наблюдаться сбои по части отправки данных в случае отката выполняемой транзакции.

Также имеется проблема зависания рабочего процесса (worker) до момента получения ответа от удалённой системы. А если его и вовсе не последует?

Пример

Имеются инвойсы (account.move). Имеется планировщик, который должен отменить выставленные, но не оплаченные инвойсы, в определённое время.

Каждая отмена инвойса сопровождается отправкой уведомления клиенту через SMS или Телеграм. Это элемент бизнес-логики.

Предположим, что планировщик в цикле обрабатывает все такие инвойсы. Предположим, что в процессе работы планировщика произошёл сбой (таймаут, ошибка, рестарт сервера).

В результате во внешнюю систему уйдут SMS, т.к. в процессе будет сделан POST запрос к API шлюза, а «отмена инвойсов» отменится. В Odoo всё останется так, как было до запуска планировщика.

Решение

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

Если в процессе выполнения задания транзакция откатится, то и записи, сделанные в буфер, удалятся.

Остаётся обработать буфер независимым планировщиком.

И вот что мы сделали

Вместо непосредственной отправки SMS или сообщения Телеграм, они помещаются в буфер заданий.

Примерно раз в минуту планировщик проверяет буфер на предмет новых заданий. И если они есть, помещает их в брокер очередей RabbitMQ.

Примерно раз в минуту исполнитель заданий проверяет очереди в брокере RabbitMQ и исполняет.

Сообщения в буфере помечаются как исполненные.

Отказоустойчивость на каждом уровне

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

Если сбой внутри Odoo и откат — сообщение не попадёт в буфер.

Если ляжет брокер — все задания исполнятся как только брокер поднимется.

Если лягут планировщики — все задания будут исполнены как только планировщики поднимутся.

Если ляжет внешняя система — исполнитель сможет исполнить все ошибочные задания после подъёма.

А как же модуль queue_job?

«А как же модуль queue_job?» — заметит внимательный и искушённый оппонент. У него есть свои ограничения, и нам показалось правильным использовать профессиональный внешний брокер.

Нужна надёжная интеграция Odoo?

Расскажите о вашем IT-ландшафте — подберём оптимальную архитектуру интеграции с использованием RabbitMQ.

Связаться с нами