Minimizar la coordinaciónMinimize coordination

Minimizar la coordinación entre los servicios de aplicación para lograr escalabilidadMinimize coordination between application services to achieve scalability

La mayoría de las aplicaciones de nube constan de varios servicios de aplicación — servidores web front-end, bases de datos, procesos empresariales, informes y análisis, etc.Most cloud applications consist of multiple application services — web front ends, databases, business processes, reporting and analysis, and so on. Para lograr escalabilidad y confiabilidad, cada uno de esos servicios debe ejecutarse en varias instancias.To achieve scalability and reliability, each of those services should run on multiple instances.

¿Qué sucede cuando dos instancias intentan realizar operaciones simultáneas que afectan a algún estado compartido?What happens when two instances try to perform concurrent operations that affect some shared state? En algunos casos, debe haber coordinación entre los nodos, por ejemplo, para conservar las garantías ACID.In some cases, there must be coordination across nodes, for example to preserve ACID guarantees. En este diagrama, Node2 está esperando a que Node1 libere un bloqueo de base de datos:In this diagram, Node2 is waiting for Node1 to release a database lock:

Diagrama de bloqueo de base de datos

La coordinación limita las ventajas del escalado horizontal y crea cuellos de botella.Coordination limits the benefits of horizontal scale and creates bottlenecks. En este ejemplo, a medida que escala horizontalmente la aplicación y agrega más instancias, verá que aumenta la contención de bloqueo.In this example, as you scale out the application and add more instances, you'll see increased lock contention. En el peor de los casos, las instancias de front-end pasarán la mayor parte del tiempo esperando los bloqueos.In the worst case, the front-end instances will spend most of their time waiting on locks.

La semántica "exactly once" es otro origen frecuente de coordinación."Exactly once" semantics are another frequent source of coordination. Por ejemplo, un pedido debe procesarse exactamente una vez.For example, an order must be processed exactly once. Dos trabajos escuchan nuevos pedidos.Two workers are listening for new orders. Worker1 recoge un pedido para su procesamiento.Worker1 picks up an order for processing. La aplicación debe asegurarse no solo de que Worker2 no duplique el trabajo, sino también de que si Worker1 se bloquea, no se pierda el pedido.The application must ensure that Worker2 doesn't duplicate the work, but also if Worker1 crashes, the order isn't dropped.

Diagrama de coordinación

Aunque puede usar un patrón como Scheduler Agent Supervisor para coordinar los trabajos, en este caso, un enfoque mejor podría ser dividir el trabajo.You can use a pattern such as Scheduler Agent Supervisor to coordinate between the workers, but in this case a better approach might be to partition the work. Cada trabajo se asigna a un intervalo determinado de pedidos (por ejemplo, por región de facturación).Each worker is assigned a certain range of orders (say, by billing region). Si se bloquea un trabajo, una nueva instancia lo retoma donde lo dejó la instancia anterior, pero no compiten varias instancias.If a worker crashes, a new instance picks up where the previous instance left off, but multiple instances aren't contending.

RecomendacionesRecommendations

Adoptar coherencia definitiva.Embrace eventual consistency. Cuando los datos se distribuyen, hace falta coordinación para exigir fuertes garantías de coherencia.When data is distributed, it takes coordination to enforce strong consistency guarantees. Por ejemplo, supongamos que una operación actualiza dos bases de datos.For example, suppose an operation updates two databases. En lugar de colocarla en un único ámbito de transacción, es mejor que el sistema pueda albergar coherencia definitiva, quizás mediante el patrón Compensating Transaction para realizar la reversión de forma lógica después de un error.Instead of putting it into a single transaction scope, it's better if the system can accommodate eventual consistency, perhaps by using the Compensating Transaction pattern to logically roll back after a failure.

Usar eventos de dominio para sincronizar el estado.Use domain events to synchronize state. Un evento de dominio es un evento que se registra cuando sucede algo que tiene importancia dentro del dominio.A domain event is an event that records when something happens that has significance within the domain. Los servicios interesados pueden escuchar el evento, en lugar de usar una transacción global para coordinarlo entre varios servicios.Interested services can listen for the event, rather than using a global transaction to coordinate across multiple services. Si se usa este enfoque, el sistema debe tolerar la coherencia definitiva (consulte el elemento anterior).If this approach is used, the system must tolerate eventual consistency (see previous item).

Considerar patrones como CQRS y Event Sourcing.Consider patterns such as CQRS and event sourcing. Estos dos patrones pueden ayudar a reducir la contención entre las cargas de trabajo de lectura y escritura.These two patterns can help to reduce contention between read workloads and write workloads.

  • El patrón CQRS separa las operaciones de lectura de las de escritura.The CQRS pattern separates read operations from write operations. En algunas implementaciones, los datos de lectura están separados físicamente de los datos de escritura.In some implementations, the read data is physically separated from the write data.

  • En el patrón Event Sourcing, los cambios de estado se registran como una serie de eventos en un almacén de datos de solo anexión.In the Event Sourcing pattern, state changes are recorded as a series of events to an append-only data store. Anexar un evento al flujo es una operación atómica, que requiere un bloqueo mínimo.Appending an event to the stream is an atomic operation, requiring minimal locking.

Estos dos patrones se complementan entre sí.These two patterns complement each other. Si el almacén de solo escritura en CQRS usa Event Sourcing, el almacén de solo lectura puede escuchar los mismos eventos para crear una instantánea legible del estado actual, optimizada para consultas.If the write-only store in CQRS uses event sourcing, the read-only store can listen for the same events to create a readable snapshot of the current state, optimized for queries. Sin embargo, antes de adoptar CQRS o Event Sourcing, debe ser consciente de las dificultades de este enfoque.Before adopting CQRS or event sourcing, however, be aware of the challenges of this approach.

Crear particiones de datos.Partition data. Evite colocar todos los datos en un esquema de datos que se comparta entre muchos servicios de aplicación.Avoid putting all of your data into one data schema that is shared across many application services. En una arquitectura de microservicios se aplica este principio al hacer responsable a cada servicio de su propio almacén de datos.A microservices architecture enforces this principle by making each service responsible for its own data store. Dentro de una única base de datos, la creación de particiones de los datos puede mejorar la simultaneidad, dado que un servicio que escriba en una partición no influye en un servicio que escriba en otra.Within a single database, partitioning the data into shards can improve concurrency, because a service writing to one shard does not affect a service writing to a different shard.

Diseñar operaciones idempotentes.Design idempotent operations. Siempre que sea posible, diseñe operaciones que sean idempotentes.When possible, design operations to be idempotent. De este modo, se pueden administrar mediante la semántica at-least-once.That way, they can be handled using at-least-once semantics. Por ejemplo, puede colocar los elementos de trabajo en una cola.For example, you can put work items on a queue. Si se bloquea un trabajo en medio de una operación, otro trabajo recoge simplemente el elemento de trabajo.If a worker crashes in the middle of an operation, another worker simply picks up the work item.

Usar el procesamiento paralelo asincrónico.Use asynchronous parallel processing. Si una operación requiere que varios pasos se realicen de forma asincrónica (por ejemplo, llamadas al servicio remoto), podría llamarlos en paralelo y, a continuación, agregar los resultados.If an operation requires multiple steps that are performed asynchronously (such as remote service calls), you might be able to call them in parallel, and then aggregate the results. En este enfoque se supone que cada paso no depende de los resultados del paso anterior.This approach assumes that each step does not depend on the results of the previous step.

Usar simultaneidad optimista siempre que sea posible.Use optimistic concurrency when possible. El control de simultaneidad pesimista usa bloqueos de base de datos para evitar conflictos.Pessimistic concurrency control uses database locks to prevent conflicts. Esto puede provocar un rendimiento deficiente y reducir la disponibilidad.This can cause poor performance and reduce availability. Con el control de simultaneidad optimista, cada transacción modifica una copia o instantánea de los datos.With optimistic concurrency control, each transaction modifies a copy or snapshot of the data. Cuando la transacción se confirma, el motor de base de datos la valida y rechaza las transacciones que podrían afectar a la coherencia de la base de datos.When the transaction is committed, the database engine validates the transaction and rejects any transactions that would affect database consistency.

Azure SQL Database y SQL Server admiten la simultaneidad optimista gracias al aislamiento de instantáneas.Azure SQL Database and SQL Server support optimistic concurrency through snapshot isolation. Algunos servicios de almacenamiento de Azure admiten la simultaneidad optimista mediante el uso de valores ETag, como Azure Cosmos DB y Azure Storage.Some Azure storage services support optimistic concurrency through the use of Etags, including Azure Cosmos DB and Azure Storage.

Considerar MapReduce u otros algoritmos distribuidos paralelos.Consider MapReduce or other parallel, distributed algorithms. En función de los datos y el tipo de trabajo que se va a realizar, puede que tenga que dividir el trabajo en tareas independientes que puedan realizar varios nodos que funcionan en paralelo.Depending on the data and type of work to be performed, you may be able to split the work into independent tasks that can be performed by multiple nodes working in parallel. Consulte Estilo de arquitectura Big Compute.See Big compute architecture style.

Usar Leader Election para la coordinación.Use leader election for coordination. En aquellos casos en los que sea necesario coordinar las operaciones, asegúrese de que el coordinador no se convierta en un único punto de error en la aplicación.In cases where you need to coordinate operations, make sure the coordinator does not become a single point of failure in the application. Con el patrón Leader Election, una instancia es la principal en cualquier momento y actúa como coordinador.Using the Leader Election pattern, one instance is the leader at any time, and acts as the coordinator. Si en la principal se produce un error, se elige una nueva instancia como principal.If the leader fails, a new instance is elected to be the leader.