Высокая доступность в Erlang? - PullRequest
1 голос
/ 28 мая 2020

Каковы типичные способы достижения высокой доступности в Erlang?

Предположим, что некоторые gen_server зарегистрированы как ?MODULE локально. Учитывая N независимый и связанный между собой по умолчанию узлами Erlang, каждый из которых запускает экземпляр этого gen_server, как 1) гарантировать, что ни один запрос не будет потерян из-за сбоя какого-либо участвующего узла (пока хотя бы один из них находится в сети ), 2) балансировать их, чтобы избежать перегрузки одних узлов, в то время как другие зависают в ожидании новых сообщений? Насколько мне известно, встроенного балансировщика нагрузки не существует: ни pg2, ни более новой pg не хватает (все же может быть хорошей базой для дальнейшей работы в этом направлении).

Готов поспорить, что это обычная проблема, и существуют хорошо зарекомендовавшие себя проверенные в бою решения «Erlangi sh». Что это?

1 Ответ

3 голосов
/ 28 мая 2020

Я думаю, что для 1) единовременной гарантии вам понадобится какой-то алгоритм распределенной транзакции, потому что соединения могут завершиться ошибкой, и вы не знаете состояние запроса на удаленном узле: удаленный узел мертв? он жив и просто отключен из-за сбоя сети? как далеко в обработке запроса он go до сбоя?
Вы должны проверить mnesia , он глубоко интегрирован с Erlang.

Если вы ослабите требования для 1) ( например, если запросы являются идемпотентными. вас интересует хотя бы один раз или сбои не распространены), этого может быть достаточно с мониторингом удаленным gen_server и просто воспроизведением запроса, если соединение с удаленный сервер потерян по какой-либо причине.

Для 2 мы используем haproxy или nginx веб-сервер с минимальным подключением перед узлами, хотя Я считаю, что вы имеете в виду «внутри» Erlang. В этом случае я бы сделал следующее, чтобы иметь локальный ETS с информацией о загрузке:

  1. иметь помощника MODULE, который транслирует размер локального почтового ящика MODULE (или другие метрики *). 1033 *) периодически другим участникам в кластере.
  2. Если партнер получает эту широковещательную рассылку, он записывает исходный узел и размер в ETS или просто сохраняет их внутри и сохраняет наименее загруженные на время ETS
  3. Если помощник замечает, что удаленный узел отключается, он обновляет ETS

Что касается OTP23 pg , не отбрасывайте его так легко. С помощью do c Process Groups implement strong eventual consistency. у вас могут быть перегруженные серверы, временно покинувшие группу процессов, и они в конечном итоге перестанут получать запросы. У вас может быть несколько серверов для узла с низким триггером, чтобы покинуть группу для более равномерного распределения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...