Tenho vários aplicativos da web de comércio eletrônico cliente em execução em uma única VM. Cada aplicativo da web é um aplicativo expresso node.js.
O aplicativo da web expresso se comunica com o back-end por meio de APIs para recuperar o conteúdo das páginas e a lista de produtos, etc. No entanto, para tornar as pesquisas de produtos mais rápidas, estamos usando um banco de dados na memória (lokijs) para que todas as pesquisas aconteçam, isso funciona muito bem para nós no momento, já que o catálogo médio de produtos para cada cliente é de apenas cerca de 80 itens, temos um cron simples em execução no aplicativo da web de cada cliente para atualizar o banco de dados na memória com a lista de produtos mais recente por meio de uma chamada de API.
Algumas das desvantagens disso são que, como estamos usando o PM2 para executar cada aplicativo em um cluster de 2 nós, o banco de dados na memória precisa ser duplicado, pois você não pode compartilhar a memória entre os nós, para garantir que os bancos de dados na memória permaneçam em sync usamos IPCs para passar mensagens para todos os processos dentro do cluster.
Como estamos trazendo clientes maiores com catálogos de produtos maiores, não queremos realmente manter bancos de dados duplicados na memória para cada processo filho.
A forma como nossa oferta funciona é que, embora os catálogos de produtos não sejam grandes por cliente, o volume de pesquisas é bastante grande, então um cliente com 80 itens ainda pode receber milhares de pesquisas por dia.
Eu tinha algumas opções em mente, mas não tinha certeza de qual seria a melhor:
Opção 1 – Cluster elástico global único
Falei e pensei em usar o elasticsearch e, em seguida, apontar cada aplicativo da web cliente para um único cluster global do elasticsearch para realizar pesquisas de produtos, dessa forma podemos usar eventos para manter o banco de dados do elasticsearch atualizado em tempo real.
No entanto, não sei como isso funcionará à medida que aumentamos, não quero que o Elasticsearch se torne um gargalo
Opção 2 – Banco de dados nosql local
A segunda opção era simplesmente substituir o uso de lokijs como banco de dados na memória e ter um banco de dados nosql compartilhado (como mongo) para cada VM, todos os aplicativos da web usam o banco de dados local para consultas, cada aplicativo da web ainda é responsável por atualizar o catálogo de produtos de sua própria loja. Então, à medida que adicionamos mais VMs, cada VM terá seu próprio banco de dados local para uso de qualquer aplicativo em execução.
Somos grandes usuários de pesquisa facetada e agregações em facetas para obter contagens para as facetas