На прошлой неделе я занялся разработкой программного обеспечения, изучая концепцию виртуальных акторов. В итоге я рассмотрел два разных фреймворка: Dapr и Orleans.
Оба проекта очень лаконичны с множеством интересных сценариев использования. Оба используют идею «виртуальных» актёров. Виртуальный актор — это единица состояния и логики, которая:
- Его можно уникально идентифицировать по ID
- Он одинокий
- Может быть в памяти или сохраняться — его жизненный цикл управляется фреймворком
Мне очень нравится идея виртуальных акторов, и они очень полезны в моём исследовании создания масштабируемых и надёжных инструментов для работы со сложными рабочими процессами. Если каждая задача является однопоточным виртуальным участником, проблема условий гонки исчезает.
Поскольку Orleans и Dapr — оба проекта Microsoft, я представляю себе день в стиле Western Story в столовой Microsoft.
Орлеан
Я начал с Орлеана, потому что он уже давно у меня на радаре, после того как увидел несколько видео на YouTube. Началось очень плохо, потому что я думал, что буду использовать 4.x версию всех их пакетов NuGet. Однако ни одна из их документации не работает с пакетом 4.x. В итоге я выбрал версию 3.6.2.
Зерна / Состояние / Таймеры
Создать зерно, отслеживающее своё состояние и выполняющее действия, очень просто. Я даже смог следовать документации по сохранению зерен и создать собственную CosmosDB (SQL API) реализацию IGrainStorage.
Напоминания
Напоминания также легко устанавливать. Пока не попытался настроить для них реальную устойчивость. На данном этапе моего исследования я стараюсь поддерживать порядок и хранить всё в ComsosDB. К сожалению, у меня вообще не получается заставить пакет напоминаний Orleans Persistence. В итоге мне пришлось перейти на пакет AzureStorage. Теперь мои данные наполовину находятся в учетной записи SQL API и наполовину в учетной записи таблицы API.
Потоки
Вот где у меня не получилось. В Орлеане потоки идентифицируются по GUID и необязательному пространству имён. Уверен, есть веская причина, почему потоки должны идентифицироваться по GUID, но, вау, это непрактично.
Меня очень раздражают стримы, потому что я мог легко их создавать, но как только я останавливаюсь, перезапускаю проект и запускаю новое событие, всё вылетает.
За этим следует очень ценная информация: мне понадобилось 8 часов, чтобы разобраться в обратном проектировании Орлеанского кода:
Если grain является абонентом потока, grain должен вызвать ResumeAsync на дескрипторе подписки в методе OnActivateAsync, иначе вы вылетите с нераспознанной ошибкой.
У меня также была проблема с дублированием той же подписки, поэтому я использовал код, чтобы удалить все подписки grain, а потом воссоздал её заново:
Другие орлеанские готчи / советы
Streams хорошо работает с Azure Event Hubs (через AddEventHubStreams).
Не используйте и не добавляйте других особых символов в названии Grain в SQL API CosmosDB!
Орлеанское заключение
Мне нравится Орлеан, и я считаю, что у него есть потенциал. Однако у неё очень крутая кривая обучения. Из-за долгой борьбы со стримингом у меня нет времени изучать, как работают кластеры и развертывания.
Dapr
Я нашёл Dapr, ища альтернативы Орлеану. Странно, что это ещё и проект, спонсируемый Microsoft. Возможно, они здесь, чтобы выбрать подход выжить сильнейшего. Если да, думаю, Dapr будет выжившим.
Во-первых, дизайн Dapr на базе REST/gRPC позволяет реализовывать акторов на любом языке программирования. Мне также было просто запускать всё (участников, статусы, таймеры, напоминания, события) на одном Redis-инстансе. Кроме того, мне понадобилась примерно треть времени, чтобы начать пользоваться Dapr. Такое быстрое время запуска связано с отличной документацией Dapr.
Актёры / Таймеры / Напоминания
Я только что сказал, что документация Dapr отличная? Ну, он повсюду, кроме примеров JavaScript. Большую часть времени я провожу на DAPR, пытаясь понять, как вызывать методы для актёров. Код для примера Dapr Javascript выглядит следующим образом:
Это явно устарело. Мне пришлось потратить много времени на то, чтобы провести эти три строки через тестовое и пробное исследование кода Dapr
Примеры кода для получения и настройки состояния имеют похожие проблемы, поэтому я создал для них проблему на GitHub.
За исключением этих мелких проблем, подготовить актёров — это проще простого.
Устанавливать таймеры и напоминания для моего заклинания тоже очень просто.
Государство
Мне удалось очень легко настроить Dapr так, чтобы он сохранялся с Postgres.
Одно, что я заметил — могут возникать проблемы с масштабируемостью хранения напоминаний. Dapr хранит все оповещения о конкретном типе участника в одном JSON-массиве. Что происходит, если у кого-то слишком много напоминаний?
Другие Dapr Gotcha / Советы
Одно, что я заметил при просмотре кода JavaScript SDK — в коде почти нет комментариев. Из-за этого почти невозможно что-то понять. Например, в методе менеджера штатов addOrUpdateState есть третий параметр под названием updateValueFactory. Если в коде нет комментариев, почти невозможно понять, для чего нужен обратный вызов.
Я также не уверен, насколько мне нравится команда "dapr init", когда я пытаюсь настроить и запустить контейнер Redis для меня. А что если у меня уже есть контейнер Redis? А что если я захочу использовать постгрес вместо этого? Я не могу найти документацию, объясняющую, как изменить функцию init DAP.
Замечание для тех, кто испытывает трудности с использованием pubsub. Вы должны использовать «dapr run» для запуска как издателя, так и подписчика:
Для актёров и pubsub важно использовать параметр --app-port, чтобы DAPR узнала, на каком порте работает ваш сервис. Pubsub-события и actor-вызовы отправляются на ваш сервис из сайдкара Dapr через http-вызовы, поэтому он должен знать, куда их отправлять:
Я протестировал небольшой самостоятельный «кластер» Dapr, запустив свой подписчик pubsub на двух разных машинах в домашней сети. Это просто сработало!
Завершение DAPR
Если хотите узнать больше идей о распределённых приложениях или виртуальных акторах, рекомендую начать с Dapr. Orleans был оригинальным первопроходцем, а Dapr — перезапуском, который вывел всё на новый уровень.
Оригинальная ссылка:Вход по гиперссылке виден.
|