Connect with us

Разработка

Swift в Apple: перенос службы мониторинга паролей с Java

Swift обеспечил лучшую стабильность производительности, улучшенные функции безопасности и высокую надежность — и все это при меньшем потреблении ресурсов за счет эффективного использования памяти и ЦП.

Опубликовано

/

     
     

Swift широко используется в проде для создания облачных сервисов в Apple, давая невероятные результаты. В прошлом году сервис Password Monitoring был переписан на Swift и теперь обрабатывает миллиарды запросов в день с устройств по всему миру. По сравнению с предыдущим сервисом на Java, обновленный бэкенд обеспечивает 40% увеличение производительности, а также улучшенную масштабируемость, безопасность и доступность.

Приложение Passwords, представленное осенью 2024 года, помогает пользователям управлять своими паролями, ключами доступа и кодами подтверждения. Оно позволяет хранить, автоматически заполнять и генерировать надежные пароли, которые можно использовать на всех устройствах, а также делиться паролями с доверенными контактами. Одна из функций безопасности, включенных в приложение, — Password Monitoring, которая предупреждает пользователей, если один из их сохраненных паролей появляется в утечке данных. Эта функция имеет серверный компонент, работающий на инфраструктуре на базе Linux, который обслуживается Apple.

Через регулярные промежутки времени мониторинг паролей сверяет пароли пользователя с постоянно обновляемым и тщательно отобранным списком паролей, которые были раскрыты в результате утечки. Важно отметить, что эта задача выполняется продуманным образом, с соблюдением конфиденциальности, и Apple никогда не раскрывает пароли пользователей. Подробное описание того, как это делается с помощью криптографического протокола пересечения частных наборов, приведено в разделе «Мониторинг паролей» руководства по безопасности платформы Apple.

Переход с Java на Swift был обусловлен необходимостью масштабирования службы мониторинга паролей для достижения более высокой производительности. Модуль многоуровневого шифрования, используемый службой мониторинга паролей, требует значительных вычислительных ресурсов для каждого запроса, однако служба в целом должна быстро реагировать даже при высокой нагрузке.

Выбор Swift для повышения производительности

На протяжении многих лет наша команда полагалась на Java для обеспечения работы крупномасштабных критически важных сервисов из-за проверенной стабильности и производительности. Однако подход Java к управлению памятью больше не соответствует нашим растущим требованиям и целям в области эффективности. Вместо простого расширения аппаратных ресурсов мы искали более эффективный язык, который бы поддерживал наш рост и одновременно снижал нагрузку на серверы.

Прежде чем искать язык для замены, мы искали способы настройки JVM для достижения необходимой производительности. Сборщик мусора (GC) G1 Java смягчил некоторые ограничения более ранних сборщиков, внедрив такие функции, как предсказуемое время пауз, сборка на основе регионов и параллельная обработка. Однако даже с этими усовершенствованиями управление сборкой мусора в больших масштабах остается сложной задачей из-за таких проблем, как длительные паузы GC при высоких нагрузках, увеличение накладных расходов на поддержание производительность и сложность тонкой настройки для различных рабочих нагрузок.

Одной из проблем, с которой столкнулся наш сервис Java, была невозможность быстрого предоставления и вывода из эксплуатации экземпляров из-за накладных расходов JVM. Сервис мониторинга паролей работает по всему миру, поэтому нагрузка на сервис может сильно колебаться в течение дня, даже при использовании технологий на стороне клиента для выравнивания распределения трафика. Пик и минимум в течение дня различаются примерно на 50% в зависимости от региона. Чтобы эффективно управлять этим, мы стремимся уменьшать масштабирование при низком спросе и увеличивать его при пике спроса в разных регионах. Более быстрое время развертывания является важным требованием для поддержки этой динамической стратегии масштабирования.

Учитывая масштаб нашего приложения и объем трафика, который мы обрабатываем ежедневно, решение о переходе с Java на другой язык было принято нелегко. Мы оценили наши варианты и нашли только несколько языков, которые могли бы помочь нам достичь наших целей. Хотя можно было бы ожидать, что Apple автоматически выберет Swift, мы были приятно удивлены тем, насколько хорошо он подходит для уникальных потребностей такого облачного сервиса, как наш. Swift имеет выразительный синтаксис, который был легко освоить, и мог обеспечить улучшение производительности, необходимое для удовлетворения требований наших вычислительных нагрузок. Мы решили сделать значительный шаг и начали переписывать бэкэнд Password Monitoring с использованием Swift.

Наш опыт разработки с помощью Swift

Мы начали переписывать наш сервис с использованием Vapor, веб-фреймворка Swift, который предоставлял модули Routing, Controller и Content, на основе которых мы могли строить наш сервис. Наш сервис имел дополнительные требования, которые привели нас к созданию нескольких кастомных пакетов с необходимой функциональностью: операции с эллиптическими кривыми, которые имеют решающее значение для реализации мониторинга паролей, аудита, конфигурации, обработки ошибок и кастомного промежуточного ПО.

Swift в Apple: перенос службы мониторинга паролей с Java

Одним из наиболее значимых аспектов Swift, который нас впечатлил, было его внимание к протоколам. В Java мы в значительной степени полагались на наследование, что может привести к сложным иерархиям классов и тесной связности. Подход Swift к протоколам и обобщениям способствует модульности и повторному использованию, позволяя классам, структурам и перечислениям использовать общие протоколы, что обеспечивает более гибкую и масштабируемую кодовую базу. Это изменение в мышлении побудило нас думать в терминах поведения, а не конкретных классов, что привело к более чистому и удобному в обслуживании коду.

Безопасность — еще одна область, в которой Swift использует отличительный подход по сравнению с Java. Например, optional тип Swift и механизмы безопасного развертывания устраняют необходимость повсеместной проверки на null, снижая риск исключений null pointer и повышая читаемость кода. Этот подход, ставящий безопасность на первое место, пронизывает весь дизайн языка Swift, будь то детерминированное освобождение памяти, копирование при записи или типы значений, что делает его менее подверженным ошибкам во время выполнения.

Поддержка async/await в Swift — приятное дополнение, упрощающее обработку асинхронных задач. Раньше управление асинхронными операциями часто включало сложные шаблоны обратных вызовов или внешние библиотеки. Синтаксис async/await в Swift упрощает этот процесс, делая его более интуитивным и менее подверженным ошибкам. Теперь мы можем писать асинхронный код, который читается как синхронный, что приводит к более понятной, тестируемой и поддерживаемой обработке параллелизма, что особенно важно в многопоточных средах с высокой нагрузкой.

В целом, наш опыт работы с Swift был чрезвычайно положительным, и мы смогли завершить изменение кода гораздо быстрее, чем первоначально предполагалось. Swift позволил нам написать более компактный, менее многословный и более выразительный код (сокращение количества строк кода почти на 85%), который легко читается и при этом обеспечивает безопасность и эффективность.

Наш сервис извлек выгоду из разнообразной экосистемы пакетов Swift, включая готовые к использованию фреймворки для ведения логов, клиент Cassandra и криптографические библиотеки. В дополнение к отличной системе поддержки и инструментарию, присущий Swift акцент на модульность и расширяемость помог обеспечить будущее и упростить интеграцию и кастомизацию, необходимые для функций, специфичных для нашего сервиса.

Выводы для будущего развития серверного Swift

Мы провели тестирование производительности на всех этапах разработки и развертывания, что позволило нам обнаружить самую привлекательную для нас особенность языка программирования Swift — его эффективность.

Детерминированное управление памятью Swift привело к значительному снижению порога памяти для нашего сервиса. Не только наши первоначальные результаты были обнадеживающими, но и после нескольких итераций улучшения производительности мы получили почти 40% прирост пропускной способности с задержками менее 1 мс для 99.9% запросов на нашем текущем производственном оборудовании. Кроме того, новый сервис занимал гораздо меньше памяти на каждый экземпляр — сотни мегабайт — что на порядок меньше по сравнению с десятками гигабайт, которые требовались нашей реализации на Java при пиковой нагрузке для поддержания той же пропускной способности и задержек. Сервис работает на Kubernetes, и повышение эффективности миграции позволило нам освободить около 50% его емкости для других рабочих нагрузок.

Swift в Apple: перенос службы мониторинга паролей с Java

Наша реализация Swift работает в производственной среде плавно и эффективно, что оправдывает усилия, которые мы вложили в эту миграцию. Помимо превосходства над нашим предыдущим приложением на базе Java, Swift обеспечил лучшую стабильность производительности, улучшенные функции безопасности и высокую надежность — и все это при меньшем потреблении ресурсов за счет эффективного использования памяти и ЦП. Благодаря меньшему количеству шаблонного кода и более гибким шаблонам проектирования, которые мы использовали, мы рассчитываем на упрощение обслуживания нашего приложения. Swift был мощным выбором для создания быстрых, отказоустойчивых и удобных в обслуживании приложений в нашей требовательной среде.

Источник

Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Telegram

Популярное

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: