Conforme anunciado por Matt Harris (evangelista de desenvolvedores no Twitter) no grupo de desenvolvedores do Twitter, a partir das 14 horas (horário de Brasília) do dia 23 (terça-feira), as IDs dos status dos tweets não serão mais sequenciais. Irá entrar em ação um novo serviço de geração de IDs chamado Snowflake.
Para a maioria dos desenvolvedores essas mudanças não serão percebidas e não serão necessárias mudanças nos aplicativos que fazem uso da API do Twitter. Parâmetros com max_id e since_id continuarão funcionando como esperado. No entanto, não será mais possível contar o número de tweets subtraindo um ID do outro.
Alguns pontos-chaves sobre a mudança:
- Os IDs dos status serão únicos;
- Os IDs dos status serão sempre incrementados. Tweets criados a tarde terão ID maior do que aqueles criados de manhã;
- A ordem dos IDs será mantida, permitindo a ordenação por IDs. A precisão da ordenação será de cerca de 1 segundo, o que significa que tweets criados no mesmo segundo não terão nenhuma ordem;
- Todos os métodos existentes na API continuarão funcionando do mesmo jeito de antes;
- Os IDs dos status anteriores permanecerão inalterados;
- Haverá um salto notável no valor numérico dos IDs dos status quando as mudanças ocorrerem.
Snowflake
O serviço Snowflake usa números inteiros de 64 bits sem sinal, que serão gerados com base no tempo. Eles são compostos de um carimbo de tempo, um número de trabalho e um número de sequencia.
Um dos motivos da criação do Snowflake foi que, conforme o Twitter se afasta do banco de dados MySQL em direção ao banco de dados Cassandra, é preciso uma nova maneira para gerar IDs. Isso por que o Cassandra não gera IDs sequencias, e nem deveria.
Alguns dos requisitos do Snowflake são:
- Geração mínima de 10.000 IDs por segundo por processo;
- Taxa de resposta de 2 ms (mais latência da rede);
- Por se tratar de um serviço de alta disponibilidade, as máquinas que geram os IDs não devem ser coordenadas umas com as outras;
- Os IDs devem ter um tamanho de 64 bits.
A solução para atender esses requisitos foi:
- Servidor Thrift (framework para o desenvolvimento de serviços escaláveis em várias linguagens) escrito na linguagem Scala
- IDs compostos de:
- tempo: 41 bits
- ID configurado da máquina: 10 bits (permite o uso de 1024 máquinas)
- número de sequencia: 12 bits (muda a cada 4096 por máquina)
Deve-se usar o protocolo NTP (Network Time Protocol) para manter os relógios das máquinas precisos. Se o relógio da máquina atrasar, por exemplo, o Snowflake irá se recusar a gerar novos IDs enquanto o horário da máquina não for maior que o horário da última vez que um ID foi gerado.
O Snowflake é um software livre sob a Licença Apache, por isso qualquer desenvolvedor pode usá-lo. O código-fonte está disponível no GitHub.
Twitpocalypse
Há algum tempo atrás o Twitter mudou o tamanho dos IDs dos status de inteiros de 32 bits (sem sinal) para inteiros de 64 bits (sem sinal). Isso por que estava próximo o temido Twitpocalypse, que aconteceria quando os IDs dos status atingissem o limite máximo de um número inteiro de 32 bits: 4.294.967.295.
Mas, por enquanto, o Twitpocalypse está longe de acontecer. Isso por que um inteiro de 64 bits (sem sinal) tem um valor máximo de 18.446.744.073.709.551.615. Grande não?