Saurabh Pathak, gerente de engenharia no Twitter, fez uma apresentação sobre a arquitetura de notificações da rede social na conferência QCon London 2017. A apresentação destacou alguns desafios que são únicos no Twitter, como por exemplo a natureza bimodal da rede social, lidando com picos de processamento, e os requisitos para exibir notificações em tempo real.
Pathak explicou que, diferente de uma rede social típica, o Twitter é assimétrico. Alguns usuários podem ter milhões de seguidores, enquanto outros podem ter apenas alguns. Isso torna as notificações uma natureza bimodal, e também cria desafios de como atender todas essas notificações em tempo real. Por exemplo, um Tweet de uma pessoa popular, como uma celebridade, irá gerar muito mais carga do que um tweet de um usuário comum.
Pathah explicou que são essas diferenças de usuários, combinadas com os requisitos de performance rigorosos que apresentam os seguintes desafios de arquitetura:
- Latência: as pessoas devem receber as notificações o quanto antes possível, de acordo com o objetivo do Twitter de informar os usuários sobre o que está acontecendo em tempo real.
- Notificando seguidores: um único Tweet de uma pessoa com milhões de seguidores pode disparar milhões de notificações. O sistema deve ser capaz de lidar com esse grande volume de carga.
- Chamadas heterogêneas: Algumas chamadas internas, como por exemplo as chamadas às camadas de cache, podem levar apenas alguns milissegundos. Por outro lado, chamadas aos serviços externos como o Google podem levar no máximo meio segundo. A forma como esses tipos de chamadas são combinadas devem ser consideradas quando o sistema estiver escalando.
- Múltiplos datacenters: o Twitter deve ser o mais resiliente possível, os usuário devem receber as notificações mesmo em caso de falha.
Antes de encarar estes desafios, as notificações são inicialmente divididas em modelos push ou pull based. A timeline de notificações que as pessoas vêem quando acessam sua conta do Twitter adota o modelo pull, enquanto que SMS e email adotam o modelo push.
Para o model pull, Pathak explicou que as notificações são normalmente acessadas a partir de um cache, porque a renderização da timeline é uma operação muito cara. Por isso o Twitter utilizada o Manhatten, um mecanismo de distribuição em tempo real, e um fork do Redis. Ao utilizar cache, a latência é mínima, fornecendo uma melhor experiência para o usuário. A timeline de notificações também é replicada de forma assíncrona entre os vários data centers, com o objetivo de exibir a mesma timeline para o usuário mesmo em caso de falhas.
Com relação às notificações push, para que ela seja capaz de lidar com a latência e picos de processamento, Pathak explicou que enquanto é entregue um sistema que irá escalar horizontalmente, também é utilizado o recursos de caches de pouca duração. Isto ajuda em situações onde existem milhões de eventos para o mesmo usuário.
Para lidar com chamadas heterogêneas, o Twitter use as filas prioritárias para evitar que chamadas importantes dentro sistema sejam bloqueadas. Dessa forma, uma celebridade twittando algo nunca irá bloquear o login de outra pessoa. Outro detalhe é que tipos de chamadas diferentes são agrupadas em perfis, caso uma dependência do sistema estiver fora do ar, as falhas geralmente são isoladas.
Por fim, Pathak conclui com alguns pontos chaves da arquitetura:
- Prioridade na maioria dos casos para operações assíncronas, porque elas escalam de maneira mais fácil do que operações síncronas.
- Ao fazer o balanceamento no tempo entre operações de escrita e leitura, considerar escrever apenas dados improváveis de se tornarem obsoletos, como por exemplo IDs.
- Desde o início, garantir que a aplicação será capaz de suportar múltiplos data centers.
A apresentação completa pode ser assistida online, seguida de uma apresentação de notificações personalizadas feita por Gary Lam, engenheiro líder no Twitter.