Estou no início da criação de um sistema de notificação no estilo do Facebook para nossa página (tipo de jogo social) e agora estou pesquisando qual seria a melhor maneira de projetar esse sistema. Não estou interessado em enviar notificações ao usuário ou algo assim (por enquanto, até mesmo). Estou pesquisando como criar o sistema no servidor (como armazenar notificações, onde armazená-las, como buscá-las, etc ...).
Então ... alguns requisitos que temos:
- nos horários de pico, temos cerca de um mil usuários simultâneos conectados (e muitos outros convidados, mas eles não são importantes aqui, pois não terão notificações) que gerarão muitos eventos
- haverá diferentes tipos de notificações (o usuário A adicionou você como amigo, o usuário B comentou seu perfil, o usuário C curtiu sua imagem, o usuário D venceu você no jogo X, ...)
- a maioria dos eventos gera 1 notificação para 1 usuário (o usuário X gostou da sua imagem), mas haverá casos em que um evento gerará muitas notificações (é o aniversário do usuário Y, por exemplo)
- as notificações devem ser agrupadas; se, por exemplo, quatro usuários diferentes, como uma imagem, o proprietário dessa imagem receber uma notificação informando que quatro usuários gostaram da imagem e não quatro notificações separadas (assim como o FB)
OK, então o que eu estava pensando é que eu deveria criar algum tipo de fila para armazenar eventos quando eles acontecerem. Então, eu teria um trabalho em segundo plano ( gearman ?) Que examinaria essa fila e geraria notificações com base nesses eventos. Esse trabalho armazenaria notificações no banco de dados para cada usuário (portanto, se um evento afetar 10 usuários, haveria 10 notificações separadas). Então, quando o usuário abria uma página com a lista de notificações, eu lia todas as notificações para ele (pensamos em limitar isso a 100 notificações mais recentes), agrupá-las e finalmente exibi-las.
Coisas que me preocupam com essa abordagem:
- complexo como o inferno :)
- é o banco de dados com o melhor armazenamento aqui (estamos usando MySQL) ou devo usar outra coisa (redis também parece ser um bom ajuste)
- o que devo armazenar como notificação? ID do usuário, ID do usuário que iniciou o evento, tipo de evento (para que eu possa agrupá-los e exibir o texto apropriado), mas meio que não sei como armazenar os dados reais da notificação (por exemplo, URL e título da imagem que foi gostado). Devo apenas "assar" essas informações ao gerar a notificação ou armazenar o ID do registro (imagem, perfil, ...) afetado e puxar as informações para fora do banco de dados ao exibir a notificação.
- o desempenho deve ser bom aqui, mesmo que eu precise processar 100 notificações em tempo real ao exibir a página de notificações
- possível problema de desempenho em cada solicitação, porque eu precisaria exibir o número de notificações não lidas para o usuário (o que poderia ser um problema por si só, pois agruparia as notificações). Isso poderia ser evitado, se eu gerasse a exibição de notificações (onde elas estão agrupadas) em segundo plano e não em tempo real
Então, o que você acha da minha solução proposta e das minhas preocupações? Por favor, comente se você acha que devo mencionar qualquer outra coisa que seja relevante aqui.
Ah, estamos usando PHP para nossa página, mas acho que não deve ser um grande fator aqui.