[Перевод] Rust в Microsoft (или cоздание Security Daemon Azure IoT Edge)
Примечание от переводчика: Rust относительно молодой язык программирования, и на этом этапе развития всегда интересные опыты практического применения. Известно, что Intel, DropBox, Amazon, Facebook и другие используют Rust в своих проектах. Про применение Rust в проекте от Microsoft было известно, но подробностей не было, и это вероятно первая официальная публикация про применение Rust в компании Microsoft. (технические детали по самому продукту приводятся «как есть», подробности уточняйте на сайте компании)
Azure IoT Edge — это кроссплатформенный программный проект с открытым исходным кодом, созданный группой разработчиков Azure IoT в Microsoft. Azure IoT Edge — «это служба Интернета вещей на основе Центра Интернета вещей. Эта служба предназначена для клиентов, которым необходимо анализировать данные не в облаке, а на пограничных устройствах. В результате перемещения части рабочей нагрузки в пограничную область устройства тратят меньше времени на отправку сообщений в облако и быстрее реагируют на события.» [взято из официальной русскоязычной документации (1) — прим. переводчика]
В этом посте объясняются некоторые причины, по которым мы выбрали Rust в качестве языка программирования для реализации компонента Security Daemon в продукте.
Security Daemon загружает среду выполнения Azure IoT Edge. Он выступает в качестве посредника связи между средой выполнения Azure IoT Edge и многими хост-службами, такими как среда выполнения контейнера и аппаратные устройства криптографии Hardware Security Modules (HSM) и Trusted Platform Modules (TPM).
Выбор технического стека для Security Daemon
Когда мы начали работу над Security Daemon (далее по тексту edgelet), мы определили следующие основные цели проектирования:
- edgelet должен быть собственным компонентом, для выполнения которого не требуется среда выполнения, например .NET CLR.
- поскольку edgelet будет служить каналом для доступа к оборудованию HSM/TPM на устройстве, он должен быть защищенным.
- edgelet будет взаимодействовать с оборудованием HSM/TPM через двоичный интерфейс приложения C (ABI), поэтому загрузка общих объектов/DLL и вызов функций C должны быть простыми.
Согласно этим пунктам, мы должны были выбрать один из следующих языков программирования: C или C++, или Rust, который компилируется в нативный код. Нежелание нести накладные расходы на сборщик мусора означало, что Go нам не подходит. Требования демона, связанные с безопасностью, означали, что мы хотели избежать ошибок, связанных с памятью и параллелизмом. Как оказалось, с учётом этих ограничений, Rust идеально подходит для нас. В предыдущей публикации (2) на этом блоге [имеется ввиду блог «Microsoft Security Response Center» — прим.перевод], были рассмотрены преимущества при выборе в качестве языка программирования Rust.
Что нам понравилось
Прежде чем мы выпустили Azure IoT Edge в общий доступ, мы привлекли внешнего поставщика средств безопасности для тестирования программного обеспечения на проникновение. Тот факт, что они не обнаружили ни одной проблемы с безопасностью кодовой базы на Rust, было для нас подтверждением правильности нашего выбора. С самого начала мы решили, что компилятор будет обрабатывать все предупреждения как ошибки, включая ошибки, проверенные clippy. Наша система непрерывной интеграции отклоняет пул реквесты, которые не проходят rustfmt, что обеспечило согласованное форматирование кода по всей базе кода.
Процесс обновления компилятора Rust и Cargo [система сборки и управления пакетами — прим. переводчика] работают без проблем в Azure IoT Edge. Обновление до новой версии компилятора — почти всегда безболезненное действие.
Принятие Rust«a
Следующим шагом стало изучение языка. По сравнению с другими популярными языками программирования, у Rust достаточно высокий порог вхождения, и мы опасались того, какое влияние это изучение окажет на сроки проекта. В нашей команде были опытные разработчики на C, C++, C# и Java, и к счастью для нас, также было несколько разработчиков кто были очень увлечены Rust!
Мы придумали практические семинары по Rust, в которых проводили команду по тем частям языка, которые, по нашему опыту, были довольно трудными для понимания. Эти затраты времени оказались весьма полезными. Мы обнаружили, что изучение языка в итоге оказалось не такой большой проблемой, как мы себе представляли.
За 4–6 недель, почти каждый участник команды внес нетривиальный вклад в исходный код на Rust.
Сложности
При том, что наш первый опыт выхода на продакшен с продуктом на базе Rust в Microsoft был полностью удачным, мы отметили бы несколько сложных моментов:
- Экосистема Rust все еще относительно нова по сравнению с некоторыми другими более устоявшимися языками. Это означало, что нам часто приходилось создавать части инфраструктуры, которые в противном случае нам, вероятно, создавать не понадобилось бы.
- Разбор сообщений об ошибках компилятора иногда оказывался слишком сложным, особенно при работе с кодом, в котором интенсивно использовались комбинаторы из Tokio (3) [асинхронный фреймворк для Rust] Futures или std: iter: Iterator.
- Команды, которые привыкли к полной поддержке инструментов для редактирования и отладки C# и Java-кода, не нашли такой же поддержки в Rust. Расширение VS Code Rust RLS было нестабильным на практике.
- Сложность в анализе цепочек Tokio Future
- Иногда было непросто разобраться в сложных типах, которые неизбежно возникают в цепочках Tokio Future комбинаторов
Что дальше
Здесь было бы справедливо отметить, что Azure IoT полностью интегрирован с языком программирования Rust. С тех пор как мы выпустили Azure IoT Edge, использование Rust только увеличилось. Множество проектов облачных сервисов, над которыми сейчас ведется активная работа, пишутся на Rust. Троица, которую предлагает Rust (безопасность памяти, безопасность data race и производительность), идеально подходит для Azure IoT. Надеемся, нам будет что еще сказать об этом в будущем!
Радж Венгалил, главный менеджер SWE, IoT Platform
Ссылки
(1) docs.microsoft.com/ru-ru/azure/iot-edge
(2) msrc-blog.microsoft.com/2019/07/22/why-rust-for-safe-systems-programming
(3) tokio.rs
От переводчика: спасибо за помощь в переводе Legatus88, Funkill, русскоязычной телеграмм группе Rust (@rustlang_ru), КДПВ отсюда.