Size: a a a

2020 August 29

LL

Lama Lover in pro.elixir
Źmićer Rubinštejn
В идеале должен быть сервис, который держит дуплекс tcp соединение с нодой и получает от неё диффы по статусам KV. В случае разрыва коннекта все ключи, переданные через это соединение идёт в мусорку.

В случае, если другое соединение пытается совершить операции с ключом, «забитым» другим соединением - в самом простом случае - TCP коннект просто рвёт сам сервис, а потом применяет все правила.


Соответственно в BEAM один генсервер может все это дело трекать. Если нода крешнется - все ее ключи исчезнут. Если сервис порвёт соединение - то сам генсервер у себя удаляет все процессы, переконнекчивается и начинает все заново
Да, и это называется Horde.Registry
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Lama Lover
Да, и это называется Horde.Registry
Только horde registry умрет, когда ляжет нода
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Например сегфолт в нифке развалит всю систему
источник

LL

Lama Lover in pro.elixir
Źmićer Rubinštejn
Только horde registry умрет, когда ляжет нода
Ну да, это нормально, что источник данных может умирать
источник

LL

Lama Lover in pro.elixir
Źmićer Rubinštejn
В идеале должен быть сервис, который держит дуплекс tcp соединение с нодой и получает от неё диффы по статусам KV. В случае разрыва коннекта все ключи, переданные через это соединение идёт в мусорку.

В случае, если другое соединение пытается совершить операции с ключом, «забитым» другим соединением - в самом простом случае - TCP коннект просто рвёт сам сервис, а потом применяет все правила.


Соответственно в BEAM один генсервер может все это дело трекать. Если нода крешнется - все ее ключи исчезнут. Если сервис порвёт соединение - то сам генсервер у себя удаляет все процессы, переконнекчивается и начинает все заново
Ты описал Eventually Consistent систему на каких-то delta_crdt, как я понял
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Хз. Вроде как eventually consistent допускает два процесса. Такая система как я описал - не допускает
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Или допускает
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Хз. Чет не соображу
источник

B

Bogdan in pro.elixir
Źmićer Rubinštejn
В идеале должен быть сервис, который держит дуплекс tcp соединение с нодой и получает от неё диффы по статусам KV. В случае разрыва коннекта все ключи, переданные через это соединение идёт в мусорку.

В случае, если другое соединение пытается совершить операции с ключом, «забитым» другим соединением - в самом простом случае - TCP коннект просто рвёт сам сервис, а потом применяет все правила.


Соответственно в BEAM один генсервер может все это дело трекать. Если нода крешнется - все ее ключи исчезнут. Если сервис порвёт соединение - то сам генсервер у себя удаляет все процессы, переконнекчивается и начинает все заново
Опять отказоустойчивость теряется из за сервиса который контролирует все соединения, ибо этот сервис может быть раскатан только на одной ноде.
источник

ŹR

Źmićer Rubinštejn in pro.elixir
По другому никак
источник

B

Bogdan in pro.elixir
который принимает соединения
источник

B

Bogdan in pro.elixir
базу данных можно на 3-4 нодах поднять.
источник

ŹR

Źmićer Rubinštejn in pro.elixir
CAP теорема и вот это все
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Описанная система - CP, соответственно не A
источник

LL

Lama Lover in pro.elixir
Нет, есть конечно очень ахуенный способ сделать всё что вы хотите без выбора лидера или базы
При инициализации системы берёте и каждой ноде задаёте id и количество соседей
Потом когда в систему приходит username, вы определяете на какой ноде его запустить путём id = hash(username) % cluster_size
источник

ŹR

Źmićer Rubinštejn in pro.elixir
И если нода падает, тогда...
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Все пользователи с неё идут гулять
источник

LL

Lama Lover in pro.elixir
Źmićer Rubinštejn
И если нода падает, тогда...
Тогда нода рестартится
источник

LL

Lama Lover in pro.elixir
<%= erlang_logo %>
источник

B

Bogdan in pro.elixir
Без постоянного пинга ноды с каким-то единным центром не получится решить эту проблему. Это либо TCP либо БД.
источник