O objetivo desta palestra é mostrar como é possível construir uma aplicação baseada na idéia de MonolithFirst e atrasar a decisão de separar em microserviços. A ideia de modular monoliths vem da organização e separação da sua aplicação em módulos ou componentes autônomos que se relacionam entre si, mas estão dentro de uma mesma base de código. Nesta palestra será mostrado como identificar e separar estes módulos, além de um processo que permite extrair um módulo e distribuir como um microserviço.
Modular Monoliths - Como é possível organizar sua aplicação para habilitar uma arquitetura distribuída
1. Globalcode – Open4education
Modular Monoliths
Luiz Costa
gutomcosta@gmail.com / @gutomcosta
Como é possível organizar sua aplicação para habilitar uma arquitetura distribuída
5. A monolithic application is self-contained, and independent
from other computing applications. The design philosophy is
that the application is responsible not just for a particular
task, but can perform every step needed to complete a
particular function.
Wikipedia -Monolithic application
6. A monolithic application is self-contained, and independent
from other computing applications. The design philosophy is
that the application is responsible not just for a particular
task, but can perform every step needed to complete a
particular function.
Wikipedia -Monolithic application
7. A monolithic application is self-contained, and independent
from other computing applications. The design philosophy is
that the application is responsible not just for a particular
task, but can perform every step needed to complete a
particular function.
Wikipedia -Monolithic application
9. …The system is divided into a number of relatively
independent modules with well defined interfaces; each one
is small enough and simple enough to be thoroughly
understood and well programmed…
On the criteria to be used in decomposing systems into modules - David Parnas, 1971
10. …The system is divided into a number of relatively
independent modules with well defined interfaces; each one
is small enough and simple enough to be thoroughly
understood and well programmed…
On the criteria to be used in decomposing systems into modules - David Parnas, 1971
11. …The system is divided into a number of relatively
independent modules with well defined interfaces; each one
is small enough and simple enough to be thoroughly
understood and well programmed…
On the criteria to be used in decomposing systems into modules - David Parnas, 1971
33. Total unification of the domain
model for a large system will
not feasible or cost-effective
“Domain Driven Design, Chapter 14 - Maintaining Model Integrity", pág: 332
Eric Evans - Blue Book
39. Bounded Context
…delimits the applicability of a particular
model so that team members have a clear
and shared understanding of what has to be
consistent and how it relates to other
contexts.
“Domain Driven Design, Chapter 14 - Maintaining Model Integrity", pág: 336
Eric Evans - Blue Book
43. Paciente
Atendimento
+ qual nome, nascimento…?
+ qual dia do agendamento?
+ qual endereço de atendimento?
Paciente
Vacinação
+ como a caderneta de vacinação
está organizada?
+ qual a próxima vacina?
+ qual vacina foi aplicada?
Paciente
Financeiro
+ qual custo das vacinas aplicadas?
+alguma condição de desconto?
+qual meio de pagamento utilizado?
É responsabilidade de cada
contexto modelar os dados da
melhor maneira, de acordo
com a as suas
responsabilidades.
44. Um módulo é a
implementação de um
Bounded Context
52. Todas as regras de negócio são
programadas aqui. Normalmente são
objetos puros, sem relação com
persistência ou infra-estrutura
Expostas
através de
casos de uso
61. Deve permitir o paciente agendar a
aplicação de vacina.
Ao fazer o agendamento deve-se efetuar o
pagamento e reservar o estoque dos
produtos agendados.
User Story
62. User Story
Deve permitir o paciente agendar a
aplicação de vacina.
Ao fazer o agendamento deve-se efetuar o
pagamento e reservar o estoque dos
produtos agendados.
66. O ideal é que um contexto só
exponha objetos de
fronteira. Ex: Use Cases,
Services ou Repositories
Se precisar retornar um
conjunto de dados mais
complexo, dê preferência
para Hashs ou Tuplas
Mantenha o domain model
protegido dentro do
contexto. O ideal é não
deixar “vazar" do contexto
os objetos de domínio
67. public class
Deve se reduzir o número de classes públicas para promover o
encapsulamento
80. Contexto de pagamento como microserviço
O único ponto de contato com o contexto de
pagamento no agendamento, era o objeto de
fronteira Pagamento. Este objeto vai precisar
ser alterado, e ao invés de chamar o contexto
diretamente, vamos introduzir uma service
layer para implementar a chamada remota ao
microserviço de pagamento
O contexto de pagamento foi extraído e
adicionado em uma nova aplicação rails. Foi
necessário expor uma api para disponibilizar o
acesso aos casos de uso. Neste caso,
provavelmente os respositórios deverão ser
alterados para conectar no banco de dados
diferente.
81. Contexto de pagamento como microserviço
O único ponto de contato com o contexto de
pagamento no agendamento, era o objeto de
fronteira Pagamento. Este objeto vai precisar
ser alterado, e ao invés de chamar o contexto
diretamente, vamos introduzir uma service
layer para implementar a chamada remota ao
microserviço de pagamento
O contexto de pagamento foi extraído e
adicionado em uma nova aplicação rails. Foi
necessário expor uma api para disponibilizar o
acesso aos casos de usos. Neste caso,
provavelmente os respositórios deverão ser
alterados para conectar no banco de dados
diferente.
82. Como extrair o contexto de
Gestão de Estoque?
Como lidar com o Domain Event AgendamentoCriado?
84. Contexto de estoque como microserviço
O contexto de agendamento continua
publicando o domain event
AgendamentoCriado da mesma forma que
antes, nada muda aqui.
O Event Handler original é substituído por
outro que public o evento em um Broker de
mensagem. Ex: RabbitMQ, Kafka, ActveMQ
No microserviço de estoque, é necessário
adicionar na ACL, handlers que serão
estimulados pelas mensagens entregues pelo
broker. Estes handlers, delegam a execução
para os caso de uso.
85. Contexto de estoque como microserviço
O contexto de agendamento continua
publicando o domain event
AgendamentoCriado da mesma forma que
antes, nada muda aqui.
O Event Handler original é substituído por
outro que public o evento em um Broker de
mensagem. Ex: RabbitMQ, Kafka, ActveMQ
No microserviço de estoque, é necessário
adicionar na ACL, handlers que serão
estimulados pelas mensagens entregues pelo
broker. Estes handlers, delegam a execução
para os casos de uso.