Dado o serviço A (CMS) que controla um modelo (Produto, vamos assumir os únicos campos que ele possui são id, título, preço) e serviços B (Remessa) e C (E-mails) que precisam exibir um determinado modelo, qual deve ser a abordagem sincronizar as informações de modelo fornecidas nesses serviços na abordagem de fornecimento de eventos? Vamos supor que o catálogo de produtos raramente mude (mas mude) e que haja administradores que possam acessar dados de remessas e e-mails com muita frequência (as funcionalidades de exemplo são: B: display titles of products the order contained
e C display content of email about shipping that is going to be sent
:). Cada um dos serviços possui seu próprio banco de dados.
Solução 1
Envie todas as informações necessárias sobre o produto no evento - isso significa a seguinte estrutura para order_placed
:
{
order_id: [guid],
product: {
id: [guid],
title: 'Foo',
price: 1000
}
}
No serviço B e C, as informações do produto são armazenadas no product
atributo JSON na orders
tabela
Como tal, para exibir as informações necessárias, apenas os dados recuperados do evento são usados
Problemas : dependendo de quais outras informações precisam ser apresentadas em B e C, a quantidade de dados no evento pode aumentar. B e C podem não exigir as mesmas informações sobre o Produto, mas o evento precisará conter os dois (a menos que os separemos em dois). Se dados não estiverem presentes em determinado evento, o código não poderá ser usado - se adicionarmos uma opção de cor a determinado Produto, para pedidos existentes em B e C, o produto será incolor, a menos que atualizemos os eventos e os executemos novamente .
Solução 2
Enviar apenas guia do produto no evento - isso significa a seguinte estrutura para order_placed
:
{
order_id: [guid],
product_id: [guid]
}
Nos serviços B e C, as informações do produto são armazenadas no product_id
atributo na orders
tabela
As informações do produto são recuperadas pelos serviços B e C quando necessário, executando uma chamada de API para o A/product/[guid]
terminal
Problemas : isso torna B e C dependentes de A (o tempo todo). Se o esquema do Produto mudar em A, é necessário fazer alterações em todos os serviços que dependem deles (de repente)
Solução 3
Enviar apenas guia do produto no evento - isso significa a seguinte estrutura para order_placed:
{
order_id: [guid],
product_id: [guid]
}
Nos serviços B e C, as informações do produto são armazenadas na products
tabela; ainda existe product_id
na orders
tabela, mas há replicação de products
dados entre A, B e C; B e C podem conter informações diferentes sobre o Produto e A
As informações do produto são propagadas quando os serviços B e C são criados e atualizados sempre que as informações sobre os Produtos são alteradas, fazendo uma chamada para o A/product
terminal (que exibe as informações necessárias de todos os produtos) ou executando um acesso direto ao DB de A e copiando as informações necessárias do produto necessárias serviço.
Problemas : isso torna B e C dependentes de A (ao semear). Se o esquema do Produto mudar em A, é necessário fazer alterações em todos os serviços que dependem deles (quando propagação)
Pelo meu entendimento, a abordagem correta seria seguir a solução 1 e atualizar o histórico de eventos por determinada lógica (se o catálogo de produtos não mudou e queremos adicionar cores a serem exibidas, podemos atualizar com segurança o histórico para obter o estado atual de Produtos e preencha os dados ausentes nos eventos) ou atenda à inexistência de dados fornecidos (se o catálogo de produtos mudou e queremos adicionar cores a serem exibidas, não podemos ter certeza se naquele momento no passado, dado o produto tinha uma cor ou não - podemos supor que todos os produtos no catálogo anterior eram pretos e atendidos pela atualização de eventos ou código)
updating event history
Não, quero dizer: passar por todos os eventos, copiando-os de um fluxo (v1) para outro fluxo (v2) para manter um esquema de eventos consistente.
display image at the point when purchase was made
) ou não (representar a intenção de display current image as it within catalog
)
updating event history
- No caso, o histórico de eventos é a sua fonte de verdade e nunca deve ser alterada, mas apenas seguir em frente. Se os eventos mudarem, você poderá usar a versão do evento ou soluções semelhantes, mas ao reproduzir seus eventos até um momento específico, o estado dos dados deve estar como estava naquele momento.