Exatamente uma vez NÃO é exatamente o mesmo: análise do artigo

1. Introdução


Decidi analisar um artigo descrevendo alguns detalhes interessantes do processamento de streaming exatamente uma vez: exatamente uma vez . O fato é que alguns autores entendem os termos de maneira muito estranha. A análise do artigo nos permitirá esclarecer muitos detalhes mais profundamente, porque A identificação de inconsistências e esquisitices permite que você experimente mais plenamente os conceitos e significados.


Vamos começar.


Análise


Tudo começa muito bem:


O processamento do fluxo de eventos distribuídos se tornou um tópico cada vez mais popular na área de Big Data. Os Notáveis ​​Stream Processing Engines (SPEs) incluem Apache Storm, Apache Flink, Heron, Apache Kafka (Kafka Streams) e Apache Spark (Spark Streaming). Um dos recursos mais notáveis ​​e amplamente discutidos das SPEs é a semântica de processamento, com “exatamente uma vez” sendo uma das mais procuradas e muitas SPEs alegando fornecer semântica de processamento “exatamente uma vez”.

Ou seja, o processamento de dados é extremamente importante etc., e o tópico em discussão é exatamente uma vez. Vamos discutir isso.


Existe muito mal-entendido e ambiguidade, no entanto, cercando o que exatamente "exatamente uma vez" é, o que isso implica e o que realmente significa quando SPEs individuais afirmam fornecê-lo.

De fato, é muito importante entender o que é. Para fazer isso, seria bom fornecer a definição correta antes de um longo raciocínio. E quem sou eu para dar conselhos tão malditamente sólidos?


Discutirei como a semântica de processamento “exatamente uma vez” difere em muitas SPEs populares e por que “exatamente uma vez” pode ser melhor descrito como efetivamente uma vez

Inventar novos termos é, obviamente, uma tarefa importante. Eu mesmo amo essa coisa. Apenas para isso, é necessária justificativa. Vamos tentar encontrá-lo.


Não descreverei as coisas óbvias como gráficos de processamento direcionado e assim por diante. Os leitores podem ler o artigo original por conta própria. Além disso, a análise desses detalhes é irrelevante. Vou dar apenas uma foto:



A seguir, há uma descrição da semântica:


  • No máximo uma vez, ou seja, não mais que uma vez. Com a aparente obviedade, esse comportamento é extremamente difícil de garantir em cenários de limites, como falhas, interrupção da conectividade de rede e muito mais. Mas para o autor tudo é simples:


  • Pelo menos uma vez, ou seja, pelo menos uma vez. O esquema é mais complexo. E o rake pode ser coletado mais:


  • Exatamente uma vez. O que é exatamente uma vez?

Os eventos são garantidos para serem processados ​​"exatamente uma vez" por todos os operadores no aplicativo de fluxo, mesmo no caso de várias falhas.

I.e. a garantia do processamento exatamente uma vez é quando o processamento "exatamente uma vez" ocorreu.


Sente o poder da determinação? Para reformular: processar uma vez é quando o processamento ocorre "uma vez". Bem, sim, também diz que essa garantia deve ser preservada em caso de falhas. Mas para sistemas distribuídos, isso é uma coisa óbvia. E as aspas sugerem que algo está errado aqui. Definir com aspas sem explicar o que isso significa é um sinal de uma abordagem profunda e ponderada.


A seguir, é apresentada uma descrição de como implementar essa semântica. E aqui gostaria de me debruçar com mais detalhes.


Dois mecanismos populares são normalmente usados ​​para obter semântica de processamento "exatamente uma vez".
  1. Ponto de verificação distribuído de instantâneo / estado
  2. Entrega de evento pelo menos uma vez mais desduplicação de mensagem

Se o primeiro mecanismo referente a instantâneos e pontos de verificação não levanta questões, bem, exceto por alguns detalhes, como eficiência, existem pequenos problemas com o segundo que o autor ignorou.


Por alguma razão, entende-se que um manipulador só pode ser determinístico. No caso de um manipulador não determinístico, cada reinicialização subsequente fornecerá, de modo geral, outros valores e estados de saída, o que significa que a desduplicação não funcionará, porque os valores de saída serão diferentes. Assim, o mecanismo geral será muito mais complicado do que o descrito no artigo. Ou, francamente, esse mecanismo está incorreto.


No entanto, passamos ao mais delicioso:


É exatamente uma vez realmente exatamente uma vez?



Agora, vamos reexaminar o que a semântica de processamento "exatamente uma vez" realmente garante ao usuário final. O rótulo "exatamente uma vez" é enganoso ao descrever o que é feito exatamente uma vez.

Dizem que é hora de reconsiderar esse conceito, pois existem algumas inconsistências.


Alguns podem pensar que "exatamente uma vez" descreve a garantia para o processamento de eventos em que cada evento no fluxo é processado apenas uma vez. Na realidade, não há SPE que possa garantir o processamento exatamente uma vez. Garantir que a lógica definida pelo usuário em cada operador seja executada apenas uma vez por evento é impossível diante de falhas arbitrárias, porque a execução parcial do código do usuário é uma possibilidade sempre presente.

Caro autor, vale lembrar como os processadores modernos funcionam. Cada processador em processamento executa um grande número de estágios paralelos. Além disso, existem ramificações nas quais o processador começa a executar as ações erradas se o preditor de ramificação estiver errado. Nesse caso, as ações são revertidas. Assim, o processador pode executar o mesmo trecho de código duas vezes, mesmo que nenhuma falha tenha ocorrido!


O leitor atento exclama imediatamente: porque o escape é importante, e não como é realizado. Exatamente! O que importa é o que aconteceu como resultado, não como realmente aconteceu. Se o resultado é como se tivesse acontecido exatamente uma vez, isso significa que aconteceu exatamente uma vez. Não encontra? E todo o resto é casca, irrelevante. Os sistemas são complexos e as abstrações resultantes criam apenas a ilusão de execução de uma certa maneira. Parece-nos que o código é executado seqüencialmente, instrução por instrução, que lê primeiro, depois escreve e depois uma nova instrução. Mas não é assim, tudo é muito mais complicado. E a essência das abstrações corretas é manter a ilusão de garantias simples e compreensíveis, sem se aprofundar a cada vez, quando você precisar atribuir valores a uma variável.


E apenas o problema deste artigo está no fato de que exatamente uma vez é uma abstração que permite criar aplicativos sem pensar em duplicatas e valores perdidos. Que tudo ficará bem, mesmo em caso de queda. E não há necessidade de inventar novos termos para isso.


O código de exemplo no artigo demonstra claramente uma falta de entendimento de como escrever manipuladores:


Map (Event event) { Print "Event ID: " + event.getId() Return event } 

O leitor é convidado a reescrever o código de forma independente, para não repetir os erros do autor do artigo.


Então, o que as SPEs garantem quando afirmam semântica de processamento "exatamente uma vez"? Se não for possível garantir que a lógica do usuário seja executada exatamente uma vez, o que é executado exatamente uma vez? Quando os SPEs reivindicam a semântica de processamento "exatamente uma vez", o que eles realmente estão dizendo é que eles podem garantir que as atualizações do estado gerenciado pelo SPE sejam confirmadas apenas uma vez em um armazenamento de back-end durável.

O usuário não precisa de uma garantia da execução física do código. Sabendo como o processador funciona, é fácil concluir que isso não é possível. O principal é a execução lógica exatamente uma vez, como se não houvesse falhas. Atrair os conceitos de "comprometer-se com o data warehouse" apenas agrava a falta de compreensão do autor sobre coisas básicas, porque existem implementações dessa semântica sem a necessidade de confirmação.


Para obter mais informações, você pode ler brevemente meu artigo: Processamento de dados competitivo heterogêneo em tempo real, estritamente uma vez .


Em outras palavras, o processamento de um evento pode ocorrer mais de uma vez, mas o efeito desse processamento é refletido apenas uma vez no armazenamento de estado de back-end durável.

A existência de um "armazenamento de estado de back-end durável" para o usuário é absolutamente violeta. Somente o efeito do processamento é importante, ou seja, consistência e valores de saída em todo o período de processamento de dados de streaming. Vale ressaltar que, para algumas tarefas, não é necessário ter um armazenamento de estado de back-end durável e seria bom garantir exatamente uma vez.


Aqui na Streamlio, decidimos que efetivamente, uma vez é o melhor termo para descrever essas semânticas de processamento.

Um exemplo típico de entrada estúpida de conceitos: escreveremos alguns exemplos e argumentos longos para um parágrafo inteiro e, no final, adicionaremos que "definimos esse conceito". A precisão e a clareza das definições causam uma resposta emocional verdadeiramente vívida.


Conclusões


A incompreensão da essência das abstrações leva a uma distorção do significado original dos conceitos existentes e à subsequente criação de novos termos a partir do zero.


[1] Exatamente uma vez NÃO é exatamente o mesmo .
[2] Processamento de dados competitivo heterogêneo em tempo real estritamente uma vez .

Source: https://habr.com/ru/post/pt419935/


All Articles