# Семинар 4. Групповые взаимодействия На семинаре закрепим материал лекции через демонстрацию IP multicast, разбор историй отказов, работу с причинным буфером и эксперименты с gossip. Будем различать получение сетевого сообщения и его доставку приложению, проверять гарантии рассылки и сравнивать стоимость распространения информации. ## Подготовка и участие Для самостоятельных экспериментов заранее выполните [инструкции по подготовке gossip](gossip/readme.md#подготовка) и проверьте запуск `distsys-gossip -h`. Если окружение не готово, можно участвовать в разборе демонстрации и подготовленных журналов: предсказывать результат, находить нужные показатели и объяснять наблюдения. ## 1. IP multicast: доставка сетевых сообщений Проследим путь сообщения от отправителя к нескольким получателям в [примере с контейнерами](ip_multicast/readme.md). Найдём в коде адрес группы, присоединение получателя и отправку датаграммы. Затем отключим одного получателя, отправим сообщение и вернём его в группу. Перед запуском предположим, кто увидит каждое сообщение, а после сравним прогноз с журналом. Обсудим, восстанавливаются ли пропущенные сообщения и какие механизмы понадобились бы для этого. Свяжем наблюдение с различием между сетевым получением и доставкой приложению. ## 2. Надёжная рассылка: обязательства при отказах Разберём свойства Validity, No Duplication, No Creation, Agreement и Uniform Agreement на историях с остановкой процессов. В каждой истории сначала определим, какие процессы корректны, затем проверим обязательства по доставке. Основные вопросы: - Что меняется, если отправитель падает посреди рассылки? - Обязаны ли остальные корректные процессы доставить сообщение, если получатель уже доставил его, а затем упал? - Почему перед вызовом `deliver` может потребоваться дождаться, пока сообщение сохранится у других процессов? Сравним BEB, RB и URB и обсудим роль корректного большинства. ## 3. Порядок доставки: зависимости и буфер На примерах последовательных сообщений и ответа в чате различим FIFO и Causal Order. Построим зависимости между сообщениями, полученными в перемешанном порядке, и пошагово разберём буфер доставки. Для каждого сообщения определим, выполнены ли его зависимости и как доставка изменяет состояние получателя. Проверим, почему после одной доставки нужно снова просмотреть буфер и когда допустимы разные последовательности доставок. В завершение обсудим пример независимых операций, для которых причинного порядка недостаточно, чтобы реплики получили одинаковый результат, и роль Total Order. ## 4. Gossip: скорость, трафик и остановка В [лабораторной работе](gossip/readme.md) сравним push, pull и push-pull с одинаковыми параметрами. Перед каждым экспериментом сформулируем прогноз, затем сопоставим его с результатом. - Измерим время полного охвата и число сетевых сообщений. - Изменим fanout и вероятность потерь, сохраняя остальные параметры. - Сравним полный охват с прекращением периодических обменов. - Разберём, почему `-q` останавливает симулятор, а `STOPPED` у процесса не означает его отказ. Объясним наблюдения через действия узлов и ограничения модели. Результат одного запуска используем как конкретный пример; для проверки общего вывода повторим эксперимент с другими seed. ## Дополнительные материалы ### IP multicast - [Адреса multicast](https://en.wikipedia.org/wiki/Multicast_address), [IGMP](https://linkmeup.gitbook.io/sdsm/9.-multicast/1.-igmp) и [подробный разбор multicast](https://linkmeup.gitbook.io/sdsm/9.-multicast). - [Работа с multicast в Python](https://pymotw.com/3/socket/multicast.html). - Примеры применения: [zeroconf](https://en.wikipedia.org/wiki/Zero-configuration_networking), [multicast DNS](https://en.wikipedia.org/wiki/Multicast_DNS), [multicast NTP](https://www.oreilly.com/library/view/cisco-ios-cookbook/0596527225/ch14s11.html), [обнаружение узлов в Apache Ignite](https://ignite.apache.org/docs/latest/clustering/tcp-ip-discovery). ### Надёжность и порядок - [Отношение happens-before](https://en.wikipedia.org/wiki/Happened-before). - [Конспект курса Distributed Systems](https://www.cl.cam.ac.uk/teaching/2021/ConcDisSys/dist-sys-notes.pdf), разделы 3 и 4. ### Gossip и его применения - [Визуализация распространения информации](https://flopezluis.github.io/gossip-simulator/). - Обнаружение узлов и сведения о составе группы: [Consul](https://developer.hashicorp.com/consul/docs/architecture/gossip), [обсуждение Serf, memberlist и SWIM](https://www.hashicorp.com/resources/everybody-talks-gossip-serf-memberlist-raft-swim-hashicorp-consul), [Cassandra](https://docs.datastax.com/en/cassandra-oss/3.x/cassandra/architecture/archGossipAbout.html). - [Gossip в Hyperledger Fabric](https://hyperledger-fabric.readthedocs.io/en/latest/gossip.html). - Распространение блоков и транзакций Bitcoin: [обзор P2P-сети](https://nakamoto.com/bitcoins-p2p-network/), [статья](https://arxiv.org/pdf/1703.08761.pdf), [видеоматериалы](https://www.dsn.kastel.kit.edu/bitcoin/videos.html).