es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Hacer que el servicio de .NET Core se ejecute en múltiples máquinas para garantizar alta disponibilidad, pero que el trabajo sea realizado solamente por un nodo.

Tengo una aplicación de .Net core que consta de algunas tareas en segundo plano (servicios alojados) y APIs web (que controlan y obtienen el estado de esas tareas en segundo plano). Otras aplicaciones (por ejemplo, clientes) se comunican con este servicio a través de estos puntos finales de API web. Queremos que este servicio esté altamente disponible, es decir, si un servicio se bloquea, otra instancia debería comenzar a trabajar automáticamente. Además, las aplicaciones de cliente deben poder cambiar automáticamente al siguiente servicio (los clientes deben llamar a las API de la nueva instancia en lugar de la anterior).

El otro requisito importante es que la tarea (cómputo) que realiza este servicio en segundo plano no puede ser compartida entre dos instancias. Debemos asegurarnos de que solo una instancia realice esta tarea en un momento dado.

Lo que he hecho hasta ahora es ejecutar dos instancias del mismo servicio y utilizar un mecanismo de bloqueo distribuido basado en SQL server (SqlDistributedLock) para adquirir un bloqueo. Si un servicio puede adquirir un bloqueo, continúa y realiza la operación mientras el otro nodo espera para adquirir el bloqueo. Si un servicio se bloquea, el siguiente nodo puede ser capaz de adquirir el bloqueo. En el lado del cliente, he utilizado un mecanismo de reintento basado en Polly para cambiar la URL de llamada al siguiente nodo para encontrar el nodo de trabajo.
Pero este diseño tiene un problema, si el nodo que adquirió el bloqueo pierde la conectividad con el servidor SQL, entonces el segundo servicio logra adquirir el bloqueo y comienza a hacer el trabajo mientras el primer servicio también está en medio de hacer lo mismo.

Creo que necesito algún tipo de elección de líder (parece que lo he hecho mal), ¿alguien puede ayudarme con una mejor solución para este tipo de problema?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución para una aplicación .Net Core altamente disponible con tareas en segundo plano

    Para hacer que la aplicación .Net Core con tareas en segundo plano sea altamente disponible, podemos utilizar un mecanismo de elección de líder para asegurarnos de que solo una instancia de la aplicación realice la tarea en segundo plano a la vez. Una forma de implementar la elección de líder es utilizar un algoritmo de consenso distribuido como Paxos o Raft. Sin embargo, la implementación de estos algoritmos puede ser compleja y llevar mucho tiempo.

    Una solución alternativa es utilizar una biblioteca de elección de líder como Choreo o LeaderElection.Net. Estas bibliotecas proporcionan un mecanismo de elección de líder fácil de usar, tolerante a fallos y escalable.

    Para implementar la solución, podemos seguir los siguientes pasos:

    1. Utilizar Choreo o LeaderElection.Net para elegir a un líder entre las instancias de la aplicación. La instancia líder realizará la tarea en segundo plano, y las otras instancias esperarán hasta que el líder falle o renuncie a su liderazgo.
    2. Utilizar un mecanismo de bloqueo distribuido para evitar que varias instancias adquieran el bloqueo y realicen la tarea en segundo plano simultáneamente. Por ejemplo, podemos utilizar bloqueo basado en Redis (RedLock), bloqueo basado en Azure Blob Storage (DistributedLock.AzureStorage), o un mecanismo de bloqueo basado en base de datos como el SqlDistributedLock utilizado en el diseño actual.

    3. Si el líder falla, el mecanismo de elección de líder elegirá un nuevo líder, y el nuevo líder adquirirá el bloqueo y se hará cargo de la tarea en segundo plano.

    4. En el lado del cliente, utilizar un mecanismo de reintento como Polly para cambiar al punto de conexión de la API web de la nueva instancia líder si el punto de conexión actual no está disponible.

    Con estos pasos, podemos asegurar la alta disponibilidad de la aplicación .Net Core con tareas en segundo plano y evitar que varias instancias realicen la misma tarea simultáneamente.

Comments are closed.