Откуда вы говорите "Проблема с реализацией ...", у вас есть тавтология.
Независимо от того, реализуете ли вы свой алгоритм с помощью передачи сообщений или общего состояния, ваш код ДОЛЖЕН обрабатывать сбои, чтобы быть устойчивым. Конечно, вы не можете беспокоиться об обработке ошибок, но тогда ваш код по определению не устойчив. Если вы говорите «Эрланг должен сделать то-то и то-то, чтобы быть устойчивым», а затем говорите «но я могу обновить строку в базе данных, и она всегда будет работать», тогда вы не будете сравнивать яблоки с яблоками. В любом случае утверждение о том, что база данных (или разделяемое состояние) всегда работает с первой попытки, очевидно, неверно.
Таким образом, для реализации с использованием передачи сообщений вам необходим API, который оборачивает конструкции передачи сообщений на достаточно высокий уровень, так что он пригоден для использования вашими программистами приложений, но он по-прежнему должен проверять и обрабатывать сбои .
Это сводится к этому (вот почему я сказал, что это тавтология):
a) При использовании передачи сообщений в вашем коде должно быть реализовано «сообщение доставлено успешно или вы получили ошибку (тайм-аут)».
b) При использовании базы данных в вашем коде должно быть реализовано «строка успешно обновлена, или вы получили ошибку». (То же самое относится к любому решению с общим состоянием).
Поскольку a и b эквивалентны, «проблема», о которой вы говорите, в равной степени относится и к передаче сообщений, и к подходу к вашей базе данных, поэтому обсуждать особо нечего.
Теперь о том, что легче (или даже более уместно), нет простого ответа. Разумный ответ: «используйте любой подход, который лучше подходит вашей проблемной области». Говоря об Erlang, вы также должны учитывать, какие библиотеки / инструменты вы используете, такие как OTP, поскольку они могут оказать огромное влияние на реализацию этих вещей.