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

Вид: 5085|Ответ: 1

[Источник] Виртуальные актёры: Dapr против Orleans

[Скопировать ссылку]
Опубликовано 29.12.2022 14:24:52 | | | |
На прошлой неделе я занялся разработкой программного обеспечения, изучая концепцию виртуальных акторов. В итоге я рассмотрел два разных фреймворка: 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 — перезапуском, который вывел всё на новый уровень.

Оригинальная ссылка:Вход по гиперссылке виден.





Предыдущий:Просмотрите чтение. Информация о содержимом файла PDB
Следующий:.NET/C# использует Redis для реализации алгоритма Bloom на основе BitMap
 Хозяин| Опубликовано 29.12.2022 14:25:28 |
Microsoft Orleans

Orleans — это кроссплатформенный фреймворк для создания надёжных, масштабируемых и распределённых приложений. Распределённое приложение определяется как приложение, охватывающее несколько процессов, часто используя одноранговую коммуникацию для преодоления аппаратных границ. Orleans масштабируется от одного локального сервера до сотен распределённых, высокодоступных приложений в облаке. Orleans расширяет знакомые концепции и идиомы C# на мультисерверные среды. Orleans спроектирован быть эластичным и масштабируемым. Когда хост присоединяется к кластеру, он может принимать новые активации. Когда хост выходит из кластера из-за масштабирования или сбоя компьютера, предыдущая активация на этом хоста по мере необходимости реактивируется на оставшихся хостах. Орлеанские кластеры можно масштабировать до одного хозяина. Те же свойства, что используются для обеспечения упругого масштабирования, также обеспечивают отказостойкость. Кластеры автоматически обнаруживают и быстро восстанавливаются после отказа.

Одна из основных целей дизайна Orleans — упростить сложность распределённой разработки приложений, предоставляя общий набор паттернов и API. Разработчики, знакомые с разработкой односерверных приложений, могут легко использовать Orleans для создания устойчивых, масштабируемых, облачных сервисов и других распределённых приложений. В результате Orleans часто называют «распределённым .NET» и является основной основой для создания облачных приложений. Orleans может работать где угодно, где поддерживается .NET. Это включает хостинг на Linux, Windows и macOS. Приложения Orleans могут быть развернуты на Kubernetes, виртуальные машины и PaaS-сервисы, такие как Azure App Service и Azure Container Apps.

Документация:https://learn.microsoft.com/zh-cn/dotnet/orleans/overview

Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com