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 no 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 gerais (ou mesmo impossíveis de instalar se você estiver em um ambiente de hospedagem compartilhada típico), mas aplicativos não triviais ganharão com as filas sistemas e aplicativos grandes são impossíveis sem enfileiramento envolvido.

Antes de começarmos, um aviso: se você já está confortável com os sistemas de filas e deseja comparar as várias opções, as próximas seções introdutórias induzirão um sono maior. 🙂 Portanto, sinta-se à vontade para pular em frente. As seções introdutórias são destinadas àqueles que têm apenas uma ideia vaga de 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 você for a uma bilheteria, por exemplo, perceberá que terá que ficar no final da fila, enquanto a pessoa que estiver no início da fila receberá o ingresso primeiro. Isso é o que também chamamos de fenômeno “primeiro a chegar, primeiro a ser servido”. Em ciência da computação, é possível escrever programas que armazenam suas tarefas como esta 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 um tipo de armazenamento temporário em que as tarefas esperam até serem apanhadas por algo. Se tudo isso soa 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 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 com a ajuda de exemplos:

Processamento em segundo plano

Suponha que você esteja executando uma campanha de marketing de comércio eletrônico em que o tempo é essencial e que seu aplicativo foi criado para enviar 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 inativo, a página da Web simplesmente morrerá, interrompendo 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 trabalho e mostrar ao cliente a página de sucesso.

  Como cancelar minha assinatura do Tinder Gold

Execução paralela

Muitos desenvolvedores, especialmente aqueles que codificam aplicativos mais simples e de baixo tráfego, têm o hábito de usar cron jobs para processamento em segundo plano. Isso é bom até que o tamanho da entrada fique tão grande que não possa ser limpo. Por exemplo, suponha que você tenha um trabalho cron 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 poderá 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) e trabalhar em paralelo para concluir a tarefa muito, muito mais cedo.

Recuperação de falha

Geralmente não pensamos em fracasso como desenvolvedores web. Nós meio que damos como certo que nossos servidores e as APIs que usamos estarão sempre online. Mas a realidade é diferente – interrupções de rede são muito comuns, e as excelentes APIs nas quais você confia podem estar inativas devido a problemas de infraestrutura (antes de dizer “não eu!”, não se esqueça do interrupção massiva do Amazon S3). Então, voltando ao exemplo de relatório, se parte da geração do 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 íngreme à medida que você entra em um domínio totalmente novo, a complexidade de seu aplicativo e implantação aumenta e os trabalhos enfileirados nem sempre podem ser controlados com 100% de precisão. Dito isso, há situações em que a construçã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 back-ends/sistemas de enfileiramento hoje.

Redis

Redis é conhecido como um armazenamento de valor-chave que apenas armazena, atualiza e recupera strings de dados sem conhecimento da estrutura dos dados. Embora isso possa ter sido verdade 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 filas.

As vantagens do Redis são:

  • Banco de dados totalmente na memória, resultando em leitura/gravação mais rápida.
  • 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 ao custo de uma possível perda de dados em caso de falhas ou configurar o modo totalmente conservador para sacrificar o desempenho pela 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 construir um sistema leve. Um exemplo é que o Redis é o backend de fila padrão para o framework Laravel PHP, onde um escalonador foi implementado pelos autores do framework.

  Como renomear pastas em um iPhone ou iPad

Aprendendo Redis é fácil.

Coelho MQ

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

Em primeiro lugar, o RabbitMQ tem uma função mais especializada e bem definida e, portanto, foi criado para refletir isso – mensagens. Ou seja, seu ponto ideal é atuar como intermediário entre dois sistemas, o que não é o caso do Redis, que atua como banco de dados. Como resultado, o RabbitMQ fornece mais alguns recursos que estão faltando no Redis: roteamento de mensagens, novas tentativas, distribuição de carga etc.

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 “submissores” de tarefas podem ser considerados entidades que participam da passagem de mensagens.

RabbitMQ tem as seguintes vantagens:

  • Melhores abstrações para transmissão de mensagens, reduzindo o trabalho no nível do aplicativo se a transmissão de mensagens for o que você precisa.
  • Mais resiliente a falhas e interrupções de energia (do 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 opção quando você sabe que precisa usar a passagem de mensagens assíncrona, mas não está pronto para lidar com a enorme complexidade de algumas das outras opções de fila nesta lista (veja abaixo).

ActiveMQ

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

Aqui é onde o ActiveMQ se destaca:

  • Ele é implementado em Java e, portanto, possui uma integração Java realmente interessante (segue o padrão JMS).
  • Vários protocolos suportados: AMQP, MQTT, STOMP, OpenWire, etc.
  • Lida com segurança, roteamento, expiração de mensagens, análises, etc., pronto para uso.
  • 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 tem 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 é 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 broker e não inclui um backend. Você ainda precisa usar um dos back-ends compatíveis 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 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, o Amazon MQ oferece um serviço gerenciado para fazer isso. Ele oferece suporte a todos os protocolos que o ActiveMQ oferece — 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).

  Como cancelar a associação de envio

Amazon SQS

Não podemos esperar que a Amazon fique quieta 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) pela conhecida gigante AWS. Mais uma vez, diferenças sutis são importantes, portanto, observe que o SQS não possui o conceito de passagem de mensagens. Como o Redis, é um back-end simples para aceitar e distribuir trabalhos em filas.

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

  • Você é um fã da AWS e não vai tocar em mais nada (sinceramente, existem muitas pessoas por aí assim, e acho que não há nada de errado com isso).
  • 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 quer construir um cluster e ter que monitorá-lo você mesmo. Ou pior, ter que construir ferramentas de monitoramento quando você poderia estar usando esse tempo para fazer desenvolvimento produtivo.
  • Você já tem investimentos substanciais na plataforma da AWS e permanecer bloqueado faz sentido para os negócios.
  • Você quer um sistema de enfileiramento simples e focado, sem nenhum dos problemas associados à 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 coisas por conta própria.

Pé de feijão

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

  • É estritamente um sistema de fila de trabalho e nada mais. Você empurra empregos para ele, que são puxados por trabalhadores mais tarde. Portanto, se o 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 é chamado 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 Beanstalkd cria um sistema de fila rápido e ágil para projetos simples que vivem 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 que aconteça, e suas necessidades são simples, vale a pena tentar o Beanstalkd.

Conclusão

Se você leu até aqui (ou chegou aqui lendo superficialmente 😉), há uma boa chance de você estar interessado em sistemas de filas ou precisar de um. Em caso afirmativo, a lista nesta página servirá bem, a menos que você esteja procurando por um sistema de fila específico de idioma/framework.

Eu gostaria de poder lhe dizer que o enfileiramento é simples e 100% confiável, mas não é. É confuso, e já que está tudo em segundo plano e acontecendo muito rápido (os 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! 🙂