Pergunta

Eu só vi o hilário "The Rise e queda de Twitter " que me fez pensar:

Se você reimplemented twitter, o que você faria diferente?

Que tecnologias você usaria? Que idiomas?

Como você garante que o serviço é escalável?

O que mais você mudaria?

Foi útil?

Solução

Eu teria implementado no GAE, assim:

Cada usuário terá uma tabela contendo os tweets das pessoas que eles seguem. Esta tabela será digitado pelo (usuário, timestamp descendente).

Cada utilizador tem também uma mesa follower_ranges, que mapeia um utilizador para um conjunto de intervalos seguidor id contíguos. Para a maioria dos utilizadores, que têm apenas alguns milhares de seguidores esta tabela terá uma única entrada (inf .. + inf); este será o padrão implícito. Para usuários com mais seguidores, cada faixa na tabela terá alguns milhares de usuários. Os intervalos serão em relação ao longo do tempo para manter o número de utilizadores em cada um dentro de um intervalo, por exemplo, maior do que 1000, menor do que 10000. A união de todas as faixas incluirá todos os IDs de usuário.

Sempre que um utilizador - operação seguidor> é criado, é codificado como uma acção e adicionado a uma fila. Cada elemento na fila é um (remetente, medidas, capacidade de carga, subintervalo seguidor) tuplo. trabalhadores de fila ter um item, encontrar todos os seguidores no subrange dado, e aplicar a ação para cada um deles. (Note-se que a ação pode ser "adicionar um tweet", "excluir um tweet," "editar um tweet", etc. Basicamente, qualquer coisa que terá de ser aplicado a todos os seguidores.)

Aplicando a ação fila para cada seguidor envolverá emissão das gravações correspondentes e exclusões para a tabela tweet de cada usuário. A barreira da fila significa que as gravações não aparecerá instantaneamente, mas deve possível manter o atraso abaixo alguns segundos.

Mostrando o usuário seus tweets será uma operação barata: "SELECT * FROM os tweets ONDE user_id =: ORDER BY user_id (created_at DESC) LIMITE: max_per_page". Isto irá pesquisar uma única tabela, e ser uma operação muito rápida. (User-bloqueando Manter latência para baixo é bom!)

Eu acho que este projeto iria reduzir bastante bem inicialmente. Cada componente do sistema agora podem ser ampliados facilmente:

  • O armazenamento de filas pode ser apoiado por GAE, e dimensionada de acordo com qualquer armazenamento de dados tabela
  • As interfaces podem ser escalados, naturalmente, e não há necessidade de stickyness
  • Mais processadores de fila podem ser adicionados a qualquer momento
  • As tabelas de armazenamento real vai crescer naturalmente, e deve escalar bem no armazenamento de dados.

Dito isso, eu posso pensar de um casal melhorias futuras Gostaria de olhar para imediatamente:

  • Reduzir o armazenamento de dados raramente mostradas. Este projeto desnormaliza cada tweet em uma cópia per-seguidor. No entanto apenas os tweets mais recentes são geralmente acessados. Ao excluir a cópia por usuário de tweets depois que eles são N dias, podemos recuperar uma grande quantidade de armazenamento. Se um usuário tentar ver alguma coisa da história antiga, que buscar os dados de tabelas desnormalizados. Este será mais lento, mas não vai acontecer muitas vezes, e as economias serão significativos. economia de armazenamento: (#avg_followers - 1) / #avg_followers
  • O padrão de gravação não é ideal. Em vários itens da fila, cada trabalhador fila será escrita na tabela tweets de cada usuário, portanto, a localização de gravações não vai ser muito bom. (Pior caso, teremos #processor * conexões de servidor # Armazenamento.) Isso pode ser corrigido através da aplicação de várias atualizações a cada gama de usuários. Por exemplo, se duas acções A e B são para ser aplicados ao intervalo [0, 10000), em seguida, tem um único processador de fila de aplicar estas duas acções de uma só vez.

Outras dicas

É já a ser feito: Laconica

  1. Já está sendo feito Parte II - A Vingança: identi.ca (que é sobre o topo da Laconica)
  2. Está já a ser feito Parte III - Do Lado Escuro: yammer

VBG! (-:

Eu vou começar a partir da premissa de voltar a fazer tudo de novo:? O que eu faria de forma diferente, se eu no Twitter naquela época

Não é uma coisa.

Twitter mantido o foco no que interessa:. Fornecendo um serviço que as pessoas realmente quer para utilizar

Eu adoraria trabalhar em um produto que se tornou tão popular em um período tão curto de tempo que a sua maior ameaça tornou-se seu próprio escalabilidade. Isso significa que você ganhou. Com o sucesso vem os recursos e atenção para capitalizar sobre o sucesso.

Eu projetá-lo escaláveis ??como o inferno apenas a partir do início.

A minha escolha seria a plataforma Microsoft, C #, o IIS, SQL Server, Memcached (ou Velocity se é final e corre bem quando eu começar ;-)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top