View on GitHub

manual-da-engenharia-para-codar

Este é o manual para compromissos de "código com" a engenharia.

Fundamentos de Dados e DataOps

A maioria dos projetos envolve algum tipo de armazenamento de dados, processamento de dados e DataOps. Para esses projetos, assim como para todos os projetos, seguimos as diretrizes gerais apresentadas em outras seções sobre segurança, testes, observabilidade, CI/CD etc.

Objetivo

O objetivo desta seção é descrever brevemente como aplicar os fundamentos a projetos de dados pesados ou a partes do projeto.

Isolamento

Por favor, tenha cuidado com os níveis de isolamento que você está usando. Mesmo com um banco de dados que oferece serializabilidade, é possível que, dentro de uma transação ou conexão, você esteja usando um nível de isolamento mais baixo do que o banco de dados oferece. Em particular, a leitura não confirmada (ou consistência eventual) pode ter muitos efeitos colaterais imprevisíveis e introduzir bugs difíceis de entender. Sistemas eventualmente consistentes devem ser tratados como último recurso para atender aos requisitos de escalabilidade; o uso de lotes, fragmentação e armazenamento em cache são todas soluções recomendadas para aumentar a escalabilidade. Se nenhuma dessas opções for viável, considere avaliar os bancos de dados “New SQL” como CockroachDB ou TiDB, antes de utilizar uma opção que dependa da consistência eventual.

Existem outros níveis de isolamento, fora dos níveis de isolamento mencionados no link acima. Alguns deles têm nuances diferentes dos 4 principais níveis e podem ser difíceis de comparar. Isolamento de Snapshot, serialização estrita, “ler o próprio escrito”, leituras monotônicas, staleness limitada, consistência causal e linearização são todos outros termos que você pode explorar para aprender mais sobre o assunto.

Controle de Concorrência

Seus sistemas devem (quase sempre) aproveitar alguma forma de controle de concorrência, para garantir a correção entre solicitações concorrentes e evitar corridas de dados. As duas formas de controle de concorrência são pessimista e otimista.

Uma transação pessimista envolve uma primeira solicitação para “bloquear os dados” e uma segunda solicitação para escrever os dados. Entre essas solicitações, nenhuma outra solicitação que acesse esses dados terá sucesso. Consulte 2 Phase Locking (também conhecido como 2 Phase Commit) para obter mais informações.

A abordagem (mais) recomendada é a concorrência otimista, onde um usuário pode ler o objeto em uma versão específica e atualizar o objeto apenas se ele não tiver sido alterado. Isso é normalmente feito via Cabeçalho Etag.

Uma maneira simples de fazer isso no lado do banco de dados é incrementar um número de versão em cada atualização. Isso pode ser feito em uma única instrução executada da seguinte forma:

AVISO: o código abaixo não funcionará quando estiver usando um nível de isolamento igual ou inferior ao “read uncommitted” (consistência eventual).

-- Trate isso como código fictício e ajuste conforme necessário.

UPDATE <nome_da_tabela>
SET campo1 = valor1, ..., campoN = valorN, versao = $nova_versao
WHERE ID = $id AND versao = $versao

Camadas de Dados (Qualidade de Dados)

Desenvolva um entendimento comum da qualidade de seus conjuntos de dados, para que todos entendam a qualidade dos dados, os casos de uso esperados e as limitações.

Um modelo comum de qualidade de dados é Bronze, Silver, Gold

Divida seu data lake em três grandes áreas contendo seus conjuntos de dados Bronze, Silver e Gold.

Nota: Áreas de armazenamento adicionais para dados malformados, dados intermediários (sandbox) e bibliotecas/pacotes/binários também são úteis ao projetar a organização do armazenamento.

Validação de Dados

Valide os dados no início do seu pipeline

Pipelines de Dados Idempotentes

Torne seus pipelines de dados reutilizáveis e idempotentes

e idempotentes, você pode se recuperar desse estado por meio da implantação de correções de código e repetição dos pipelines de dados.

Testes

Garanta que o código de transformação de dados seja testável

CI/CD, Controle de Origem e Revisões de Código

Segurança e Configuração

Observabilidade

Monitore infraestrutura, pipelines e dados

Amostras de Tecnologia de Ponta a Ponta e Azure

O repositório DataOps for the Modern Data Warehouse contém amostras de tecnologia específicas e de ponta a ponta sobre como implementar o DataOps no Azure.

CI/CD Imagem: CI/CD para pipelines de dados no Azure - do repositório DataOps para o Modern Data Warehouse