Длинная версия:
Я новичок в erlang и рассматриваю возможность использования его для масштабируемой архитектуры. Я нашел много сторонников платформы, рекламирующих ее надежность и отказоустойчивость.
Однако я изо всех сил пытаюсь понять, как достигается отказоустойчивость в этой системе, где сообщения помещаются в очередь в переходной памяти. Я понимаю, что иерархию супервизора можно организовать для возрождения умерших процессов, но мне не удалось найти много объяснений последствий респаунинга для незавершенного производства. Что происходит с сообщениями в полете и артефактами частично завершенной работы, которые были потеряны на умирающем node?
Будут ли все производители автоматически ретранслировать сообщения, которые не являются сторонними, когда потребительские процессы умирают? Если нет, то как это можно считать отказоустойчивым? И если да, то что препятствует тому, чтобы сообщение, которое было обработано, но не совсем признано, было повторно передано и, следовательно, обработано неправильно?
(Я признаю, что эти проблемы не уникальны для erlang, аналогичные проблемы возникнут в любой распределенной системе обработки. Но энтузиасты erlang, похоже, утверждают, что платформа делает все это "легким"..?)
Предполагая, что сообщения повторно передаются, я могу легко представить себе сценарий, когда последующие эффекты сложной цепочки сообщений могут стать очень запутанными после сбоя. Без какой-либо тяжелой распределенной транзакционной системы я не понимаю, насколько совместимость и правильность могут поддерживаться без устранения дублирования в каждом процессе. Должен ли мой код приложения всегда применять ограничения для предотвращения выполнения транзакций более одного раза?
Краткая версия:
Распределены процессы erlang, подлежащие дублированию сообщений? Если это так, является дубликат-защита (т.е. idempotency) ответственность приложения или erlang/OTP каким-то образом помогают нам в этом?