O Apache Kafka é apropriado para ser usado como uma fila de Tarefas?

o Kafka divide as mensagens recebidas em partições, de acordo com a partição atribuída pelo produtor. As mensagens das partições são então consumidas pelos consumidores em diferentes grupos de consumidores.

{[[1]} esta arquitectura faz-me desconfiar de usar o Kafka como uma fila de trabalho/tarefa, porque tenho de especificar a partição no momento da produção, que limita indirectamente quais os consumidores que podem trabalhar nela porque uma partição é enviada a apenas um consumidor num grupo de consumidores. Preferia não o fazer. especificar a partição antes do tempo, de modo que qualquer consumidor está disponível para tomar essa tarefa pode fazê-lo. Existe uma maneira de estruturar partições / produtores em uma arquitetura Kafka onde as tarefas podem ser puxadas pelo próximo consumidor disponível, sem ter que dividir o trabalho antes do tempo, escolhendo uma partição quando o trabalho é produzido?

Usar apenas uma partição para este tópico colocaria todas as tarefas na mesma fila, mas então o número de consumidores é limitado a 1 por grupo de consumidores, por conseguinte, cada consumidor teria de fazer parte de um grupo diferente. Então toda a tarefa é distribuída para cada grupo de consumidores, porém, que não é o tipo de Fila de trabalho que eu estou procurando.

o Apache Kafka é apropriado para ser usado como uma fila de Tarefas?

Author: nephets, 2016-03-24

4 answers

Usar o Kafka para uma fila de Tarefas é uma má ideia. Use RabbitMQ em vez disso, ele faz muito melhor e mais elegantemente.

Embora possa usar o Kafka numa fila de tarefas - irá obter alguns problemas: Kafka não está permitindo consumir uma única partição por muitos consumidores (por design), então se, por exemplo, uma única partição é preenchido com muitas tarefas e o consumidor que possui a partição está ocupado, as tarefas nessa partição vai ficar "fome". Isto significa também que a ordem de consumo de tarefas no tópico não serão idênticos a ordem em que as tarefas foram produzidos, o que pode provocar problemas graves se as tarefas que precisa ser consumida em uma ordem específica (em Kafka para a plena realização que você deve ter apenas um consumidor e uma partição, o que significa que série o consumo de apenas um nó. Se você tem múltiplos consumidores e múltiplas partições a ordem de consumo de tarefas não será garantida no nível tópico).

Na verdade, os tópicos de Kafka não são filas na ciência da computação. Fila significa primeiro na primeira saída-isto não é o que você obtém em Kafka no nível de tópico.

Outra questão é que é difícil mudar o número de partições dinamicamente. A adição ou remoção de novos trabalhadores deve ser dinâmica. Se você quiser garantir que os novos trabalhadores vão obter tarefas em Kakfa você terá que definir o número de partição para o máximo possível de trabalhadores. Isto não é suficientemente elegante.

Então a linha de fundo - use RabbitMQ ou outras filas Sim.

Tendo dito tudo isso-o Samza (pelo linkedin) está a usar o kafka como uma espécie de Fila de tarefas baseada em streaming: Samza

 21
Author: Ofer Eliassaf, 2016-03-31 08:15:43
Eu diria que isso depende da escala. Quantas tarefas você prevê em uma unidade de tempo?

O que você descreve como o seu objectivo final é basicamente como o Kafka funciona por omissão. Quando você produz mensagens, a opção padrão (mais amplamente usada) é usar partitioner aleatório, que escolhe partições na forma de robin redondo, mantendo partições uniformemente usadas (então é possível evitar especificar uma partição).
O principal objectivo das partições é paralelizar o processamento de mensagens, então você deve usá-lo de tal maneira.
Outra "coisa" comumente usada para a qual partições são usadas é garantir que certas mensagens são consumidas na mesma ordem que elas são produzidas (então você especifica chave de particionamento de tal forma que todas essas mensagens terminam na mesma partição. Por exemplo, usar {[[0]} como chave asseguraria que todos os utilizadores são processados de tal forma).

 5
Author: Marko Bonaci, 2016-03-24 20:07:56

Existem dois obstáculos principais na tentativa de usar o Kafka como uma fila de mensagens:

  1. Como descrito na resposta de Ofer , você só pode consumir uma partição de um único consumidor, e a ordem de processamento é garantida apenas dentro de uma partição. Então, se você não pode distribuir as tarefas de forma justa entre partições, isso pode ser um problema

  2. Por padrão, você só pode reconhecer o processamento de todas as mensagens até um determinado ponto (deslocamento). Ao contrário do tradicional filas de mensagens, Você não pode fazer reconhecimento seletivo e em caso de falha, repetições seletivas. Este pode ser o endereço usando kmq , que adiciona capacidade de acks individuais com a ajuda de um tópico adicional (aviso: Eu sou o autor do kmq).

O RabbitMQ é uma alternativa, claro, mas também dá garantias diferentes (mais baixas) de desempenho e replicação. Em resumo, os documentos RabbitMQ afirmam que o corretor não é tolerante à partição. Veja também a nossa comparação de filas de mensagens com replicação de Dados, mqperf .

 2
Author: adamw, 2017-06-27 13:54:12

Há muita discussão neste tópico que gira em torno da ordem de execução de tarefas em uma fila de trabalho ou tarefa. Eu diria que a ordem de execução não deve ser uma característica de uma fila de trabalho.

Uma fila de trabalho é um meio de controlar a utilização dos recursos, aplicando um número controlável de tópicos de trabalhadores para a conclusão de tarefas distintas. Fazer cumprir uma ordem de processamento de tarefas em uma fila significa que você também está executando uma ordem de conclusão de tarefas na fila o que efetivamente significa que as tarefas na fila seriam sempre processadas sequencialmente com a próxima tarefa sendo processada apenas após o fim da tarefa precedente. Isso efetivamente significa que você tem uma única fila de Tarefas roscadas.

Se a ordem de execução é importante em algumas das suas tarefas, então essas tarefas devem adicionar a próxima tarefa na sequência para a fila de trabalho após a sua conclusão. Ou isso ou você suporta um tipo de trabalho sequencial que, quando processado realmente processa uma lista de Tarefas sequencialmente num trabalhador.

De modo algum deve a fila de trabalho realmente Ordenar qualquer um de seus trabalhos - o próximo processador disponível deve sempre tomar a próxima tarefa sem relação com o que ocorreu antes ou depois da tarefa completa.

Eu também estava olhando para kafka como uma base para uma fila de trabalho, mas quanto mais eu pesquisá-lo, menos se parece com a plataforma desejada.

Eu vejo-o a ser usado principalmente como um meio de sincronizar recursos díspares e não tanto como um meio de a executar pedidos de trabalho díspares.

Outra área que eu acho importante em uma fila de trabalho é o Suporte de uma priorização de Tarefas. Por exemplo, se eu tiver 20 tarefas na fila, e uma nova tarefa chegar com uma prioridade maior, eu quero que essa tarefa para saltar para o início da linha a ser pego pelo próximo trabalhador disponível. Kafka não permitiria isso.

 0
Author: Rodney P. Barbati, 2018-05-15 21:47:25