fundo
Estou trabalhando em um aplicativo para um cliente que inclui alguns recursos de redes sociais. Eu estava originalmente desenvolvendo o front-end móvel, mas as circunstâncias me deixaram encarregado de desenvolver o back-end também.
Como pano de fundo geral, nosso sistema permite que os usuários sigam outros usuários e recebam notificações sobre aqueles que estão seguindo, como seria de esperar de uma rede social. Uma ressalva é que apenas um pequeno subconjunto (no máximo algumas centenas) de usuários será seguido, com a expectativa de que a maior parte da base de usuários esteja seguindo pelo menos um desses indivíduos.
No lado da interface do usuário, teremos um botão de notificação com um número e, ao clicar no botão, você será levado à tela de notificação.
O problema
Pesquisei estratégias para implementar notificações e a maioria dos recursos que encontrei apontam para a criação de uma ou mais tabelas de notificação no banco de dados. (Um exemplo que eu gosto é a resposta aceita aqui: /programming/9735578/building-a-notification-system ).
O que me impressiona é que a maioria das estratégias de notificações direcionadas ao banco de dados exige a inserção de uma linha para cada notificação para cada seguidor. Portanto, se mil pessoas estiverem seguindo Sally, inseriremos mil linhas na tabela correspondente. Isso é escalável? O que acontece se chegarmos ao ponto em que dezenas ou centenas de milhares de usuários estão seguindo Sally e ela está fazendo algumas dezenas de postagens por dia?
Minha idéia original era lidar com tudo com consultas: o número no botão de notificação seria obtido solicitando contagens de linhas no conteúdo postado mais recentemente do que na última vez em que você visitou a tela de notificação, enquanto notificações individuais seriam geradas a partir de consultas mais detalhadas quando você visitou a tela de notificação. Essa abordagem não requer gravações ou armazenamento extra, mas é inflexível e provavelmente prejudicaria bastante o servidor.
CONFIGURAÇÃO
O back-end (conforme estabelecido pelo desenvolvedor anterior) usa o CodeIgniter e um banco de dados MySQL . Atualmente, ele está sendo executado em uma conta de hospedagem compartilhada ruim do GoDaddy, mas suponho (espero?) Que isso será atualizado antes de entrarmos em produção e que o pacote de hospedagem será escalado com o crescimento do usuário.
Atualmente, nosso único front-end é um aplicativo móvel, mas também planejamos criar um site posteriormente. No momento, não estou preocupado em obter atualizações por push em tempo real do servidor sobre as notificações.
TERMO ADITIVO
Eu não me especializo em back-end e estou em minha cabeça naquele departamento. O cliente sabe disso, e eu fiz o meu melhor para tentar explicar o escopo de um projeto dessa natureza, mas eles deixaram claro que, nesse ponto, não confiarão em mais ninguém para trabalhar no projeto. Provavelmente temos mais um mês de trabalho para começar a adicionar testadores e eu posso obter qualquer tipo de métrica de desempenho. Realmente não posso estimar quantos usuários poderemos ter ou em que hardware estaremos nos próximos cinco anos, mas acho que o cliente está esperando por centenas de milhares de usuários ou mais.
Espero que este seja um problema específico o suficiente para ser postado aqui; Eu posso refinar, se necessário. Pergunte se você tiver alguma dúvida ou omiti detalhes importantes.
tl; dr
- Um sistema de notificação orientado a banco de dados tem implicações negativas para a escalabilidade a longo prazo quando todos os usuários seguem apenas algumas das mesmas centenas de pessoas?
- Existe uma maneira de tornar as notificações orientadas pelo banco de dados sem a necessidade de uma linha de notificação separada para cada notificação para cada seguidor?
- Um sistema de notificação totalmente orientado a consultas seria escalável ou teria alguma vantagem além de não gravar nenhum dado no banco de dados?
- Estou pensando muito cedo? Devo apenas criar algo que funcione por enquanto e podemos nos preocupar em otimizá-lo se isso se tornar um problema, já que o cliente tem um orçamento limitado e ainda não sabemos se o produto final será popular?
fonte
Respostas:
Sim, desde que as tabelas do banco de dados sejam indexadas corretamente.
Você gerará algumas dezenas ou centenas de milhares de registros de notificação por dia para Sally, supondo que você queira acompanhar todas as notificações permanentemente. A porcentagem de usuários como Sally com esse tipo de tráfego é sempre muito pequena.
Isso parece desnecessariamente complicado. Se você precisar de estatísticas detalhadas sobre as notificações, basta armazená-las.
É por isso que funciona ... um pequeno número de pessoas sempre gera a grande maioria do tráfego.
Sim ... Não armazene as notificações; basta enviar os e-mails de notificação, no estilo disparar e esquecer. Ou, armazene as notificações por um determinado período e as descarte. Ou, descarte cada notificação após ter sido lida.
Não tenho certeza do que você quer dizer com isso. Se você deseja consultar as notificações, é necessário armazená-las no banco de dados. Caso contrário, não há nada para consultar.
Converse com alguém que possa ajudá-lo a criar um banco de dados indexado e normalizado adequadamente, com as tabelas corretas. Não vejo razão para que esse banco de dados não possa lidar efetivamente com os cenários que você descreve.
Um exemplo da vida real
Tanto quanto eu sei, o Stack Exchange armazena tudo em perpetuidade, incluindo todas as notificações. Eles usam tecnologia de banco de dados semelhante ao MySql e algumas tecnologias de cache. Embora seu espaço de hardware e armazenamento seja substancial, a quantidade de tráfego que eles recebem é um bom problema.
fonte