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 elogiando os 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 que aprende a integrar filas ao sistema. As filas melhoram a experiência do cliente (veremos como), reduzem a complexidade e melhoram a confiabilidade de um sistema.

Claro, para aplicativos da web muito simples com tráfego quase zero e sites de folhetos, as filas podem ser um problema geral (ou mesmo impossível de instalar se você estiver em um ambiente de alojamento partilhado ), mas aplicativos não triviais ganharão com sistemas de filas, e aplicativos grandes são impossíveis sem filas envolvidas.

Antes de começarmos, um aviso: 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 irão induzi-lo a um sono profundo. Portanto, sinta-se à vontade para avançar. As seções introdutórias destinam-se àqueles que têm apenas uma vaga ideia dos sistemas de filas ou apenas ouviram 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 for a uma bilheteira, por exemplo, vai reparar que terá de ficar no fim da fila, enquanto quem está no início da fila vai receber o bilhete primeiro. Isso é 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 dessa forma em uma fila, processando-as uma a uma na mesma base de ordem de chegada.

Observe que a fila não faz nenhum processamento real em si. É apenas uma espécie de armazenamento temporário em que as tarefas esperam até serem apanhadas por alguma coisa. Se tudo isso soa um pouco abstrato demais, não se preocupe. Isto é 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 longa, eu diria que a principal necessidade dos sistemas de enfileiramento é devido ao processamento em segundo plano, execução paralela e recuperação de falhas. Vejamos isso com a ajuda de exemplos:

Processamento em segundo plano

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

Imagine o alto número de solicitações de suporte que você receberia! Nesse caso, é melhor enviar essa tarefa de envio de e-mail 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, têm o hábito de 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 cron job que compila relatórios analíticos e os envia por e-mail aos usuários e que seu sistema pode 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 começará a ficar para trás cada vez mais e nunca será capaz de concluir todos os trabalhos.

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

Recuperação de falha

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

No entanto, os sistemas de filas envolvem uma sobrecarga considerável. 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 em fila nem sempre podem ser controlados com 100% de precisão. Dito isso, há situações em que simplesmente não é possível criar um aplicativo sem filas.

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

Redis

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

1675460948 662 Os 6 principais sistemas de filas para desenvolvedores de back end

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 por desempenho máximo ao custo de possível perda de dados em caso de falhas ou configurar em modo totalmente conservador para sacrificar o desempenho por consistência.
  • Clusters com suporte pronto para uso

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 por conta própria. Um exemplo é que o Redis é o back-end de fila padrão para o Laravel Estrutura PHP onde um agendador foi implementado pelos autores da estrutura.

Aprendendo Redis é fácil.

RabbitMQGenericName

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

Em primeiro lugar, RabbitMQGenericName tem uma função mais especializada e bem definida e, portanto, foi criada para refletir isso – mensagens. Em outras palavras, seu ponto ideal é atuar como um intermediário entre dois sistemas, o que não é o caso do Redis, que funciona como um banco de dados. Como resultado, o RabbitMQ fornece mais algumas facilidades que faltam no Redis: roteamento de mensagens, novas tentativas, distribuição de carga, etc.

1675460949 777 Os 6 principais sistemas de filas para desenvolvedores de back end

Se você pensar sobre isso, as filas de tarefas também podem ser consideradas como um sistema de mensagens, onde o agendador, os trabalhadores e os “remetentes” do trabalho podem ser considerados entidades que participam da passagem de mensagens.

RabbitMQ tem as seguintes vantagens:

  • Melhores abstrações para passagem de mensagens, reduzindo o trabalho no nível do aplicativo se a passagem de mensagens for o que você precisa.
  • Mais resiliente a falhas e interrupções de energia (que o 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 existentes.
  • Implantação com sua ferramenta de escolha (Docker, Chef, Puppet, etc.).

Quando usar o RabbitMQ? Eu diria que é uma ótima escolha 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 enfileiramento nesta lista (veja abaixo).

ActiveMQ

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

1675460949 896 Os 6 principais sistemas de filas para desenvolvedores de back end

Aqui é onde o ActiveMQ se destaca:

  • É implementado em Java e, portanto, possui uma integração Java realmente elegante (segue o padrão JMS).
  • Vários protocolos suportados: AMQP, MQTT, STOMP, OpenWire, etc.
  • Lida com segurança, roteamento, expiração de mensagem, análise, etc., fora da caixa.
  • Suporte embutido 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, ActiveMQ é construído em padrões completamente abertos e construir seus próprios clientes leves deve ser fácil.

Tudo isso dito e feito, esteja ciente de que o ActiveMQ é apenas um corretor e não inclui um back-end. Você ainda precisaria usar um dos back-ends suportados para armazenar as mensagens. Incluí-o aqui porque não está vinculado a uma linguagem de programação específica (como outras soluções populares como Celery, 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 quer lidar com a construção e manutenção da infraestrutura por conta própria, Amazon O MQ oferece um serviço gerenciado para fazer isso. Ele suporta todos os protocolos do ActiveMQ — não há nenhuma diferença nos recursos — já que ele usa o próprio ActiveMQ sob a superfície.

A vantagem é que é um serviço gerenciado, então 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 Amazon ficar quieto quando se trata de peças críticas de infraestrutura, podemos?

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

1675460949 616 Os 6 principais sistemas de filas para desenvolvedores de back end

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

  • Você é um fã da AWS e não vai tocar em mais nada (sinceramente, há muitas pessoas assim por aí e acho que não há nada de errado nisso).
  • Você precisa de uma solução hospedada para garantir que a taxa de falha seja zero e que nenhum dos trabalhos seja perdido.
  • Você não deseja criar um cluster e ter que monitorá-lo sozinho. Ou pior, ter que construir ferramentas de monitoramento quando você poderia usar esse tempo para fazer um desenvolvimento produtivo.
  • Você já tem investimentos substanciais na plataforma AWS e manter-se bloqueado faz sentido para os negócios.
  • Você quer um sistema de enfileiramento simples e focado, sem nenhuma complicação associada à passagem de mensagens, protocolos e outros enfeites.

Contudo, Amazon O SQS é uma escolha sólida para qualquer pessoa que queira incorporar filas de trabalho em seu sistema e não ter que se preocupar em instalar/monitorar as coisas por conta própria.

pé de feijão

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

  • É estritamente um sistema de filas de trabalho e nada mais. Você envia trabalhos para ele, que são puxados pelos trabalhadores do trabalho mais tarde. Portanto, se seu aplicativo tiver uma pequena necessidade de passagem de 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 First In, First Out (FIFO). Não há como organizar os trabalhos por prioridade.
  • Não há opções para clustering.

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

Conclusão

Se você leu até aqui (ou leu aqui rapidamente ), há uma boa chance de você estar interessado em sistemas de filas ou precisar de um. Nesse caso, a lista nesta página irá atendê-lo bem, a menos que você esteja procurando por um sistema de fila específico de idioma/framework.

Eu gostaria de poder dizer que o enfileiramento é simples e 100% confiável, mas não é. É confuso, e como tudo está em segundo plano e acontecendo muito rápido (erros podem passar despercebidos e se tornar 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!

Artigos relacionados