Entre os usuário do RabbitMQ, temos o Instagram, MercadoLibre e Indeed.com. Por ser o mais famoso, iremos ver como funciona a utilização do RabbitMQ pelo Instagram. Em conjunto com Celery, um framework para aplicações distribuídas, o feed the fotos do Instagram é projetado de forma a ser extremamente escalável, sem depender do alto custo proveniente da utilização de sistemas de banco de dados relacionais para prover o serviço de atualização de fotos aos usuários.
O primeiro passo da solução foi a construção de um sistema no Redis, plataforma para contrução de estruturas de armazenamento em cache de pares chave-valor, onde a cada usuário foi associado uma chave chamada media ID e, como valor dessa chave, um feed para o usuário. Assim, assincronamente, os feeds são incrementados de acordo com as publicações realizadas pelas conexões de um usuário. Essa solução, também nomeada de fanout-on-write, é muito bem sucedida para aplicações onde o número de acessos para leitura supera em muito o número de acessos para escrita, caso do Instragram, onde a proporção chega a ser de 100:1. Com essa disparidade e dadas as restrições de custo de acesso de alguns celulares, visto que este é o meio por onde o Instagram é mais utilizado, era essencial que fosse priorizado a minimização do custo de leitura.
Outro fator importante é de que o custo de escrita varia muito com o número de seguidores de um usuário. Por mais que usuários famosos, como jogadores de futebol e artistas, tenham milhares ou até milhões de conexões, é muito mais comum um usuário ter poucas conexões e, com o tratamento de escrita assíncrona, essas operações serão completamente transparentes à eles.
Para isso, foram utilizados o Celery como o gerenciador de tarefas e o RabbitMQ como mecanismo de troca de mensagens. Por ser rápido, eficiente, fácil de manter e extremamente compatível com o Celery, essa foi uma escolha óbvia. O serviço funciona enviando-se uma nova postagem para o servidor do RabbitMQ que, por sua vez, passa a distribuir essa postagem para as threads assíncronas que vão atualizar cada um dos feeds dos usuários utilizando-se do algorítmo de round-robin. Como o RabbitMQ é robusto à falhas, se uma thread falhar, sua postagem será reenviada a uma nova thread para que o usuário não fique sem ser atualizado do post. Em casos de pico de acessos, a solução se torna muito escalável, pois basta se adicionar mais um servidor de RabbitMQ e redirecionar acessos.
A aplicação, então, já conta com 25 mil threads postando cerca de quatro mil postagens por segundo, todas tratadas em torno de dez milisegundos. A solução, por conta do RabbitMQ, foi um sucesso e, já tendo atingido a marca de 10 mil usuários simultaneamente adicionando fotos sem nenhum problema, a equipe de engenheiros do Instagram está confiante de que o RabbitMQ pode suportar muito mais carga sem problemas.O video a seguir mostra os detalhes do projeto.
Esconder/Apresentar Menu