Шпилевой Владислав
Принятие решений
Вывод нерабочих узлов из кластера
Починка отказов
узлов
сообщений в сети
"Все со всеми" не работает
узлов
сообщений в сети
Протоколы "слухов", "инфекций"
!
!
!
!
!
!
!
!
Распространяют событие все, а не один узел
Алгоритмы рандомизированы:
Lifeguard
Scalable
!
Weakly-Consistent
!
!
!
!
!
!
A
B
C
A
A
Infection-Style Process
!
!
!
!
Group Membership
D
E
H
G
F
A, B, C, D, E, F, G, H
A, B, C, D, E, F, G, H
A, B, C, D, E, F, G, H
A, B, C, D, E, F, G, H
A, B, C, D, E, F, G, H
A, B, C, D, E, F, G, H
A, B, C, D, E, F, G, H
UUID
URI1
URI2
URI3
Адрес можно менять
Heartbeat Rate
Модуль
Можно создавать много узлов
Конфигурируется почти все
Есть ручное управление таблицей узлов кластера
Можно обращаться к узлам
Асинхронная подписка на события
Аккуратный вывод из кластера с уведомлением всех
Случайное перемешивание
swim = require('swim') s = swim.new([cfg]) s:cfg({heartbeat_rate = ..., ack_timeout = ..., gc_mode = ..., uri = ..., uuid = ...}) s:probe_member(uri) s:add_member({uuid = ..., uri = ...}) s:remove_member(uuid) s:broadcast([port]) s:size() s:member_by_uuid(uuid) s:pairs() s:on_member_event(new_trigger[, old_trigger]) s:quit() s:delete()
swim = require('swim') box.cfg{listen = 3336} s = swim.new({uri = 3335, uuid = uuid2}) s:set_payload({ tport = 3336, any_other_data = value })
Payload
Надежная рассылка поверх UDP
Анти-энтропия
Чтобы не бояться UDP
Ping + Часть таблицы мемберов
Шифрование
Можно слать через открытую сеть
function on_event(m, event) if event:is_new_generation() then ... end end s:on_event(on_event)
Детектор перезапуска
Полный контроль жизненного цикла