Servidor de anuncios simple

Estoy en medio de un proyecto en el que hemos creado el backend para manejar campañas publicitarias en Grails y estoy tratando de encontrar la mejor manera de crear la parte del servidor de anuncios. Es decir, la parte que va a servir los anuncios reales a los usuarios finales (navegadores).

En mis últimos tres proyectos he estado usando Grails, que he llegado a disfrutar mucho por su rápido desarrollo y buen soporte de la comunidad Java a través de Spring e Hibernate. Sin embargo, Grails todavía tiene algunos problemas de rendimiento y no estoy seguro de que sea la opción correcta para esta tarea. He estado buscando otras alternativas, pero no puedo decidir qué camino tomar. El servidor debe poder manejar alrededor de un par de miles de solicitudes por segundo, además de ser robusto. La estructura de la base de datos es la siguiente (simplificada):

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

Entonces, básicamente, el servidor de anuncios necesita obtener las filas necesarias de la base de datos para el sitio y la posición específicos y elegir qué anuncio mostrar (según el porcentaje).

A continuación se muestran las diferentes opciones que estoy considerando (todas las cuales deben tener múltiples instancias y usar un balanceador de carga).

  • Griales Junto con Redis y MongoDB - No he encontrado ningún informe sobre el rendimiento con este trío. En mis proyectos anteriores, descubrimos que Grails tiene muchos problemas de rendimiento, muchos de ellos los hemos manejado de diferentes maneras, pero para un servidor de anuncios, no estoy seguro de que funcione.
  • Node.js junto con un almacén de valores clave: Se supone que Node.js es muy rápido, pero sería un poco arriesgado implementarlo en esta etapa, ya que aún no está estabilizado.
  • Ruby on Rails junto con una tienda de valor clave: todavía no he hecho ningún desarrollo de Ruby on Rails, pero por lo que puedo recopilar al buscar en Google, Ruby on Rails tiene un rendimiento mucho mejor que Grails.
  • PHP con una tienda de valores clave: tampoco he realizado ninguna programación PHP, pero hay muchos sitios grandes que usan PHP que tienen un buen rendimiento, por lo que debe considerarse una buena alternativa.

Cualquier sugerencia o recomendación es bien recibida.

preguntado el 16 de mayo de 11 a las 17:05

¿Qué tan grande es la base de datos? ¿Líneas? MB? -

Debería haber alrededor de 50.000 a 100.000 filas en la base de datos para empezar (primer año más o menos). -

Tengo curiosidad por saber qué eligió. Me enfrento a una situación similar y estoy empezando a investigar ahora. ¿Qué eligió y está satisfecho con el resultado? -

3 Respuestas

No sirva ninguna imagen de la aplicación, use un CDN para eso. Siempre que lo único que tenga que hacer su aplicación sea determinar qué agregar para mostrar y devolver el enlace al anuncio almacenado en CDN, debería estar bien para atender sus miles de solicitudes por segundo. Además, no busque servir todo desde un servidor. El equilibrio de carga es tu amigo en una aplicación como esta y no es razonable culpar todas cuestiones de rendimiento en el marco de elección.

contestado el 16 de mayo de 11 a las 22:05

Olvidé escribir el equilibrio de carga, que por supuesto es necesario para garantizar la disponibilidad y aumentar el rendimiento. En el caso de Grails, ¿cuántas instancias diría que serían necesarias? - Mr.B

No sabría realmente cuántas instancias se necesitan, eso depende del tipo de datos devueltos, así como de los recursos del servidor. - Devin M

100.000 filas es lo suficientemente pequeño como para almacenarlo en la memoria. Con node.js intentaría mantener los datos en una base de datos en proceso. Suponiendo que el conjunto de datos no crezca demasiado y que las actualizaciones de la base de datos no sean frecuentes, un servidor de nodo muy simple debería producir un buen rendimiento.

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);
});

contestado el 18 de mayo de 11 a las 00:05

Encontré estos comparando Java con node.js, con respecto al rendimiento:

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

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

Sugieren que Java es dos veces más rápido, pero haz tus propias pruebas.

¿Cuántas combinaciones de sitio, posición, porcentaje, etc. tendrá? ¿Cuántas dimensiones nuevas agregará en el futuro? Probablemente valga la pena cargarlos todos al inicio para evitar golpear constantemente la base de datos. Puede usar la combinación de ellos para crear una clave rápidamente, en la que busca la dirección del anuncio en la memoria. Esto debería ser lo suficientemente rápido en Grails.

Para miles de solicitudes por segundo, probablemente esté viendo una granja en clúster, con un balanceador de carga al frente. Depende de la complejidad de la lógica que construye el contenido de la página.

Una vez que haya determinado la URL que el navegador debe usar para cargar el anuncio, me gusta la idea de un CDN, ¡pero eso podría resultar costoso!

Si fuera yo, me quedaría con la única tecnología (Grails) y resolvería los problemas a medida que los enfrento.

contestado el 16 de mayo de 11 a las 23:05

¡Gracias por las sugerencias! Me inclino por ceñirme a los griales. Para empezar, tendremos alrededor de 10.000-20.000 sitios, cada uno con 4 posiciones. Así que estamos viendo alrededor de 40.000 a 80.000 registros de bases de datos. No debería ser demasiado costoso mantenerlo en la memoria con un almacén de valores clave como redis. Estaba pensando en comenzar con instancias de 2 griales detrás de un firewall, pero eso podría ser para pocas, no estoy seguro. Soy nuevo en toda la escena de servir contenido rápido a muchos usuarios .. - Mr.B

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.