Я думаю, что для 1) единовременной гарантии вам понадобится какой-то алгоритм распределенной транзакции, потому что соединения могут завершиться ошибкой, и вы не знаете состояние запроса на удаленном узле: удаленный узел мертв? он жив и просто отключен из-за сбоя сети? как далеко в обработке запроса он go до сбоя?
Вы должны проверить mnesia , он глубоко интегрирован с Erlang.
Если вы ослабите требования для 1) ( например, если запросы являются идемпотентными. вас интересует хотя бы один раз или сбои не распространены), этого может быть достаточно с мониторингом удаленным gen_server
и просто воспроизведением запроса, если соединение с удаленный сервер потерян по какой-либо причине.
Для 2 мы используем haproxy или nginx веб-сервер с минимальным подключением перед узлами, хотя Я считаю, что вы имеете в виду «внутри» Erlang. В этом случае я бы сделал следующее, чтобы иметь локальный ETS с информацией о загрузке:
- иметь помощника
MODULE
, который транслирует размер локального почтового ящика MODULE
(или другие метрики *). 1033 *) периодически другим участникам в кластере. - Если партнер получает эту широковещательную рассылку, он записывает исходный узел и размер в ETS или просто сохраняет их внутри и сохраняет наименее загруженные на время ETS
- Если помощник замечает, что удаленный узел отключается, он обновляет ETS
Что касается OTP23 pg , не отбрасывайте его так легко. С помощью do c Process Groups implement strong eventual consistency.
у вас могут быть перегруженные серверы, временно покинувшие группу процессов, и они в конечном итоге перестанут получать запросы. У вас может быть несколько серверов для узла с низким триггером, чтобы покинуть группу для более равномерного распределения.