Os 6 principais sistemas de filas para desenvolvedores de back-end

Você está procurando um sistema de filas? Ou talvez você esteja procurando um melhor? Aqui estão todas as informações que você precisa!


Os sistemas de filas são o segredo mais bem guardado do desenvolvimento de back-end.

Sem tentar escrever um poema em elogio aos sistemas de filas, eu diria que um desenvolvedor de back-end júnior se torna um desenvolvedor de back-end de nível médio depois de aprender a integrar filas no sistema. Filas melhoram a experiência do cliente (veremos como), reduzem a complexidade e melhoram a confiabilidade em um sistema.

Claro, para aplicativos Web muito simples, com tráfego quase zero e sites de folhetos, as filas podem ser gerais (ou mesmo impossíveis de instalar se você estiver em um ambiente típico de hospedagem compartilhada), mas os aplicativos não triviais serão beneficiados com as filas sistemas e aplicativos grandes são impossíveis sem filas envolvidas.

Antes de começarmos, um aviso de isenção de responsabilidade: se você já está familiarizado com os sistemas de filas e deseja comparar as várias opções, as próximas seções introdutórias induzirão um sono profundo. �� Portanto, sinta-se à vontade para pular adiante. As seções introdutórias são para aqueles que têm apenas uma idéia nebulosa de sistemas de filas ou que acabaram de ouvir o nome de passagem.

O que é um sistema de filas?

Vamos começar entendendo o que é uma fila.

Uma fila é uma estrutura de dados em ciência da computação que imita, bem, as filas do mundo real que vemos ao nosso redor. Se você for a um balcão, por exemplo, perceberá que terá que ficar no final da fila, enquanto a pessoa no início da fila receberá o ingresso primeiro. É o que também chamamos de fenômeno “primeiro a chegar, primeiro a ser servido”. Na ciência da computação, é possível escrever programas que armazenam suas tarefas como essa em uma fila, processando-as uma a uma na mesma ordem de chegada.

Observe que a fila não realiza nenhum processamento propriamente dito. É apenas uma espécie de armazenamento temporário, em que as tarefas aguardam até serem apanhadas por alguma coisa. Se tudo isso parecer um pouco abstrato demais, não se preocupe. É um conceito abstrato, mas veremos exemplos claros na próxima seção. ��

Por que você precisa de sistemas de filas?

Sem entrar em uma descrição muito extensa, eu diria que a principal necessidade de sistemas de filas é por causa do processamento em segundo plano, execução paralela e recuperação de falhas. Vamos ver isso com a ajuda de exemplos:

Processamento em background

Suponha que você esteja executando uma campanha de marketing de comércio eletrônico em que o tempo é essencial e que seu aplicativo seja criado para que ele envie um email de confirmação antes do cliente concluir o pagamento e seja exibida a página de agradecimento. Se o servidor de e-mail ao qual você está se conectando estiver inativo, a página da web simplesmente morrerá, rompendo a experiência do usuário.

Imagine o alto número de solicitações de suporte que você receberia! Nesse caso, é melhor enviar esta tarefa de envio de email para uma fila de trabalhos e mostrar ao cliente a página de sucesso.

Execução paralela

Muitos desenvolvedores, especialmente aqueles que codificam aplicativos mais simples e de baixo tráfego, costumam usar tarefas cron para processamento em segundo plano. Isso é bom até que o tamanho da entrada cresça tanto que não possa ser limpo. Por exemplo, suponha que você tenha um trabalho cron que compila relatórios de análise e os envia por e-mail aos usuários e que seu sistema possa processar 100 relatórios por minuto.

Assim que seu aplicativo crescer e começar a receber mais de 100 solicitações por minuto, em média, ele ficará cada vez mais para trás e nunca poderá concluir todos os trabalhos.

Em um sistema de filas, essa situação pode ser evitada com a configuração de vários trabalhadores, que podem escolher um trabalho (contendo 100 relatórios a serem feitos cada) e trabalhar em paralelo para concluir a tarefa muito, muito mais cedo..

Recuperação de falha

Geralmente, não pensamos no fracasso como desenvolvedores da web. Nós assumimos que nossos servidores e as APIs que usamos sempre estarão online. Mas a realidade é diferente – as interrupções de rede são muito comuns e as excelentes APIs nas quais você confia podem estar em falta devido a problemas de infraestrutura (antes de você dizer “não eu!”), Não se esqueça do enorme interrupção do Amazon S3) Então, voltando ao exemplo de relatório, se parte da sua geração de relatórios exigir que você se conecte à API de pagamentos e essa conexão esteja inativa por 2 minutos, o que acontece com os 200 relatórios que falharam?

Os sistemas de enfileiramento envolvem uma sobrecarga considerável, no entanto. A curva de aprendizado é bastante acentuada à medida que você entra em um domínio totalmente novo, a complexidade de seu aplicativo e implantação aumenta e os trabalhos na fila nem sempre podem ser controlados com 100% de precisão. Dito isto, há situações em que a criação de um aplicativo sem filas simplesmente não é possível.

Com isso fora do caminho, vamos dar uma olhada em algumas das opções comuns entre os sistemas / sistemas de filas hoje.

Redis

Redis é conhecido como um armazenamento de valor-chave que apenas armazena, atualiza e recupera cadeias de dados sem o conhecimento da estrutura dos dados. Embora isso possa ter sido verdade anteriormente, hoje o Redis possui estruturas de dados eficientes e altamente úteis, como listas, conjuntos classificados e até um sistema Pub-Sub, tornando-o altamente desejável para implementações de filas.

As vantagens do Redis são:

  • Banco de dados completamente na memória, resultando em leituras / gravações mais rápidas.
  • Altamente eficiente: pode suportar facilmente mais de 100.000 operações de leitura / gravação por segundo.
  • Esquema de persistência altamente flexível. Você pode optar pelo desempenho máximo com o custo de uma possível perda de dados em caso de falhas ou configurar no modo totalmente conservador para sacrificar o desempenho pela consistência.
  • Clusters suportados fora da caixa

Observe que o Redis não possui abstrações de mensagens / enfileiramento / recuperação, portanto, você precisa usar um pacote ou criar um sistema leve. Um exemplo é que Redis é o backend de fila padrão para a estrutura PHP do Laravel, onde um planejador foi implementado pelos autores da estrutura.

Learning Redis é fácil.

RabbitMQ

Existem algumas diferenças sutis entre Redis e RabbitMQ, então vamos tirá-los do caminho primeiro.

Em primeiro lugar, o RabbitMQ tem um papel mais especializado e bem definido, e foi criado para refletir isso – as mensagens. Em outras palavras, seu ponto ideal é atuar como intermediário entre dois sistemas, o que não é o caso da Redis, que atua como um banco de dados. Como resultado, o RabbitMQ fornece mais algumas facilidades ausentes no Redis: roteamento de mensagens, novas tentativas, distribuição de carga, etc..

Se você pensar bem, as filas de tarefas também podem ser pensadas como um sistema de mensagens, em que o planejador, os trabalhadores e os “remetentes” de tarefas podem ser considerados entidades que participam da passagem de mensagens.

RabbitMQ tem as seguintes vantagens:

  • Melhores abstrações para a passagem de mensagens, reduzindo o trabalho no nível do aplicativo se você precisar da passagem de mensagens.
  • Mais resiliente a falhas de energia e interrupções (que Redis, pelo menos por padrão).
  • Suporte de cluster e federação para implantações distribuídas.
  • Ferramentas úteis para gerenciar e monitorar suas implantações.
  • Suporte para praticamente todas as linguagens de programação não triviais disponíveis.
  • Implantação com sua ferramenta de escolha (Docker, Chef, Puppet, etc.).

Quando usar o RabbitMQ? Eu diria que é uma ótima opção quando você sabe que precisa usar a passagem assíncrona de mensagens, mas não está pronto para lidar com a enorme complexidade de algumas das outras opções de fila na lista (veja abaixo).

ActiveMQ

Se você está no espaço corporativo (ou cria um aplicativo altamente distribuído e em grande escala) e não deseja ter que reinventar a roda o tempo todo (e cometer erros ao longo do caminho), ActiveMQ vale uma olhada.

Aqui é onde o ActiveMQ se destaca:

  • Ele é implementado em Java e, portanto, possui uma integração realmente limpa com Java (segue o padrão JMS).
  • Vários protocolos suportados: AMQP, MQTT, STOMP, OpenWire, etc.
  • Lida com a segurança, roteamento, expiração de mensagens, análises, etc., fora da caixa.
  • Suporte integrado para padrões populares de mensagens distribuídas, economizando tempo e erros dispendiosos.

Isso não quer dizer que o ActiveMQ esteja disponível apenas para Java. Ele possui clientes para Python, C / C ++, Node, .Net e outros ecossistemas, portanto não deve haver preocupações com um possível colapso no futuro. Além disso, o ActiveMQ é baseado em padrões completamente abertos e a criação de seus próprios clientes leves deve ser fácil.

Tudo dito e feito, lembre-se de que o ActiveMQ é apenas um corretor e não inclui um back-end. Você ainda precisará usar um dos back-end suportados para armazenar as mensagens. Eu o incluí aqui porque não está vinculado a uma linguagem de programação específica (como outras soluções populares como aipo, Sidekiq etc.)

Amazon MQ

Amazon MQ merece uma menção rápida, mas importante aqui. Se você acha que o ActiveMQ é a solução ideal para suas necessidades, mas não deseja lidar com a construção e a manutenção da infraestrutura, o Amazon MQ oferece um serviço gerenciado para isso. Ele suporta todos os protocolos que o ActiveMQ faz – não há nenhuma diferença nos recursos – já que usa o próprio ActiveMQ sob a superfície.

A vantagem é que é um serviço gerenciado, portanto, você não precisa se preocupar com nada além de usá-lo. Faz ainda mais sentido para as implantações que estão na AWS, pois você pode aproveitar outros serviços e ofertas diretamente de sua implantação (transferências de dados mais rápidas, por exemplo).

Amazon SQS

Não podemos esperar que a Amazon fique quieta quando se trata de peças críticas de infraestrutura, podemos? ��

E então nós temos Amazon SQS, que é um serviço de fila simples e totalmente hospedado (literalmente) pela conhecida gigante AWS. Mais uma vez, diferenças sutis são importantes, portanto, observe que o SQS não tem o conceito de passagem de mensagens. Como Redis, é um back-end simples para aceitar e distribuir trabalhos em filas.

Então, quando você gostaria de usar o Amazon SQS? Aqui estão alguns motivos:

  • Você é um fã da AWS e não toca em mais nada (honestamente, existem muitas pessoas por aí assim, e acho que não há nada de errado nisso).
  • Você precisa de uma solução hospedada para garantir que a taxa de falhas seja zero e que nenhum dos trabalhos seja perdido.
  • Você não deseja criar um cluster e precisa monitorá-lo. Ou pior, é necessário criar ferramentas de monitoramento quando você estiver usando esse tempo para desenvolver desenvolvimento produtivo.
  • Você já possui investimentos substanciais na plataforma da AWS e permanecer preso faz sentido nos negócios.
  • Você deseja um sistema de enfileiramento simples e enfileirado, sem nenhum fluff associado à passagem de mensagens, protocolos e outros enfeites.

Em suma, o Amazon SQS é uma escolha sólida para quem deseja incorporar filas de tarefas em seu sistema e não precisa se preocupar em instalar / monitorar as coisas sozinho.

Beanstalkd

Beanstalkd existe há muito tempo e é um back-end rápido e fácil, testado em batalha, para filas de trabalhos. Existem algumas características do Beanstalkd que o diferenciam consideravelmente do Redis:

  • É estritamente um sistema de fila de trabalhos e nada mais. Você envia trabalhos para ele, que são puxados pelos trabalhadores mais tarde. Portanto, se seu aplicativo tem uma pequena necessidade de passar mensagens, você deve evitar o Beanstalkd.
  • Não há estruturas de dados avançadas, como conjuntos, filas de prioridade, etc..
  • Beanstalkd é o que chamamos de fila Primeiro a entrar, Primeiro a sair (FIFO). Não há como organizar trabalhos por prioridade.
  • Não há opções para armazenamento em cluster.

Tudo isso dito Beanstalkd cria um sistema de fila rápido e liso para projetos simples que vivem em um único servidor. Para muitos, é mais rápido e mais estável que o Redis. Então, se você está tendo problemas com Redis, que você simplesmente não consegue resolver, e suas necessidades são simples, vale a pena tentar o Beanstalkd.

Conclusão

Se você leu até aqui (ou chegou aqui à leitura rápida), há uma boa chance de você estar interessado em sistemas de filas ou precisar de um. Nesse caso, a lista nesta página o servirá bem, a menos que você esteja procurando um sistema de filas específicas ao idioma / estrutura.

Gostaria de poder dizer que a fila é simples e 100% confiável, mas não é. É uma bagunça e, como está tudo em segundo plano e está acontecendo muito rápido (os erros podem passar despercebidos e se tornam muito caros). Ainda assim, as filas são muito necessárias além de um ponto, e você descobrirá que elas são uma arma poderosa (talvez até a mais poderosa) em seu arsenal. Boa sorte! ��

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map