Федерация
Основные задачи Федерации
- Для UnitNode, возможность создать связь между инстансами для получения данных с qos <= 1
- Синхронизация публичных Repo Registry, для единого реестра доступных репозиториев
- Возможность для пользователя, полностью выкачать свои данные - сделать бекап своего аккаунта
Связь UnitNode между инстансами
Связь UnitNode между инстансами, в том числе между разными пользователями, подписывается приватными ключами пользователей на стороне пользователей. Нужны две подписи.
- Владелец unit на первом инстансе подписывает запрос своим приватным ключом: какой выход его UnitNode пишет в какой вход UnitNode на втором инстансе.
- Владельцу unit на втором инстансе приходит уведомление с другого инстанса с просьбой подписать связь. В уведомлении уже лежит подпись приватным ключом пользователя, владельца unit на первом инстансе.
- Связь включается после второй подписи. Пока её нет, сообщения в этот вход не принимаются.
- На обоих инстансах обязательно есть аккаунты инициатора, для pair
- домен сверяется через отдельный https запрос
Модерация инстансов в федерации
- Автоматический бан (инкремент 1, 7, 30 дней) Внешних UnitNode, которые превышают лимиты, между инстансами
- Автоматическая система прерывания доверия между инстансами с добавлением инстанса в чёрный список
- Ручное отключение администратором инстансов по чёрным спискам. Для крайних случаев
Нагрузка
Раз в час MessageProcessor сравнивает суммарную нагрузку Unit с ресурсами инстанса и выставляет статус:
- Зелёный — доступен для создания Unit, нагрузка < 70%
- Жёлтый — система на грани тротлинга, нагрузка > 70% < 90%
- Красный — система в тротлинге, нагрузка > 90%
- Часть Unit принудительно отключена, как ошибка отдаётся тротлинг системы
Доработки MessageProcessor
Внешнее взаимодействие
- Всё работает на актуальной таблице внешних связей + подписи
- из этой таблице понятно куда ретранслировать внутренние сообщения
- из этой таблицы понятно каким сообщеним можно доверять снаружи
- Транспорт - gRPC
- При отправке mqtt -> gRPC при получении gRPC -> mqtt
- Ставит ttl и прочие параметры сообщения, чтобы не было петель и дублей
- Выдаёт отказ в обслуживании при превышении лимита внешних сообщений
- Прерывает доверие между инстансами если много аномальных топиков
- Секурное и стабильное внешнее общение
Механизм подписи связи между двумя UnitNode на разных инстансах
- Пользователь доверяет обоим инстансам
- Подписей всегда две. Вторая ставится на уже наполовину подписанный контракт, который приходит уведомлением
- Один мульти аккуант на разных инстансах: Один и тот же аккаунт подписывает оба раза своим приватником: второй раз на другом инстансе.
- Два мульти аккуанта на разных инстансах: вторую подпись ставит другой владелец, перед этим сверив отпечаток чужого постоянного публичного ключа. Важно чтобы аккаунт первого мультикааунта был представлен на обоих инстансах
- номер редакции
| # | Этап | Что происходит | Ключи |
|---|---|---|---|
| 1 | Первая подпись | Инициатор подписывает контракт: какой выход какого Unit пишет в какой вход, номер редакции. Связь ещё выключена | Постоянный приватный ключ инициатора |
| 2 | Наполовину подписанный контракт | На второй инстанс приходит уведомление. В нём уже лежит первая подпись. Тот же аккаунт подписывает второй раз своим приватником. Другой аккаунт сверяет отпечаток и подписывает своим | Вторая подпись: тот же приватный ключ или приватный ключ второго владельца |
| 3 | Включение | Связь включается только после второй подписи. До неё сообщения в этот вход не принимаются | Обе подписи сходятся с постоянными публичными ключами |
| 4 | Доставка | Инстанс отправителя передаёт тело, uuid Unit, выход и вход по gRPC на домен из связи. Домен сверяется отдельным https-запросом | Подписи на этом шаге нет |
| 5 | Приём | Инстанс получателя кладёт тело во вход, если домен отправителя тот, что в связи, и обе подписи на контракте сходятся | Постоянные публичные ключи подписавших |
- Отозвать связь можно новым номером редакции: снова первая подпись, затем наполовину подписанный контракт и вторая подпись. Либо удалив контракт на своей стороне.
- Потребуется глубойкий рефактор таблиц, чтобы внешние инстансы корректно работали