Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 5085|Respuesta: 1

[Fuente] Actores virtuales: Dapr vs Orleans

[Copiar enlace]
Publicado en 29/12/2022 14:24:52 | | | |
Durante la última semana, me he aventurado en el desarrollo de software investigando el concepto de actores virtuales. Al final me fijé en dos marcos diferentes: Dapr y Orleans.

Ambos son proyectos muy concisos con un montón de casos de uso interesantes. Ambos utilizan la idea de actores "virtuales". Un actor virtual es una unidad de estado y lógica que:

  • Puede identificarse de forma única por el ID
  • Es de un solo hilo
  • Puede ser en memoria o persistente: su ciclo de vida está gestionado por el framework


Me gusta mucho la idea de los actores virtuales y los encuentro muy útiles para explorar la creación de herramientas escalables y fiables para manejar flujos de trabajo complejos de tareas. Si cada tarea es un participante virtual de un solo hilo, el problema de la condición de raza desaparece.

Como Orleans y Dapr son ambos proyectos de Microsoft, me imagino un día al estilo Western Story en la cafetería de Microsoft.

Orleans

Empecé con Orleans porque llevo tiempo en mi radar después de ver algunos vídeos sobre ella en YouTube. Empezó muy mal porque pensaba que iba a usar la versión 4.x de todos sus paquetes NuGet. Sin embargo, absolutamente ninguna de sus documentaciones funciona con el paquete 4.x. Al final usé la versión 3.6.2.

Granos / Estado / Temporizadores

Crear un grano que rastree su propio estado y realice acciones es muy sencillo. Incluso pude seguir la documentación sobre persistencia de grano y crear mi propia implementación de CosmosDB (API SQL) de IGrainStorage.

Recordatorios

Los recordatorios también son fáciles de configurar. Hasta que intenté configurar la persistencia real para ellos. En este punto de mi investigación, intento mantener todo ordenado y guardar todo en ComsosDB. Desafortunadamente, no consigo que el paquete de recordatorio de persistencia de Orleans funcione en absoluto. Al final tuve que cambiarme al paquete AzureStorage. Así que ahora mis datos están mitad en la cuenta de la API SQL y la mitad en la cuenta de API de tabla.

Arroyos

Ahí fue donde no me fue bien. En Orleans, los flujos se identifican mediante un GUID y un espacio de nombres opcional. Seguro que hay una buena razón por la que los arroyos tienen que identificarse con un GUID, pero vaya, eso es poco práctico.

Estoy muy frustrado con los streams porque podía crearlos fácilmente, pero en cuanto paro y reinicio mi proyecto y activo un nuevo evento, todo se bloquea.

A esto le sigue una información muy valiosa, ya que me llevó 8 horas descifrar el código de Orleans para averiguarlo:

Cuando un grano es suscriptor de stream, debe llamar a ResumeAsync en el handle de suscripción de su método OnActivateAsync, o se bloqueará con un error no reconocido.

También tuve el problema de que la misma suscripción estaba duplicada, así que usé el código para borrar todas las suscripciones del grano y luego lo recreé:


Otros consejos y puntos de Orleans

Streams funciona bien con Azure Event Hubs (a través de AddEventHubStreams).

¡No uses / ni otros caracteres especiales en el nombre Grain de la API SQL de CosmosDB!

Conclusión de Orleans

Me gusta Orleans y creo que tiene potencial. Sin embargo, tiene una curva de aprendizaje muy pronunciada. Debido a mi larga lucha con el streaming, no tengo tiempo para estudiar cómo funcionan los clústeres o los despliegues.

Dapr

Encontré Dapr buscando alternativas a Orleans. Es un poco extraño que también sea un proyecto patrocinado por Microsoft. Quizá estén aquí para adoptar un enfoque de supervivencia del más apto. Si es así, creo que Dapr será un superviviente.

En primer lugar, el diseño basado en REST/gRPC de Dapr permite implementar actores usando cualquier lenguaje de programación. También me resultó trivial ejecutar todo (participantes, estados, temporizadores, recordatorios, eventos) en una sola instancia de Redus. Además, solo me llevó aproximadamente un tercio del tiempo empezar a usar Dapr. Un tiempo de arranque tan rápido se debe a la excelente documentación de Dapr.

Actores / Cronometradores / Recordatorios

¿Acabo de decir que la documentación de Dapr es excelente? Bueno, está en todas partes, excepto en ejemplos de JavaScript. Paso la mayor parte del tiempo en Dapr, intentando averiguar cómo llamar los métodos a los actores. El código para el ejemplo de Dapr Javascript es el siguiente:

Esto está claramente desactualizado. Tuve que pasar mucho tiempo guiando estas tres líneas a través de la exploración de código de prueba/ejemplo de Dapr

Los ejemplos de código para obtener/configurar estados tienen problemas similares, así que creé un problema en GitHub para ellos.

Salvo por esos pequeños problemas, preparar a los actores es pan comido.

Poner temporizadores y recordatorios para mi lanzamiento también es muy sencillo.

Estado

Pude configurar Dapr para que persistiera con Postgres muy fácilmente.

Una cosa que he notado es que puede haber problemas de escalabilidad en cómo se almacenan los recordatorios. Dapr almacena todas las alertas de un tipo específico de participante en un solo array JSON. ¿Qué pasa si alguien tiene un montón de recordatorios?



Otros trucos / consejos de Dapr

Una cosa que noté al navegar por el código del SDK de JavaScript es que no hay muchos comentarios en la base de código. Esto hace que sea casi imposible averiguar algo. Por ejemplo, en el método addOrUpdateState del gestor de estados, hay un tercer parámetro llamado updateValueFactory. Si no hay comentarios en el código, es casi imposible saber para qué es la llamada de regreso.

Tampoco estoy seguro de cuánto me gusta el comando "dapr init" que intenta configurar y ejecutar un contenedor Redis para mí. ¿Y si ya tengo un contenedor de Redis? ¿Y si prefiero usar postgres en su lugar? No encuentro documentación que explique cómo cambiar la función de inicio DAPR.

Una nota para quien tenga problemas usando pubsub. Debes usar "dapr run" para gestionar tanto a tu editor como a tu suscriptor:

Para actores y pubsub, ten en cuenta que es importante usar el parámetro --app-port para que DAPR sepa en qué puerto se está ejecutando tu servicio. Los eventos de pubsub y las llamadas de actores se envían a tu servicio desde el sidecar de Dapr a través de llamadas http, así que necesita saber dónde enviarlas:

Probé un pequeño "clúster" autoalojado de Dapr lanzando mi instancia de suscriptor de pubsub en dos máquinas diferentes de mi red doméstica. ¡Simplemente funcionó!

Conclusión Dapr

Si quieres saber más ideas sobre aplicaciones distribuidas o actores virtuales, te recomiendo que empieces por Dapr. Orleans fue el pionero original, mientras que Dapr fue un reinicio que llevó las cosas al siguiente nivel.

Enlace original:El inicio de sesión del hipervínculo es visible.





Anterior:Ver lectura . Información sobre el contenido del archivo PDB
Próximo:.NET/C# utiliza Redis para implementar el algoritmo de Bloom basado en BitMap
 Propietario| Publicado en 29/12/2022 14:25:28 |
Microsoft Orleans

Orleans es un marco multiplataforma para construir aplicaciones fiables, escalables y distribuidas. Una aplicación distribuida se define como una aplicación que abarca múltiples procesos, a menudo utilizando comunicación entre pares para traspasar los límites del hardware. Orleans escala desde un solo servidor local hasta cientos de aplicaciones distribuidas y altamente disponibles en la nube. Orleans extiende conceptos familiares y modismos C# a entornos multiservidor. Orleans está diseñado para ser elástico y escalable. Cuando un anfitrión se une al clúster, puede aceptar nuevas activaciones. Cuando un host sale del clúster debido a una falla de escalamiento o de ordenador, la activación previa en ese host se reactiva en los hosts restantes según sea necesario. Los cúmulos de Orleans pueden reducirse a un solo huésped. Las mismas propiedades utilizadas para permitir la escala elástica también favorecen la tolerancia a fallos. Los clústeres detectan y se recuperan rápidamente de fallos.

Uno de los principales objetivos de diseño de Orleans es simplificar las complejidades del desarrollo de aplicaciones distribuidas proporcionando un conjunto común de patrones y APIs. Los desarrolladores familiarizados con el desarrollo de aplicaciones de servidor único pueden usar fácilmente Orleans para crear servicios resilientes, escalables y nativos en la nube, así como otras aplicaciones distribuidas. Como resultado, Orleans suele denominarse ".NET distribuido" y es el marco preferido para construir aplicaciones nativas en la nube. Orleans puede ejecutarse en cualquier lugar que soporte .NET. Esto incluye alojarlo en Linux, Windows y macOS. Las aplicaciones de Orleans pueden desplegarse en Kubernetes, máquinas virtuales y servicios PaaS como Azure App Service y Azure Container Apps.

Documentación:https://learn.microsoft.com/zh-cn/dotnet/orleans/overview

Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com