Como eu construo um serviço de perfil / usuário altamente escalável?

5

Pergunta -

Atualmente tenho uma grande aplicação Java monolítica que estou trabalhando para dividir em componentes de serviços. Um dos componentes que quero separar é o serviço que manipula e apresenta usuários e perfis.

Atualmente, o serviço principal usa um backend do MySQL e é escrito em Java e é hospedado apenas em um conjunto de servidores (web, app, db). Meu principal objetivo é fazer com que o serviço de perfil / usuário seja escalável em vários servidores da Web e de aplicativos e tentar descobrir uma maneira de fazer isso na camada do banco de dados.

Quais são algumas das melhores práticas para alcançar alta escalabilidade com esse ambiente? (Atualmente, temos alguns milhões de usuários, mas esperamos crescer além disso).

Obrigado!

    
por Aspectmin 12.05.2011 / 04:33
fonte

1 resposta

3

Por que você está procurando distribuir componentes de serviço?

A menos que o aplicativo esteja com problemas para se encaixar na memória, você realmente não quer fazer isso. A sério. A comunicação via RPCs (especialmente se você estiver usando XML para serialização) adiciona uma tonelada de sobrecarga sobre chamadas de método simples, o que custa muito desempenho. Além disso, adiciona um monte de complexidade que torna os problemas de depuração muito mais difíceis. Eu vi os internos de sites que fizeram isso sem uma boa razão, e é incrível como muitos problemas de escalabilidade foram criados sem ganho. (Eu também vi o interior de um site bem conhecido que fez isso por uma razão muito boa, com resultados muito bons, e estou ciente de quanta disciplina constante eles precisam para evitar que ele se transforme em um desastre completo. organizações podem gerenciar isso.)

É claro que você deve garantir que seu código seja modular com APIs bem definidas, de modo que seja simples trocar uma implementação local ou remota da API. Isso é apenas um bom design de software. Mas, na verdade, não faça isso até que você precise, porque o seu aplicativo está com problemas para se encaixar na memória.

Mas o que você realmente precisa fazer é se certificar de que você é escalável horizontalmente. Isso significa que você pode executar vários servidores da Web de uma só vez. E vários servidores de aplicativos de uma só vez. Mas tudo bem que cada um seja integrado verticalmente.

Quanto ao banco de dados, existem várias estratégias comuns para escalar isso quando você atinge os limites. Use qualquer combinação desses que faça sentido para seu aplicativo:

  1. Adicione camadas de cache (por exemplo, memcached) para evitar ter que ir ao banco de dados o tempo todo.
  2. Adicione escravos somente leitura do banco de dados para que você possa direcionar algumas consultas somente leitura para.
  3. Obtenha um banco de dados maior. (Você ficaria surpreso com o quanto você pode escalar o banco de dados. Última ouvi dizer, todo o PayPal é executado fora de um enorme banco de dados Oracle.)
  4. Divida seus dados. A fragmentação de dados significa que você pode ter vários bancos de dados mestres, porque cada um deles possui apenas uma parte dos seus dados.
  5. Investigue as soluções NoSQL que relaxam as garantias de consistência do banco de dados em troca de fácil escalabilidade horizontal. Consulte o link para uma comparação rápida entre várias dessas opções.
por 12.05.2011 / 08:02
fonte