Minimizar coordenaçãoMinimize coordination

Minimizar a coordenação entre os serviços de aplicação para alcançar a escalabilidadeMinimize coordination between application services to achieve scalability

A maioria das aplicações na cloud são compostas por vários serviços de aplicação — front-ends da Web, bases de dados, processos de negócio, relatórios e análises, entre muitos outros.Most cloud applications consist of multiple application services — web front ends, databases, business processes, reporting and analysis, and so on. Para alcançar a escalabilidade e a fiabilidade, cada um desses serviços deve ser executado em várias instâncias.To achieve scalability and reliability, each of those services should run on multiple instances.

O que acontece quando duas instâncias tentam realizar operações simultâneas que afetam um estado partilhado?What happens when two instances try to perform concurrent operations that affect some shared state? Em alguns casos, tem de existir coordenação entre os nós, por exemplo, para preservar as garantias de ACID.In some cases, there must be coordination across nodes, for example to preserve ACID guarantees. Neste diagrama, o Node2 está à espera que o Node1 liberte um bloqueio de base de dados:In this diagram, Node2 is waiting for Node1 to release a database lock:

Diagrama de bloqueio de base de dados

A coordenação limita as vantagens do dimensionamento horizontal e dá origem a estrangulamentos.Coordination limits the benefits of horizontal scale and creates bottlenecks. Neste exemplo, à medida que aumentar a aplicação horizontalmente e adicionar mais instâncias constatará uma maior disputa de bloqueios.In this example, as you scale out the application and add more instances, you'll see increased lock contention. Na pior das hipóteses, as instâncias de front-end irão despender a maior parte do tempo a aguardar pela resposta aos bloqueios.In the worst case, the front-end instances will spend most of their time waiting on locks.

A semântica do tipo "exatamente uma vez" é outro ponto de origem frequente de coordenação."Exactly once" semantics are another frequent source of coordination. Por exemplo, uma encomenda tem de ser processada exatamente uma vez.For example, an order must be processed exactly once. Existem dois trabalhos à escuta cuja função é detetar novas encomendas.Two workers are listening for new orders. Worker1 seleciona uma encomenda para processamento.Worker1 picks up an order for processing. A aplicação tem de garantir que o Worker2 não duplica o processo, mas também tem de assegurar que se o Worker1 falhar, a encomenda não é removida.The application must ensure that Worker2 doesn't duplicate the work, but also if Worker1 crashes, the order isn't dropped.

Diagrama de coordenação

Pode utilizar um padrão como Supervisor do Agente do Scheduler para coordenar os trabalhos, mas neste caso a melhor abordagem será dividir o processo.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. A cada trabalho será atribuído um determinado conjunto de encomendas (por região de faturação, por exemplo).Each worker is assigned a certain range of orders (say, by billing region). Se um dos trabalhos falhar, uma nova instância irá retomar o processo no ponto em que a instância anterior ficou, mas não haverá várias instâncias em disputa.If a worker crashes, a new instance picks up where the previous instance left off, but multiple instances aren't contending.

RecomendaçõesRecommendations

Adote a consistência eventual.Embrace eventual consistency. Quando os dados são distribuídos, é necessário haver coordenação para impor garantias de consistência sólidas.When data is distributed, it takes coordination to enforce strong consistency guarantees. Por exemplo, imagine que uma operação atualiza duas bases de dados.For example, suppose an operation updates two databases. Em vez de utilizar um âmbito de transação única, é preferível que o sistema aplique a consistência eventual, quem sabe através do padrão Transação de Compensação para reverter de uma forma lógica após uma falha.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.

Utilize eventos de domínio para sincronizar o estado.Use domain events to synchronize state. Um evento de domínio é um evento que guarda um registo quando acontece algo de significativo no domínio.A domain event is an event that records when something happens that has significance within the domain. Os serviços interessados podem estar à escuta do evento, em vez de utilizarem uma transação global para coordenar os vários serviços.Interested services can listen for the event, rather than using a global transaction to coordinate across multiple services. Se esta abordagem for utilizada, o sistema tem tolerar a consistência eventual (veja o item anterior).If this approach is used, the system must tolerate eventual consistency (see previous item).

Considere padrões como CQRS e Aprovisionamento de eventos.Consider patterns such as CQRS and event sourcing. Estes dois padrões podem ajudar a reduzir a disputa entre as cargas de trabalho de leitura e as cargas de trabalho de escrita.These two patterns can help to reduce contention between read workloads and write workloads.

  • O padrão CQRS separa as operações de leitura das operações de escrita.The CQRS pattern separates read operations from write operations. Em algumas implementações, os dados de leitura estão fisicamente separados dos dados de escrita.In some implementations, the read data is physically separated from the write data.

  • No padrão Aprovisionamento de Eventos, as alterações de estado são registadas como uma série de eventos num arquivo de dados onde só são feitos acréscimos.In the Event Sourcing pattern, state changes are recorded as a series of events to an append-only data store. Acrescentar um evento ao fluxo é uma operação atómica, que requer um nível de bloqueio mínimo.Appending an event to the stream is an atomic operation, requiring minimal locking.

Estes dois padrões complementam-se.These two patterns complement each other. Se o arquivo só de escrita do CQRS utilizar aprovisionamento de eventos, o arquivo só de leitura pode colocar-se à escuta dos mesmos eventos para criar um instantâneo legível do estado atual, otimizado 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. No entanto, antes de adotar o padrão CQRS ou aprovisionamento de eventos, tenha em atenção os desafios que esta abordagem subentende.Before adopting CQRS or event sourcing, however, be aware of the challenges of this approach.

Dados de partição.Partition data. Evite colocar todos os dados num único esquema de dados partilhado entre vários serviços de aplicação.Avoid putting all of your data into one data schema that is shared across many application services. Este princípio é imposto por uma arquitetura de microsserviços, que faz com que cada serviço seja responsável pelo seu próprio arquivo de dados.A microservices architecture enforces this principle by making each service responsible for its own data store. Dentro de uma única base de dados, a divisão dos dados em partições pode ajudar a melhorar a simultaneidade, já que quando um serviço está a escrever numa partição, isso não afeta outro serviço que esteja a escrever noutra partição.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.

Crie operações idempotentes.Design idempotent operations. Sempre que possível, crie as operações de modo a serem idempotentes.When possible, design operations to be idempotent. Dessa forma, podem ser processadas com a semântica do tipo "pelo menos uma vez".That way, they can be handled using at-least-once semantics. Por exemplo, pode colocar itens de trabalho numa fila.For example, you can put work items on a queue. Se um trabalho falhar a meio de uma operação, o item de trabalho será simplesmente retomado por outro trabalho.If a worker crashes in the middle of an operation, another worker simply picks up the work item.

Utilize o processamento paralelo assíncrono.Use asynchronous parallel processing. Se uma operação precisar de vários passos que são executados de forma assíncrona (como, por exemplo, chamadas de serviço remotas), poderá conseguir chamá-los em paralelo e, em seguida, agregar os 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. Esta abordagem parte do princípio de que cada um dos passos não depende dos resultados do passo anterior.This approach assumes that each step does not depend on the results of the previous step.

Utilize a simultaneidade otimista sempre que possível.Use optimistic concurrency when possible. O controlo de simultaneidade pessimista utiliza bloqueios de base de dados para evitar conflitos.Pessimistic concurrency control uses database locks to prevent conflicts. Isto pode causar um desempenho fraco e reduzir a disponibilidade.This can cause poor performance and reduce availability. Com o controlo de simultaneidade otimista, cada transação modifica um cópia ou um instantâneo dos dados.With optimistic concurrency control, each transaction modifies a copy or snapshot of the data. Quando a transação é consolidada, o motor de base de dados valida a transação e rejeita todas as transações que possam afetar a consistência da base de dados.When the transaction is committed, the database engine validates the transaction and rejects any transactions that would affect database consistency.

A Base de Dados SQL do Azure e o SQL Server suportam a simultaneidade otimista através do isolamento de instantâneos.Azure SQL Database and SQL Server support optimistic concurrency through snapshot isolation. Alguns serviços de armazenamento do Azure suportam a simultaneidade otimista através da utilização de Etags, incluindo o Azure Cosmos DB e o Armazenamento do Azure.Some Azure storage services support optimistic concurrency through the use of Etags, including Azure Cosmos DB and Azure Storage.

Considere utilizar o MapReduce ou outros algoritmos distribuídos paralelos.Consider MapReduce or other parallel, distributed algorithms. Dependendo dos dados e do tipo de trabalho a realizar, poderá dividir o trabalho em tarefas independentes que podem ser feitas por vários nós a trabalhar em 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. Veja Estilo de arquitetura de macrocomputação.See Big compute architecture style.

Utilize a eleição de coordenador para a coordenação.Use leader election for coordination. Nos casos em que precise de coordenar as operações, certifique-se de que o coordenador não se torna no ponto único de falha da aplicação.In cases where you need to coordinate operations, make sure the coordinator does not become a single point of failure in the application. Ao utilizar o padrão Eleição de Coordenador, há uma instância que irá ser sempre o coordenador e agir como coordenador.Using the Leader Election pattern, one instance is the leader at any time, and acts as the coordinator. Se o coordenador falhar, procede-se à eleição de uma nova instância para o papel de coordenador.If the leader fails, a new instance is elected to be the leader.