Casa > Q > Quais São As Melhores Práticas Para Construir Algo Como Um Feed De Notícias?

Quais são as melhores práticas para construir algo como um feed de notícias?

Eu adoraria receber comentários, feedback, ou abordagens alternativas sobre esta resposta.

Editar
Para os interessados, I'desde então escrevi uma quantidade razoável de código e joguei parte dele na natureza no StackOverflow. Se você'gostaria de ler mais ou dar-me algum (muito necessário) feedback, por favor seja meu convidado: http://stackoverflow.com/questions/4162020/how-can-i-improve-this-php-mysql-news-feed

Background

Users in most social networking sites are describable in terms of a social graph. As relações entre os usuários são representadas por listas adjacentes. Se Jack e Jill são amigos, diz-se que são adjacentes. Isto é conhecido como uma "borda" no gráfico.

Determinando Importância

Você'provavelmente vai querer classificar as bordas por importância em vez de simplesmente as atualizações mais recentes, o que significa que você precisa calcular algum tipo de pontuação. Facebook's EdgeRank foi descrito pela fórmula ∑e = ue we de, onde ∑e é a soma da pontuação de afinidade com o usuário que criou a borda, nós somos o peso para o tipo de conteúdo, e de é um fator de decaimento do tempo.

Calcular a pontuação de afinidade de um amigo's pode ser feito algo assim: ∑i = li ni wi, em que ∑i é a soma das interações com esse amigo, li é o tempo desde a sua última interação (isso precisaria ser ponderado para que 1 dia > 30 dias), ni é o número de interações, e wi é o peso dessas interações. Este método permite que você classifique amigos em uma base de dados separada e depois talvez mostrar apenas dez atualizações dos dez amigos mais próximos, o que é't uma má idéia considerando que poucos de nós provavelmente terão mais amigos próximos do que isto.

O que Armazenar

Determinar quais dados armazenar depende do seu front-end (incluindo quais atividades seus usuários participam) e do seu back-end. I'irá descrever algumas informações gerais que você pode armazenar. O itálico é especial, informação opcional que você pode querer ou precisar dependendo do seu esquema.

Activity(id, user_id, source_id, activity_type, edge_rank, parent_id, parent_type, data, time)

>p>

ul>user_id - user who generated activitysource_id - record activity is related to>li>activity_type - type of activity (photo album, comment, etc.)li>li>edge_rank - a classificação para esta atividade em particularli>li>parent_type - o tipo de atividade pai (interesse particular, grupo, etc.)li>li>parent_id - id da chave primária para o tipo paili>li>data - objeto serializado com meta-dados

>br>assumindo que você'usando MySQL como sua base de dados, você pode indexar em (user_id, tempo) e então executar suas consultas básicas. Um exemplo de linha de alimentação para uma foto seria:

>

(id: 1, user_id: 1, source_id: some_source, activity_type:PHOTO, dados: (photo_id: 1, photo_name: casar)).


No MySQL, as suas tabelas seriam fortemente desnormalizadas, uma vez que a execução de uniões prejudicaria a performance.

p>Potenciais problemas
>>/p>ul><

Visibilidade - deve mostrar atividades interessantes>li>Performance - o tempo de ordenação deve ser minimizadoli>li>Publicação - múltiplos pontos de falha dependendo do seu método de publicação>p>>br>Métodos de publicação

Modelo "Push", ou Fan-out-on-write

Este método envolve a desnormalização do usuário'Este método envolve desnormalizar os dados da atividade do usuário&apos e empurrar os metadados para todos os amigos do usuário&apos no momento em que ela ocorre. Você armazena apenas uma cópia dos dados como no esquema acima, depois empurra os ponteiros para os amigos com os metadados. O problema com este método é que se você tiver um grande fan-out (um grande número de seguidores), você corre o risco de quebrar enquanto a sua alimentação acumula um backlog. Se você seguir esta estratégia, você também corre o risco de um grande número de buscas em disco e de gravações aleatórias. Você'vai querer algum tipo de armazenamento de dados otimizado para gravação como Cassandra, HBase, ou BigTable.

Modelo "Pull", ou Fan-out-on-load

Este método envolve manter todos os dados de atividades recentes na memória e puxar para dentro (ou fanning out) esses dados no momento em que um usuário carrega sua página inicial. Os dados não'não precisam ser empurrados para fora para todos os assinantes assim que acontecem, de modo que nenhum back-log e nenhuma busca em disco. O problema com este método é que você pode não conseguir gerar um feed de notícias do usuário's por completo. Para mitigar este risco, você deve ter um mecanismo de retorno que se aproxime do feed do usuário's ou que sirva como uma boa alternativa.

>p>algumas sugestões
>ul>>li>Se você'estiver usando o MySQL, você'vai querer ter certeza que sua tabela de atividades é compacta o máximo possível, que suas chaves são pequenas, e que ela's estão indexadas apropriadamente. Você pode querer usar o Redis para acesso rápido a novos dados de fluxo de atividades. Redis é de leitura otimizada e armazena todos os dados na memória. Esta é uma boa abordagem para o modelo "Push" descrito acima.

>br>Conclusions
br>Embora esta não seja de forma alguma uma resposta exaustiva, I'estou tentando resumir o máximo de informação que posso. Minhas fontes para esta resposta são coletadas nos links abaixo, portanto qualquer informação nesta resposta infelizmente vai sem atribuição direta. Agradecimentos especiais, no entanto, vão para Ari Steinberg pela sua resposta muito detalhada a Quais são as questões de escala a ter em mente ao desenvolver um feed de rede social?

Como disse no início, eu adoraria receber comentários, feedback, ou abordagens alternativas sobre esta resposta.

Fontes
>

ul>http://stackoverflow.com/questions/202198/whats-the-best-manner-of-implementing-a-social-activity-stream>>li>http://stackoverflow.com/questions/1342741/alternatives-to-traditional-relational-databases-for-activity-streams>li>>li> Quais são as questões de escala a ter em mente ao desenvolver uma alimentação de rede social?>li>http://stackoverflow.com/questions/1443960/how-to-implement-the-activity-stream-in-a-social-network_li>http://stackoverflow.com/questions/1236511/php-mysql-activity-ala-facebookhttp://stackoverflow.com/questions/762490/how-do-social-networking-websites-compute-friends-updateshttp://stackoverflow.com/questions/2214955/delivering-activity-feed-items-in-a-moderately-scalable-way>>li>http://stackoverflow.com/questions/1169173/best-way-to-get-friends-actions-for-a-social-network-php-mysqlhttp://stackoverflow.com/questions/2835075/php-news-feed-database-design>li>http://stackoverflow.com/questions/1167149/user-actions-like-social-networks-facebook-myspace-all-big-ones_li>http://stackoverflow.com/questions/2757270/how-to-do-comments-in-activity-stream-like-facebook>_li>http://stackoverflow.com/questions/762490/how-does-social-networking-websites-compute-friends-updates

De Festa

Porque é que as escolas continuam a comprar livros cromados em vez de outros computadores portáteis? :: E se The Daleks substituíram The Reapers?