Pergunta

Eu estou indo para o trabalho em um site de inspiração para uma ONG, e eu estou olhando para implementar algum tipo de fluxo de eventos Facebook-esque, com eventos como “Michael recomendado torta de maçã ”, “John comentou sobre bolo de chocolate ”, “ Caramel fudge foi publicado 8 horas atrás por Alice”, etc.

A coisa é que esses eventos são baseadas em interesse, assim que alguém só pode ser interessado em caramelo e as cerejas e não deve ver tortas de maçã ou bolos de chocolate, em seguida. Há um grande número de permutações para isso, e gerando fluxo de eventos personalizados de um usuário na mosca significaria algumas database-queries em vez caros.

Então, meu pensamento foi para pré-gerar uma relação entre o usuário de recebimento eo evento destacados (provavelmente uma SQL simples Cadastre-table) fazendo algum tipo de processamento em segundo plano sempre que um evento de ação está acontecendo.

O trabalho necessário para pesar as preferências de centenas de usuários contra um evento é obrigado a ser substancial, por isso não pode ser feito como parte da solicitação POST que desencadeia o trabalho, então eu vou ter que fazer um monte de trabalhar em um processo diferente. Atualmente estou olhando para Gearman para esta tarefa, mas eu sou muito aberto a sugestões.

Eu não estou procurando alguém para fazer o meu trabalho para mim, mas se alguém tem alguma experiência prévia com a construção deste tipo de coisa, eu adoraria ouvir seus pensamentos.

Foi útil?

Solução

Eu tive alguma experiência de construção de um fluxo de notícias em um site de rede social e, sim, as consultas podem ser muito complexo muito rapidamente quando você tem vários tipos de eventos e vários níveis de interesse (ou configurações de privacidade, ou permissões de usuário).

Na suposição de que os eventos são vistos mais frequentemente do que eles são gerados, faz sentido fazer alguma desnormalização e calcular potenciais espectadores de um evento quando o evento acontece, em vez de cada vez que alguém solicita o fluxo de notícias.

Gostaria de sugerir a execução de um processo de fundo que converte esses eventos objetos (relacionado a seus criadores) em objetos de mensagem simples (relacionada com o seu leitor, as pessoas que os vêem no fluxo de notícias). Você pode acabar com muitas mensagens por evento, mas isso vai fazer solicitações para o front-end muito mais rápido, e descarregar o trabalho sobre os processos em segundo plano.

Eu não usei Gearman, mas se é o tipo de coisa que lhe permite carregar o ambiente do seu aplicativo em um processo de fundo e receber os eventos para processo através de uma fila, então provavelmente é uma boa idéia.

A minha solução simples era fazer a minha própria usando beanstalkd meus próprios scripts PHP .

Outras dicas

Não sei como o seu DB está estruturado (você pode querer dizer-nos mais), mas algo óbvio como

SELECT events.* FROM events, event_tags, user_tags
     WHERE event_tags.event_id = events.id 
         AND event_tags.tag_id = user_tags.tag_id
         AND  user_tags.user_id = <$user_id>

Não parece extremamente pesado para mim, supondo que você tem índices em todo o lugar

Isso soa como algo que pode ser resolvido com um índice adequado. Eu iria construir a solução em torno da presunção de que o banco de dados é capaz de lidar com ele, mas colocar um serviço em frente ao banco de dados e permitir que todos os clientes passar por este ponto. Se as coisas começam a ir muito lento, você pode introduzir vários tipos de cache nesta camada. Tal como acontece com a maioria das decisões de desempenho, tentando fazê-lo bem na frente provavelmente não é uma boa idéia.

Facebook desenvolveu seu próprio banco de dados para fazer esse tipo de coisa e código aberto, eu não sei muito sobre isso, mas eu estou supondo que poderia ser vale uma olhada .

Você olhou para o módulo Atividade? Aqui está um trecho de sua página do projeto:

... mantém o controle das coisas que as pessoas fazem em seu site e fornece mini-feeds dos essas atividades em blocos, em uma tabela especializada e via RSS. O módulo é extensível de modo que qualquer outro módulo pode integrar com ele. As mensagens que são produzidos são personalizáveis ??através da interface de administração e são sensíveis ao contexto.

Eu vou estar curioso sobre o que você venha com, porque necessidade de fazer algo assim no futuro semi-próximo.

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