Мы используем Scala для написания высокопроизводительных и типобезопасных серверных сервисов с 2015 года. Мы создали стек Scala Tech для Prezi, используя Akka и Future. Мы используем Swagger для определения API каждой службы, который мы используем для создания серверного и клиентского кода. Таким образом, Swagger является единственным источником правды. Написание конечной точки начинается с реализации сгенерированной абстрактной функции, которая дает гарантии на уровне типа в отношении запроса и ответа. Вызов других компонентов также является типобезопасным с использованием сгенерированного клиентского кода.
Аутентификация, безопасность и переключатели функций доступны в виде директив Akka, стандартизированных для всей компании.
Мы в восторге от этого стека. Он удобен в сопровождении, тестируем и надежен.

В 2021 году мы посетили конференцию Functional Scala. С появлением ZIO 2 мы поняли, что в нашем стеке не хватает многих ценных функций. ZIO обещает лучшую производительность, трассировку, компонуемость, тестируемость и отличные возможности для разработчиков. В то же время мы не хотим выбрасывать все приятное, описанное в первой главе.

Хорошо, что нам это не нужно! Мы решили запустить его в производство, переписав некритичный сервис Python на Scala. Мы могли бы легко интегрировать наш существующий стек Scala Tech с ZIO, используя несколько тонких оболочек. Во-первых, мы создали несколько ZLayers для описания наших зависимостей, имея две реализации: одну для тестов и локальной разработки и одну для производства. Эти зависимости используют сгенерированный клиентский код на основе Future. Мы сохранили наши существующие директивы маршрутизации, аутентификации, безопасности и переключения функций на основе Akka, как и раньше, и реализовали только бизнес-логику в ZIO. Посмотрите в действии:

Если запрос был успешным, мы вызываем successfulComplete. В случае ошибки у нас есть собственный тип ошибки, который соответствует ожиданиям нашей платформы, предоставляя правильный код состояния, необязательную причину и протоколирование с желаемой серьезностью. Мы вызываем completeWithError для ответа. Service.list — это чистый ZIO, в котором мы наслаждаемся всеми преимуществами, которые он предоставляет.

На момент написания ZIO 2 еще не был объявлен стабильным. Но это не должно мешать вам его использовать. Использование экспериментальных функций не ново для нашей команды. Мы используем Akka-typed с первых дней его существования. Единственным недостатком были некоторые критические изменения по мере развития библиотеки, но это был небольшой компромисс. Документация по релиз-кандидатам и система типов позволяют легко устранить эти проблемы.

Предоставляя ту же функциональность, мы добились значительного повышения производительности, увеличив показатели p90 с 200 мс до 5 мс. Это достижение языка и способность распознавать шаблоны использования. Когда вы избавляетесь от шаблонов и шума с помощью ZIO, становится ясно, как вы можете улучшить громоздкие части своей бизнес-логики. Теперь мы можем использовать Memcached практически для любой комбинации, которую могут запросить наши пользователи.

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

Первоначально я думал, что сделать эту интеграцию будет гораздо более уродливой задачей. Цитата из Сиономикона Джона Де Гуса и Адама Фрейзера, книги, которую я недавно прочитал, из главы 5 Интеграция с ZIO:

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

Эта глава подтолкнула меня к такому виду частичной интеграции и к тому, что это будет полезно. Книга не ошиблась.

Узнайте больше о ZIO на zio.dev и посетите prezi.com/jobs, если вы хотите работать с нами.