Обеспечение надежной доставки сообщений в Эрланге - PullRequest
1 голос
/ 28 ноября 2009

Это связано с продолжающимся обсуждением в моем предыдущем вопросе

.

снижение производительности передачи сообщений в отличие от общих данных

Одной из обсуждаемых проблем был объем работы, необходимый для распределенных алгоритмов в Erlang с использованием передачи сообщений или общего состояния. Моя точка зрения заключается в том, что реализация распределенного выбора лидера с использованием общего состояния (возможно, записи в БД) проще, чем разработка алгоритма, который был бы устойчив к потере сообщений. Не так ли?

Проблема с реализацией алгоритмов, основанных на передаче сообщений, заключается в том, что мы должны либо сделать распределенный алгоритм устойчивым к потере сообщений, либо каким-либо образом обеспечить, чтобы сообщения всегда доставлялись, даже если требуется несколько попыток. Конечно, распределенное избрание лидера - это хорошо известная проблема, и я думаю, что надежный алгоритм передачи сообщений уже существует (может быть, это дает книга Нэнси Линч), но я просто беру эту проблему в качестве примера, чтобы поставить точку.

Спасибо!

Ответы [ 4 ]

4 голосов
/ 28 ноября 2009

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

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

В распределенной среде вы даже можете использовать erlang: monitor_node / 2 для мониторинга состояния узла. Из документов

Сообщение {nodedown, Node} принимается, если соединение с ним потеряно.

IMO, все, что вам нужно сделать, это обработать потерю соединения .

2 голосов
/ 30 ноября 2009

Откуда вы говорите "Проблема с реализацией ...", у вас есть тавтология.

Независимо от того, реализуете ли вы свой алгоритм с помощью передачи сообщений или общего состояния, ваш код ДОЛЖЕН обрабатывать сбои, чтобы быть устойчивым. Конечно, вы не можете беспокоиться об обработке ошибок, но тогда ваш код по определению не устойчив. Если вы говорите «Эрланг должен сделать то-то и то-то, чтобы быть устойчивым», а затем говорите «но я могу обновить строку в базе данных, и она всегда будет работать», тогда вы не будете сравнивать яблоки с яблоками. В любом случае утверждение о том, что база данных (или разделяемое состояние) всегда работает с первой попытки, очевидно, неверно.

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

Это сводится к этому (вот почему я сказал, что это тавтология):

a) При использовании передачи сообщений в вашем коде должно быть реализовано «сообщение доставлено успешно или вы получили ошибку (тайм-аут)».

b) При использовании базы данных в вашем коде должно быть реализовано «строка успешно обновлена, или вы получили ошибку». (То же самое относится к любому решению с общим состоянием).

Поскольку a и b эквивалентны, «проблема», о которой вы говорите, в равной степени относится и к передаче сообщений, и к подходу к вашей базе данных, поэтому обсуждать особо нечего.

Теперь о том, что легче (или даже более уместно), нет простого ответа. Разумный ответ: «используйте любой подход, который лучше подходит вашей проблемной области». Говоря об Erlang, вы также должны учитывать, какие библиотеки / инструменты вы используете, такие как OTP, поскольку они могут оказать огромное влияние на реализацию этих вещей.

2 голосов
/ 28 ноября 2009

Я думаю, что вы делаете странные предположения в своих вопросах / обсуждениях. Вы соглашаетесь с тем, что сообщения могут исчезать, но работа с общим состоянием всегда будет работать и никогда не даст сбоя, а затем вы попытаетесь сравнить сложность алгоритмов. Это не работает так. Когда что-то пойдет не так, что они и сделают, они сделают это, как они запрограммированы. Использование изменяемого общего состояния для создания параллельных систем затруднительно, а использование его для создания надежных параллельных систем - это просто ублюдок.

В любой реальной распределенной системе, если вы хотите убедиться в ее надежности, вы всегда должны учитывать, что сообщения могут не поступать. Как именно это сделать, зависит от приложения.

2 голосов
/ 28 ноября 2009

Как много вещей в жизни: это зависит.

Это зависит от шкалы , о которой мы здесь говорим. Каковы характеристики вашего общего состояния? Если это SPOF («единая точка отказа»), то вы столкнетесь с проблемами отказоустойчивости, а также, возможно, с проблемой доступа (пропускная способность, обработка).

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

Опять же, я немного смущен вопросом: передача сообщений касается аспектов связи , тогда как база данных используется для аспектов хранения . Почему у меня сложилось впечатление, что эти вещи перепутаны в вашем вопросе? (это может быть только я, конечно).


Надежность передачи сообщений: в чем здесь проблема? Коммуникационный уровень, являющийся TCP, очень помогает, хотя и несовершенен, как и все на свете. Если вас беспокоят общие сложности связи между узлами, то не исчезнет независимо от выбранной вами платформы / языка. Erlang просто упрощает распределенную связь .

...