Estruturar microsserviços: Análise do domínioDesigning microservices: Domain analysis

Um dos maiores desafios de microsserviços é definir os limites dos serviços individuais.One of the biggest challenges of microservices is to define the boundaries of individual services. A regra geral é que um serviço deve fazer "algo" — mas colocando essa regra em prática requer atenta.The general rule is that a service should do "one thing" — but putting that rule into practice requires careful thought. Não há nenhum processo mecânico que produzirá o design de "right".There is no mechanical process that will produce the "right" design. Precisa pensar profundamente seu domínio empresarial, requisitos e metas.You have to think deeply about your business domain, requirements, and goals. Caso contrário, pode acabar com um design aleatória que apresenta um algumas características indesejáveis, como dependências ocultas entre os serviços, o acoplamento forte ou mal concebida interfaces.Otherwise, you can end up with a haphazard design that exhibits some undesirable characteristics, such as hidden dependencies between services, tight coupling, or poorly designed interfaces. Neste capítulo, vamos dar uma abordagem condicionada por domínio para a criação de microsserviços.In this chapter, we take a domain-driven approach to designing microservices.

Microsserviços devem ser projetados com capacidades de negócios, camadas não horizontais como acesso a dados ou de mensagens.Microservices should be designed around business capabilities, not horizontal layers such as data access or messaging. Além disso, eles devem ter menos rigidez e uma coesão altamente funcional.In addition, they should have loose coupling and high functional cohesion. Os Microsserviços são menos rígida se pode alterar um serviço sem a necessidade de outros serviços para ser atualizado ao mesmo tempo.Microservices are loosely coupled if you can change one service without requiring other services to be updated at the same time. Um microsserviço é coesa se tem uma finalidade única e bem definida, tais como gerir contas de utilizador ou controlar o histórico de entrega.A microservice is cohesive if it has a single, well-defined purpose, such as managing user accounts or tracking delivery history. Um serviço deve encapsular o conhecimento do domínio e abstrair esse conhecimento dos clientes.A service should encapsulate domain knowledge and abstract that knowledge from clients. Por exemplo, um cliente deve ser capaz de programar um drone sem saber os detalhes do algoritmo de agendamento ou a forma como a frota de drones é gerida.For example, a client should be able to schedule a drone without knowing the details of the scheduling algorithm or how the drone fleet is managed.

Design controlado por domínio (DDD) fornece uma estrutura que pode ajudá-lo a maioria da forma como a um conjunto de microsserviços bem projetados.Domain-driven design (DDD) provides a framework that can get you most of the way to a set of well-designed microservices. O DDD tem dois distintos fases, estratégicas e táticas.DDD has two distinct phases, strategic and tactical. No DDD estratégico, está a definir a estrutura em grande escala do sistema.In strategic DDD, you are defining the large-scale structure of the system. DDD estratégico ajuda a garantir que a sua arquitetura permanece focada nas capacidades de negócios.Strategic DDD helps to ensure that your architecture remains focused on business capabilities. O DDD tático fornece um conjunto de padrões de design que pode usar para criar o modelo de domínio.Tactical DDD provides a set of design patterns that you can use to create the domain model. Estes padrões incluem entidades, os agregados e serviços de domínio.These patterns include entities, aggregates, and domain services. Estes padrões táticas irão ajudá-lo a estruturar microsserviços que sejam menos rígida e coesa.These tactical patterns will help you to design microservices that are both loosely coupled and cohesive.

Diagrama de um processo de design controlado por domínio (DDD)

Este capítulo e a próxima, vamos explicar os passos seguintes, aplicá-las para a aplicação de entrega por Drone:In this chapter and the next, we'll walk through the following steps, applying them to the Drone Delivery application:

  1. Comece por analisar o domínio de negócios para compreender os requisitos funcionais do aplicativo.Start by analyzing the business domain to understand the application's functional requirements. A saída deste passo é uma descrição informal do domínio, que pode ser refinado para um conjunto mais formal de modelos de domínio.The output of this step is an informal description of the domain, which can be refined into a more formal set of domain models.

  2. Em seguida, defina o estagnação contextos do domínio.Next, define the bounded contexts of the domain. Cada contexto vinculado contém um modelo de domínio que representa um subdomínio particular do aplicativo maior.Each bounded context contains a domain model that represents a particular subdomain of the larger application.

  3. Dentro de um contexto vinculado, aplicam-se padrões DDD táticas para definir entidades, os agregados e serviços de domínio.Within a bounded context, apply tactical DDD patterns to define entities, aggregates, and domain services.

  4. Utilize os resultados do passo anterior para identificar os microsserviços em seu aplicativo.Use the results from the previous step to identify the microservices in your application.

Neste capítulo, abordamos os três primeiros passos, que são principalmente preocupados com o DDD.In this chapter, we cover the first three steps, which are primarily concerned with DDD. No capítulo seguinte, identificamos os microsserviços.In the next chapter, we will identify the microservices. No entanto, é importante lembrar-se de que o DDD é um processo iterativo contínuo.However, it's important to remember that DDD is an iterative, ongoing process. Limites de serviço não estão corrigidos inalterável.Service boundaries aren't fixed in stone. À medida que um aplicativo evolui, poderá optar por dividir um serviço em vários serviços mais pequenos.As an application evolves, you may decide to break apart a service into several smaller services.

Nota

Este capítulo não destinado a mostrar uma análise completa e abrangente de domínio.This chapter is not meant to show a complete and comprehensive domain analysis. Deliberadamente mantivemos o exemplo breve, para ilustrar os pontos principais.We deliberately kept the example brief, in order to illustrate the main points. Para obter mais informações sobre DDD, recomendamos que Eric Evans Domain-driven Design, o livro que introduzido pela primeira vez o termo.For more background on DDD, we recommend Eric Evans' Domain-Driven Design, the book that first introduced the term. É outra boa referência Implementing Domain-Driven Design , Vaughn Vernon.Another good reference is Implementing Domain-Driven Design by Vaughn Vernon.

Analisar o domínioAnalyze the domain

Usando uma abordagem DDD ajudará a estruturar microsserviços, para que todos os serviços de formulários um ajuste natural para um requisito comercial funcional.Using a DDD approach will help you to design microservices so that every service forms a natural fit to a functional business requirement. Ele pode ajudar a evitar a armadilha de permitir que os limites organizacionais ou opções de tecnologia ditam seu design.It can help you to avoid the trap of letting organizational boundaries or technology choices dictate your design.

Antes de escrever qualquer código, tem um panorama geral do sistema que está a criar.Before writing any code, you need a bird's eye view of the system that you are creating. O DDD começa com a Modelagem do domínio de negócios e a criação de um modelo de domínio.DDD starts by modeling the business domain and creating a domain model. O modelo de domínio é um modelo abstrato do domínio empresarial.The domain model is an abstract model of the business domain. Seleciona e organiza os dados de conhecimento do domínio e fornece uma linguagem comum para programadores e especialistas de domínio.It distills and organizes domain knowledge, and provides a common language for developers and domain experts.

Comece por mapear todas as funções comerciais e as suas ligações.Start by mapping all of the business functions and their connections. Isso provavelmente será um esforço colaborativo que envolve a especialistas de domínio, arquitetos de software e outras partes interessadas.This will likely be a collaborative effort that involves domain experts, software architects, and other stakeholders. Não precisa de utilizar qualquer formalidade específica.You don't need to use any particular formalism. Criar esboços um diagrama ou basear-se no quadro de comunicações.Sketch a diagram or draw on whiteboard.

Como preencher o diagrama, pode começar a identificar subdomínios discretos.As you fill in the diagram, you may start to identify discrete subdomains. As funções que estão intimamente relacionadas?Which functions are closely related? Que funções são essenciais para a empresa e que fornecem serviços auxiliares?Which functions are core to the business, and which provide ancillary services? O que é o gráfico de dependência?What is the dependency graph? Durante esta fase inicial, não está preocupado com tecnologias ou detalhes de implementação.During this initial phase, you aren't concerned with technologies or implementation details. Dito isso, deve observar o local onde o aplicativo precisará para integrar com sistemas externos, como CRM, processar ou sistemas de faturação de pagamento.That said, you should note the place where the application will need to integrate with external systems, such as CRM, payment processing, or billing systems.

Entrega por drone: Analisar o domínio empresarialDrone Delivery: Analyzing the business domain

Após algumas análises de domínio inicial, a equipa do Fabrikam veio com um esboço aproximado que representa o domínio de entrega por Drone.After some initial domain analysis, the Fabrikam team came up with a rough sketch that depicts the Drone Delivery domain.

Diagrama do domínio de entrega por Drone

  • Envio é colocado no centro do diagrama, uma vez que é essencial para a empresa.Shipping is placed in the center of the diagram, because it's core to the business. Tudo o resto no diagrama existe para ativar esta funcionalidade.Everything else in the diagram exists to enable this functionality.
  • Drone gestão também é essencial para a empresa.Drone management is also core to the business. A funcionalidade que está estritamente relacionada com drone gestão inclui reparação drone e a utilizar Análise Preditiva para prever quando drones precisam de manutenção e a manutenção.Functionality that is closely related to drone management includes drone repair and using predictive analysis to predict when drones need servicing and maintenance.
  • Análise de ETA fornece estimativas de tempo para recolha e de entrega.ETA analysis provides time estimates for pickup and delivery.
  • Transportes de terceiros permitirá que o aplicativo agendar os métodos de transporte alternativo, se um pacote não pode ser fornecido inteiramente por drone.Third-party transportation will enable the application to schedule alternative transportation methods if a package cannot be shipped entirely by drone.
  • Drone partilha é uma extensão possível de negócios essenciais.Drone sharing is a possible extension of the core business. A empresa pode ter a capacidade de drones em excesso durante determinadas horas e pode alugar horizontalmente drones que normalmente estariam inativos.The company may have excess drone capacity during certain hours, and could rent out drones that would otherwise be idle. Esta funcionalidade não estará na versão inicial.This feature will not be in the initial release.
  • Vídeo vigilância é outra área que a empresa pode expandir para mais tarde.Video surveillance is another area that the company might expand into later.
  • Contas de utilizador, Invoicing, e central de atendimento são subdomínios que suportam a atividade principal.User accounts, Invoicing, and Call center are subdomains that support the core business.

Tenha em atenção que neste momento no processo, ainda não fizemos quaisquer decisões sobre a implementação ou tecnologias.Notice that at this point in the process, we haven't made any decisions about implementation or technologies. Alguns dos subsistemas podem envolver a sistemas de software externas ou serviços de terceiros.Some of the subsystems may involve external software systems or third-party services. Mesmo assim, o aplicativo precisa interagir com esses sistemas e serviços, pelo que é importante para incluí-los no modelo de domínio.Even so, the application needs to interact with these systems and services, so it's important to include them in the domain model.

Nota

Quando um aplicativo depende de um sistema externo, existe um risco de que o esquema de dados ou a API do sistema externo vazará na sua aplicação, em última análise, comprometer o projeto de arquitetura.When an application depends on an external system, there is a risk that the external system's data schema or API will leak into your application, ultimately compromising the architectural design. Isso é especialmente verdadeiro com sistemas herdados que não poderão seguir práticas recomendadas modernos e podem utilizar esquemas de dados complexos ou APIs obsoletas.This is particularly true with legacy systems that may not follow modern best practices, and may use convoluted data schemas or obsolete APIs. Nesse caso, é importante ter um limite bem definido entre desses sistemas externos e a aplicação.In that case, it's important to have a well-defined boundary between these external systems and the application. Considere utilizar o padrão de estrangulamento ou o padrão de camada anti-corrupção para esta finalidade.Consider using the Strangler pattern or the Anti-Corruption Layer pattern for this purpose.

Definir os contextos limitadosDefine bounded contexts

O modelo de domínio irão incluir representações dos objetos reais no mundo — utilizadores, drones, pacotes e assim por diante.The domain model will include representations of real things in the world — users, drones, packages, and so forth. Mas isso não significa que todas as partes do sistema tem de utilizar as representações mesmo para as mesmas coisas.But that doesn't mean that every part of the system needs to use the same representations for the same things.

Por exemplo, os subsistemas que lidar com a Análise Preditiva e de reparação do drone precisará representar muitos drones de características físicas, como o respetivo histórico de manutenção, quantidade, idade, número do modelo, características de desempenho e assim por diante.For example, subsystems that handle drone repair and predictive analysis will need to represent many physical characteristics drones, such as their maintenance history, mileage, age, model number, performance characteristics, and so on. Mas quando chegou a hora para agendar uma entrega, não nos interessam essas coisas.But when it's time to schedule a delivery, we don't care about those things. O subsistema de agendamento só precisa de saber se está disponível um drone e ETA para recolha e de entrega.The scheduling subsystem only needs to know whether a drone is available, and the ETA for pickup and delivery.

Se tentar criar um único modelo para ambos estes subsistemas, seria desnecessariamente complexa.If we tried to create a single model for both of these subsystems, it would be unnecessarily complex. Ele também se tornaria mais difícil para o modelo a evoluir ao longo do tempo, uma vez que todas as alterações, serão necessário satisfazer várias equipes, trabalhando em separado subsistemas.It would also become harder for the model to evolve over time, because any changes will need to satisfy multiple teams working on separate subsystems. Portanto, muitas vezes é melhor projetar modelos separados que representam a mesma entidade de mundo real (no caso, um drone) em dois contextos diferentes.Therefore, it's often better to design separate models that represent the same real-world entity (in this case, a drone) in two different contexts. Cada modelo contém apenas os recursos e os atributos que são relevantes no seu contexto específico.Each model contains only the features and attributes that are relevant within its particular context.

É aí que o conceito DDD de estagnação contextos entra em cena.This is where the DDD concept of bounded contexts comes into play. Um contexto vinculado é simplesmente o limite de dentro de um domínio em que se aplica um modelo de domínio específico.A bounded context is simply the boundary within a domain where a particular domain model applies. Analisar o diagrama anterior, pode agrupar funcionalidades, de acordo com se várias funções irão partilhar um modelo de domínio único.Looking at the previous diagram, we can group functionality according to whether various functions will share a single domain model.

Diagrama de contextos limitados

Não são necessariamente isolados uns dos outros contextos limitados.Bounded contexts are not necessarily isolated from one another. Neste diagrama, as linhas sólidas, ligar os contextos vinculados representam lugares onde dois contextos limitados interagem.In this diagram, the solid lines connecting the bounded contexts represent places where two bounded contexts interact. Por exemplo, o envio de depende em contas de utilizador para obter informações sobre os clientes e gestão de Drones para agendar drones da frota.For example, Shipping depends on User Accounts to get information about customers, and on Drone Management to schedule drones from the fleet.

No livro Design controlado por domínio, Eric Evans descreve vários padrões para manter a integridade de um modelo de domínio quando interage com outro contexto vinculado.In the book Domain Driven Design, Eric Evans describes several patterns for maintaining the integrity of a domain model when it interacts with another bounded context. Um dos principais princípios dos microsserviços é que os serviços comunicam através de APIs bem definidas.One of the main principles of microservices is that services communicate through well-defined APIs. Essa abordagem corresponde aos dois padrões que Evans chama aberto de Host de serviço e idioma publicado.This approach corresponds to two patterns that Evans calls Open Host Service and Published Language. A idéia de abrir o serviço de anfitrião é que um subsistema define um protocolo formal (API) para outros subsistemas comunicar com o mesmo.The idea of Open Host Service is that a subsystem defines a formal protocol (API) for other subsystems to communicate with it. Idioma publicado estende essa idéia ao publicar a API de forma que outras equipes podem usar para gravar clientes.Published Language extends this idea by publishing the API in a form that other teams can use to write clients. No capítulo sobre Design de API, discutimos a utilização especificação de OpenAPI (anteriormente conhecida como Swagger) definir a descrição da interface de idioma agnóstico para REST APIs, expresso no formato JSON ou YAML.In the chapter on API Design, we discuss using OpenAPI Specification (formerly known as Swagger) to define language-agnostic interface descriptions for REST APIs, expressed in JSON or YAML format.

Para o restante dessa jornada, nos concentraremos no contexto de envio limitado.For the rest of this journey, we will focus on the Shipping bounded context.

DDD táticoTactical DDD

Durante a fase estratégica de DDD, está mapeando o domínio empresarial e definir vinculadas contextos para seus modelos de domínio.During the strategic phase of DDD, you are mapping out the business domain and defining bounded contexts for your domain models. Tático DDD é quando define os modelos de domínio com mais precisão.Tactical DDD is when you define your domain models with more precision. Os padrões táticos são aplicados dentro de um único contexto vinculado.The tactical patterns are applied within a single bounded context. Numa arquitetura de microsserviços, estamos particularmente interessados na entidade e padrões de agregação.In a microservices architecture, we are particularly interested in the entity and aggregate patterns. Aplicar estes padrões ajudam-na identificar os limites naturais para os serviços em nosso aplicativo (consulte capítulo seguinte).Applying these patterns will help us to identify natural boundaries for the services in our application (see next chapter). Como um princípio geral, um microsserviço deve ser não menor do que uma agregação e não maior do que um contexto vinculado.As a general principle, a microservice should be no smaller than an aggregate, and no larger than a bounded context. Em primeiro lugar, vamos rever os padrões de táticos.First, we'll review the tactical patterns. Em seguida, vamos aplicá-los para o contexto de envio limitado no aplicativo de entrega por Drone.Then we'll apply them to the Shipping bounded context in the Drone Delivery application.

Descrição geral dos padrões táticosOverview of the tactical patterns

Esta seção fornece um breve resumo sobre o DDD tático padrões, por isso, se já estiver familiarizado com o DDD, provavelmente pode ignorar esta secção.This section provides a brief summary of the tactical DDD patterns, so if you are already familiar with DDD, you can probably skip this section. Os padrões são descritos mais detalhadamente nos capítulos 5 – 6 do livro de Eric Evans e no Implementing Domain-Driven Design , Vaughn Vernon.The patterns are described in more detail in chapters 5 – 6 of Eric Evans' book, and in Implementing Domain-Driven Design by Vaughn Vernon.

Diagrama de padrões táticas no design controlado por domínio

Entidades.Entities. Uma entidade é um objeto com uma identidade exclusiva que persiste ao longo do tempo.An entity is an object with a unique identity that persists over time. Por exemplo, num aplicativo bancário, contas e os clientes seria entidades.For example, in a banking application, customers and accounts would be entities.

  • Uma entidade tem um identificador exclusivo no sistema, que pode ser utilizado para procurar ou obter a entidade.An entity has a unique identifier in the system, which can be used to look up or retrieve the entity. Isso não significa que o identificador é sempre exposto diretamente para os usuários.That doesn't mean the identifier is always exposed directly to users. Pode ser um GUID ou uma chave primária numa base de dados.It could be a GUID or a primary key in a database.
  • Uma identidade poderá abranger vários contextos limitados e poderá enfrentar além do tempo de vida do aplicativo.An identity may span multiple bounded contexts, and may endure beyond the lifetime of the application. Por exemplo, números de conta bancária ou emitidos pela government IDs não estão associadas ao tempo de vida de um aplicativo específico.For example, bank account numbers or government-issued IDs are not tied to the lifetime of a particular application.
  • Os atributos de uma entidade podem ser alterados ao longo do tempo.The attributes of an entity may change over time. Por exemplo, pode alterar o nome ou endereço de uma pessoa, mas ainda são a mesma pessoa.For example, a person's name or address might change, but they are still the same person.
  • Uma entidade pode conter referências a outras entidades.An entity can hold references to other entities.

Objetos de valor.Value objects. Um objeto de valor não têm nenhuma identidade.A value object has no identity. Ele é definido apenas pelos valores de seus atributos.It is defined only by the values of its attributes. Objetos de valor também são imutáveis.Value objects are also immutable. Para atualizar um objeto de valor, sempre criar uma nova instância para substituir a antiga.To update a value object, you always create a new instance to replace the old one. Objetos de valor podem ter métodos encapsulam a lógica de domínio, mas esses métodos devem ter sem efeitos colaterais no estado do objeto.Value objects can have methods that encapsulate domain logic, but those methods should have no side-effects on the object's state. Exemplos típicos de objetos de valor incluem as cores, datas e horas e valores de moeda.Typical examples of value objects include colors, dates and times, and currency values.

Agregações.Aggregates. Um agregado define um limite de consistência em torno de uma ou mais entidades.An aggregate defines a consistency boundary around one or more entities. Exatamente uma entidade num agregado é a raiz.Exactly one entity in an aggregate is the root. Pesquisa é feita com o identificador da entidade de raiz.Lookup is done using the root entity's identifier. Quaisquer outras entidades no agregado são filhos de raiz e são referenciadas por ponteiros seguintes da raiz.Any other entities in the aggregate are children of the root, and are referenced by following pointers from the root.

A finalidade de um agregado é modelar as invariáveis transacionais.The purpose of an aggregate is to model transactional invariants. As coisas no mundo real tem webs complexos de relações.Things in the real world have complex webs of relationships. Os clientes criar pedidos, pedidos contenham produtos, produtos têm fornecedores e assim por diante.Customers create orders, orders contain products, products have suppliers, and so on. Se o aplicativo modifica vários objetos relacionados, como ele garante consistência?If the application modifies several related objects, how does it guarantee consistency? Como podemos manter o controle de invariáveis e aplicá-las?How do we keep track of invariants and enforce them?

Os aplicativos tradicionais utilizaram frequentemente transações da base de dados para impor a consistência.Traditional applications have often used database transactions to enforce consistency. Num aplicativo distribuído, no entanto, isso geralmente não é viável.In a distributed application, however, that's often not feasible. Uma transação única empresa poderá abranger vários armazenamentos de dados, ou pode ser de longa execução ou pode envolver a serviços de terceiros.A single business transaction may span multiple data stores, or may be long running, or may involve third-party services. Por fim, cabe ao aplicativo, não é a camada de dados, para impor as constantes necessárias para o domínio.Ultimately it's up to the application, not the data layer, to enforce the invariants required for the domain. Isso é que agregações devem modelar.That's what aggregates are meant to model.

Nota

Um agregado pode consistir numa única entidade, sem entidades subordinadas.An aggregate might consist of a single entity, without child entities. O que faz com que seja um agregado é o limite de transacional.What makes it an aggregate is the transactional boundary.

Serviços de domínio e a aplicação.Domain and application services. Na terminologia do DDD, um serviço é um objeto que implementa algumas lógicas sem manter qualquer Estado.In DDD terminology, a service is an object that implements some logic without holding any state. Evans diferencia dos serviços de domínio, que encapsular a lógica de domínio, e serviços de aplicativos, que proporcionam funcionalidade técnica, como autenticação de utilizador ou enviar um SMS mensagem.Evans distinguishes between domain services, which encapsulate domain logic, and application services, which provide technical functionality, such as user authentication or sending an SMS message. Serviços de domínio, muitas vezes, são utilizados para comportamento de modelo que se estende por várias entidades.Domain services are often used to model behavior that spans multiple entities.

Nota

O termo serviço está sobrecarregado no desenvolvimento de software.The term service is overloaded in software development. Aqui a definição não está diretamente relacionado com microsserviços.The definition here is not directly related to microservices.

Eventos de domínio.Domain events. Eventos de domínio podem ser utilizados para notificar a outras partes do sistema quando algo acontecer.Domain events can be used to notify other parts of the system when something happens. Como o nome sugere, eventos de domínio devem significar algo dentro do domínio.As the name suggests, domain events should mean something within the domain. Por exemplo, a "um registo foi inserido numa tabela" não é um evento de domínio.For example, "a record was inserted into a table" is not a domain event. "Foi cancelada uma entrega" é um evento de domínio."A delivery was cancelled" is a domain event. Eventos de domínio são especialmente relevantes numa arquitetura de microsserviços.Domain events are especially relevant in a microservices architecture. Como microsserviços são distribuídos e não partilham arquivos de dados, os eventos de domínio fornecem uma forma de microsserviços coordenar entre si.Because microservices are distributed and don't share data stores, domain events provide a way for microservices to coordinate with each other. O capítulo comunicação entre serviços aborda as mensagens assíncronas em mais detalhes.The chapter Interservice communication discusses asynchronous messaging in more detail.

Existem alguns outros DDD padrões não listados aqui, incluindo as fábricas de repositórios e módulos.There are a few other DDD patterns not listed here, including factories, repositories, and modules. Estes podem ser úteis padrões para quando estiver a implementar um microsserviço, mas são menos relevantes ao conceber os limites entre microsserviços.These can be useful patterns for when you are implementing a microservice, but they are less relevant when designing the boundaries between microservice.

Entrega por drone: Aplicar os padrões deDrone delivery: Applying the patterns

Começamos com os cenários que o contexto de envio estagnação tem de processar.We start with the scenarios that the Shipping bounded context must handle.

  • Um cliente pode pedir um drone que venha recolher os bens de uma empresa que está registado com o serviço de entrega por drone.A customer can request a drone to pick up goods from a business that is registered with the drone delivery service.
  • O remetente gera uma etiqueta (código de barras ou RFID) para colocar no pacote.The sender generates a tag (barcode or RFID) to put on the package.
  • Um drone será e entrega um pacote na localização de origem para a localização de destino.A drone will pick up and deliver a package from the source location to the destination location.
  • Quando um cliente agenda uma entrega, o sistema fornece um ETA com base nas informações de rota, condições de meteorologia e dados históricos.When a customer schedules a delivery, the system provides an ETA based on route information, weather conditions, and historical data.
  • Quando o drone já em andamento, um utilizador pode controlar a localização atual e a ETA mais recente.When the drone is in flight, a user can track the current location and the latest ETA.
  • Até que um drone tiver escolhido o pacote, o cliente pode cancelar uma entrega.Until a drone has picked up the package, the customer can cancel a delivery.
  • O cliente é notificado quando a entrega é concluída.The customer is notified when the delivery is completed.
  • O remetente pode solicitar a confirmação de entrega de cliente, na forma de uma assinatura ou o dedo impressão.The sender can request delivery confirmation from the customer, in the form of a signature or finger print.
  • Os utilizadores podem pesquisar o histórico de uma entrega concluída.Users can look up the history of a completed delivery.

Destes cenários, a equipe de desenvolvimento identificado o seguinte procedimento entidades.From these scenarios, the development team identified the following entities.

  • EntregaDelivery
  • PacotePackage
  • Por droneDrone
  • ContaAccount
  • ConfirmaçãoConfirmation
  • NotificaçãoNotification
  • EtiquetaTag

Os primeiros quatro, a entrega, pacote, Drone e conta, são todos os agregações que representam os limites de consistência transacional.The first four, Delivery, Package, Drone, and Account, are all aggregates that represent transactional consistency boundaries. Confirmações e notificações são entidades subordinadas de entregas e as etiquetas são entidades subordinadas de pacotes.Confirmations and Notifications are child entities of Deliveries, and Tags are child entities of Packages.

O objetos de valor neste design incluem a localização, ETA, PackageWeight e PackageSize.The value objects in this design include Location, ETA, PackageWeight, and PackageSize.

Para ilustrar, aqui está um diagrama UML da agregação de entrega.To illustrate, here is a UML diagram of the Delivery aggregate. Observe que ele contém referências a outros agregados, incluindo a conta, o pacote e por Drone.Notice that it holds references to other aggregates, including Account, Package, and Drone.

Diagrama UML da agregação de entrega

Existem dois eventos de domínio:There are two domain events:

  • Embora seja um drone em trânsito, a entidade de Drones envia eventos de DroneStatus que descrevem a localização do drone e o estado (em trânsito, acabou de chegar).While a drone is in flight, the Drone entity sends DroneStatus events that describe the drone's location and status (in-flight, landed).

  • A entidade de entrega envia eventos de DeliveryTracking sempre que a fase de uma entrega for alterado.The Delivery entity sends DeliveryTracking events whenever the stage of a delivery changes. Estes incluem DeliveryCreated, DeliveryRescheduled, DeliveryHeadedToDropoff e DeliveryCompleted.These include DeliveryCreated, DeliveryRescheduled, DeliveryHeadedToDropoff, and DeliveryCompleted.

Tenha em atenção que estes eventos descrevem as coisas com significado dentro do modelo de domínio.Notice that these events describe things that are meaningful within the domain model. Eles descrevem algo sobre o domínio e não ficam amarrados a uma construção de linguagem de programação específica.They describe something about the domain, and aren't tied to a particular programming language construct.

A equipe de desenvolvimento identificou uma área de mais de funcionalidade, o que não se ajusta de maneira em qualquer uma das entidades descritas até agora.The development team identified one more area of functionality, which doesn't fit neatly into any of the entities described so far. Alguma parte do sistema deve coordenar todas as etapas envolvidas no agendamento ou atualizar uma entrega.Some part of the system must coordinate all of the steps involved in scheduling or updating a delivery. Por conseguinte, a equipe de desenvolvimento adicionados dois dos serviços de domínio no design: um Scheduler que coordena os passos e um Supervisor que monitoriza o estado de cada passo, para detectar se todos os passos têm falhou ou excedeu o limite. Esta é uma variação do padrão do Supervisor de agente do Scheduler.Therefore, the development team added two domain services to the design: a Scheduler that coordinates the steps, and a Supervisor that monitors the status of each step, in order to detect whether any steps have failed or timed out. This is a variation of the Scheduler Agent Supervisor pattern.

Diagrama do modelo de domínio revisado