Servidor De Ad Simples

Estou no meio de um projecto onde criámos a infra-estrutura para lidar com campanhas publicitárias em Grais e estou a tentar descobrir a melhor maneira de criar a parte do servidor de anúncios. Ou seja, a parte que vai servir os anúncios reais para os usuários finais (navegadores).

[[[2]] em meus últimos três projetos eu tenho usado Grais, que eu tenho vindo a desfrutar muito para o seu rápido desenvolvimento e bom apoio da comunidade Java até a primavera e hibernar. No entanto, os Grais ainda têm alguns problemas de desempenho, e não sei se é a escolha certa para esta tarefa. Tenho procurado outras alternativas, mas não consigo decidir para onde ir. O servidor precisa ser capaz de lidar com um par de milhares de pedidos por segundo, além de ser robusto. A estrutura do DB é a seguinte (simplificada):

Ad ==> site, position, percent of view (percent of time the ad is shown)

então, basicamente, o servidor de Anúncios precisa de obter as linhas necessárias do DB para o site específico e posição e escolher qual Ad a exibir (dependendo da percentagem).

Abaixo estão as diferentes escolhas que estou a considerar (todas as quais devem ter múltiplas instâncias e usar um balancer de carga).

  • Graais juntamente com Redis e MongoDB não encontrei nenhum relatório. em performance com este trio. No meu projectos anteriores Os Grais têm muito desempenho. problemas, muitos deles nós lidamos de formas diferentes, mas para um anúncio Servidor, não tenho a certeza se vai. fazer.
  • nó.js juntamente com um valor-chave nó de loja.JS é supostamente muito rápido, mas seria um pouco arriscado implementá-lo nesta fase, uma vez que ainda não está estabilizado.
  • Ruby on Rails juntamente com um loja de valores-chave - não fiz nenhum Ruby on Rails development yet, but do que consigo perceber a pesquisar no Google, o Ruby nos trilhos tem muito melhor desempenho do que Graal.
  • PHP com uma loja de valores-chave - Não. também fiz qualquer programação PHP, mas ... há um monte de sites grandes usando PHP que têm um bom desempenho, por isso deve ser considerado um bom alternativa.
Todas as sugestões ou recomendações são bem-vindas.

Author: Mr.B, 2011-05-16

3 answers

Não sirva nenhuma imagem da aplicação use um CDN para isso. Desde que a única coisa que a sua aplicação tem a fazer é determinar o que adicionar à visualização e devolver o link para o CDN armazenado ad, então você deve ser bom para servir os seus milhares de pedidos por segundo. Também não olhe para servir tudo a partir de um servidor. Carregar balanceamento é seu amigo em uma aplicação como esta e não é razoável culpar todas as questões de desempenho no quadro de escolha.

 3
Author: Devin M, 2011-05-16 18:18:54

100.000 linhas são pequenas o suficiente para armazenar em memória. Com o nó.js eu tentaria manter os dados em um DB em processo. Assumindo que o conjunto de dados não cresce muito grande, e atualizações para o DB são pouco frequentes, um servidor de nós muito simples deve produzir um bom desempenho.

Ad.db:

{ key:'site:position', value: [{id:'1424234', percent:50}, { id:'8394847', percent:50}] }

Url:

Http:://adserver.com/?add=site:position

AdServer.js:

var http = require('http');
var url = require('url');
var db = require('dirty')('ad.db');

var server = http.createServer(function (req, res) {
  var query = url.parse(req.url, true).query.add;
  var adds = db.get(query);
  var random = Math.floor( Math.random() * 100 );
  var id = '';
  for( var i = 0, len = adds.length; i < len; i++ ) {
    if( random < adds[i].percent ) {
      id = adds[i].id;
      break;
    } else {
      random += adds[i].percent;
    }
  }
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.end('<img src="http://cdn.com/' + id + '.jpg" alt='' />');
});
db.on('load', function() {
  server.listen(80);
});
 2
Author: generalhenry, 2011-05-17 20:33:44

Encontrei isto a comparar Java com nó.js, relativa ao desempenho:

Http://www.olympum.com/java/quick-benchmark-java-nodejs/

Http://www.olympum.com/java/java-aio-vs-nodejs/

Sugerem que Java é duas vezes mais rápido, mas faz os teus próprios testes.

Quantas combinações de local, posição, percentagem, etc. vós tendes? Quantas novas dimensões irá adicionar no futuro? Provavelmente vale a pena carregá - los todos no arranque para evitar constantemente vou à base de dados. Você poderia usar a combinação deles para construir uma chave rapidamente, que você procura o endereço do anúncio na memória. Isto deve ser rápido o suficiente em gravetos.

Para milhares de pedidos por segundo, você provavelmente está olhando para uma fazenda reunida, com um balanceiro de carga na frente. Depende da complexidade da lógica que constrói o conteúdo da página.

Uma vez que você tenha determinado a URL que o navegador deve usar para carregar o anúncio, Eu gosto da idéia de um CDN, mas que pode ficar caro!

Se fosse eu, ficava-me pela única tecnologia (Grais) e resolvia os problemas à medida que os enfrentava.
 1
Author: Ant Kutschera, 2011-05-16 19:44:58