简单的广告服务器

我正在创build用于处理Grails中的广告活动的后端项目,而我试图找出创build广告服务器部分的最佳方法。 即将要为最终用户(浏览器)提供实际广告的部分。

在我最近的三个项目中,我一直在使用Grails,因为Java的社区通过Spring和Hibernate获得了快速的开发和良好的支持,所以我非常享受。 但是,Grails仍然存在一些性能问题,我不确定这是否是正确的select。 我一直在寻找其他的select,但不能决定走哪条路。 服务器需要能够处理每秒几千个请求,另外还需要强大的function。 DB结构如下(简化):

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

所以基本上,广告服务器需要从特定网站和位置的数据库中获取必要的行,并select要显示的广告(取决于百分比)。

波纹pipe是我正在考虑的不同的select(所有这些应该有多个实例,并使用负载平衡器)。

  • GrailsRedisMongoDB–我还没有发现任何关于这三人的performance。 在我之前的项目中,我们发现Grails有很多性能问题,其中很多我们用不同的方式处理,但是对于一个广告服务器,我不确定它会做什么。
  • Node.js和键值存储一起Node.js被认为是非常快的,但是在这个阶段实现它还有点风险,因为它还没有稳定下来。
  • Ruby on Rails和关键值存储一起 – 还没有完成Ruby on Rails的开发,但是从我的search结果来看,Ruby on Rails比Grails有更好的性能。
  • PHP的键值存储 – 也没有做任何PHP编程,但有很多使用PHP的大网站性能良好,所以它应该被认为是一个很好的select。

任何build议或build议受到热烈欢迎。

       

网上收集的解决方案 "简单的广告服务器"

不要从应用程序提供任何图像使用CDN。 只要您的应用程序唯一要做的就是确定要添加哪些显示并将链接返回到CDN存储的广告,那么您应该可以很好地为每秒提供数千个请求。 也不要期望从一台服务器提供一切服务。 在这样的应用程序中,负载平衡是你的朋友,将所有性能问题归咎于select的框架是不合理的。

100.000行足够小,可以存储在内存中。 有了node.js,我会试着将数据保存在一个进程内的数据库中。 假设数据集不会变得太大,并且对数据库的更新很less,那么一个非常简单的节点服务器应该会产生良好的性能。

ad.db:

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

url:

?HTTP :: //adserver.com/添加=网站位置

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

我发现这些比较Java与node.js,涉及性能:

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

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

他们认为Java的速度是其速度的两倍,但是要做自己的尝试。

你有多less个网站,职位,百分比等组合? 未来将增加多less新维度? 可能值得在启动时加载它们,以避免不断地触发数据库。 您可以使用它们的组合来快速构build密钥,您可以在内存中查找广告的地址。 这在Grails中应该足够快。

对于数以千计的请求,您可能正在查看一个群集服务器场,并在负载平衡器前面。 取决于构build页面内容的逻辑的复杂性。

一旦你确定了浏览器用来加载广告的URL,我喜欢CDN的想法,但是这可能会变得昂贵!

如果是我,我会坚持一种技术(Grails),解决我面对的问题。