cryptofoundry

Связаться с cryptofoundry

Расскажите, что вы хотите создать или автоматизировать.

Электронная почта
[email protected]
ADAMANT Messenger
Открыть в ADAMANT
Ecosystem & Integrations

ADAMANT Notification Service v0.5.0 — модернизация на .NET 8, повышение надежности и исправления в области конфиденциальности

ADAMANT Notification Service (ANS) обеспечивает доставку push-уведомлений Apple для iOS-приложения ADAMANT, при этом ни ANS, ни Apple не получают информации о том, кто и кому отправляет сообщения. Версия v0.5.0 является первым релизом с момента выхода версии 0.4.1 в 2019 году.

Это не было полным переписыванием кода. В будущем планируется заменить ANS на adamant-ns, поэтому задача была ограничена: отказаться от устаревших зависимостей и исправить ошибки, вызывавшие сбои в работе, не затрагивая архитектуру и модель конфиденциальности.

Среда выполнения

Сервис был переведен с netcoreapp3.0 (срок поддержки истек в 2020 году) на .NET 8 LTS во всех проектах. Это позволяет выполнять развертывание на Ubuntu 22.04+ без необходимости использования контейнеров с устаревшими библиотеками для поддержания работы старой среды выполнения.

Утечка сокетов

Клиент API создавал новый экземпляр HttpClient для каждого запроса и не закрывал его. В промышленной эксплуатации это приводило к постоянному росту числа сокетов, зависших в состоянии CLOSE-WAIT — примерно 30+ файловых дескрипторов в минуту на работающем экземпляре. По достижении определенного порога это приводило к сбоям DNS-разрешения для всего процесса. Теперь используется единый общий и повторно используемый клиент.

Отказоустойчивость

Ранее выбор узла осуществлялся случайным образом из списка настроенных, без повторных попыток при неудаче. Любая ошибка на выбранном узле, включая временную, приводила к аварийному завершению работы всего сервиса. Теперь реализован механизм повторных попыток подключения к другому узлу, а полный отказ всех настроенных узлов приводит лишь к пропуску цикла обработки, а не к падению системы.

Замена провайдера EF Core

Изначально планировалось оставить EF Core без изменений, обновив только целевую платформу приложения. Это сработало для ядра ORM (EF Core 2.2 ориентирован на netstandard2.0, поэтому он компилируется под .NET 8), но провайдер MySQL (MySql.Data.EntityFrameworkCore) оказался неработоспособным: возникало исключение AmbiguousMatchException при выполнении самого первого запроса. Проблема была выявлена с помощью нового smoke-теста на базе SQLite еще до выхода в продакшн. Провайдер был заменен на Pomelo.EntityFrameworkCore.MySql — активно поддерживаемое решение, ставшее стандартом в экосистеме .NET.

Исправления в области конфиденциальности

Были обнаружены три места в логах, где записывались конфиденциальные данные: токен устройства при каждой успешной отправке уведомления, расшифрованные данные сигнала (содержащие токен устройства) при ошибке парсинга и пароль от сертификата APNs при ошибке загрузки. Все три случая нарушали заявленные правила конфиденциальности проекта и были устранены.

Другие исправления в промышленной эксплуатации

После внесения вышеуказанных изменений были найдены и исправлены дополнительные проблемы: ошибка расширения пути ~, которая могла препятствовать запуску обоих воркеров на headless-серверах; граничный случай при запуске, приводивший к массовой рассылке уведомлений о старых транзакциях после сбоев сети; проблема потокобезопасности при выборе узла в условиях параллельного использования; отсутствие таймаута HTTP и ошибка нулевой ссылки при получении некорректного ответа от APNs.

Корректное завершение работы

Ранее воркеры не обрабатывали сигнал SIGTERM, поэтому стандартные команды docker stop или systemctl restart всегда выглядели в логах как аварийное завершение. Теперь сервис завершает работу корректно.

Тестирование и отслеживание версий

Покрытие тестами выросло с нескольких штук до 35, включая упомянутый выше smoke-тест EF Core/SQLite. Сборки теперь содержат реальный номер версии — ранее каждая сборка по умолчанию имела версию 1.0.0.0, независимо от того, что было указано в файле проекта.

Безопасность

Аудит безопасности проведен компанией cryptofoundry.

Ссылки