我正处于一个项目的中间,我们已经创建了后端来处理Grails中的广告活动,我正在尝试找出创建广告服务器部分的最佳方法。即将向最终用户(浏览器)提供实际广告的部分。
在我的前三个项目中,我一直在使用Grails,我非常喜欢它,因为它通过Spring和Hibernate得到了Java社区的快速开发和良好支持。但是,Grails仍有一些性能问题,我不确定它是否适合这项任务。我一直在寻找其他选择,但无法决定走哪条路。服务器需要能够每秒处理大约几千个请求,并且需要强大。 DB结构如下(简化):
Ad ==> site, position, percent of view (percent of time the ad is shown)
基本上,广告服务器需要从数据库中获取特定网站和位置所需的行,并选择要显示的广告(取决于百分比)。
Bellow是我正在考虑的不同选择(所有这些选择应该有多个实例并使用负载均衡器)。
欢迎任何建议或建议。
答案 0 :(得分:3)
请勿使用CDN为应用程序提供任何图像。只要您的应用程序必须做的唯一事情是确定添加显示的内容并将链接返回到CDN存储的广告,那么您应该可以每秒为您提供数千个请求。另外,不要从一台服务器上提供服务。在这样的应用程序中,负载平衡是你的朋友,在所选框架上归咎于所有性能问题是不合理的。
答案 1 :(得分:2)
100.000行足够小,可以存储在内存中。 使用node.js,我会尝试将数据保存在进程内DB中。 假设数据集不会变得太大,并且对DB的更新很少,那么非常简单的节点服务器应该会产生良好的性能。
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);
});
答案 2 :(得分:1)
我发现这些将Java与node.js进行比较,关于性能:
http://www.olympum.com/java/quick-benchmark-java-nodejs/
http://www.olympum.com/java/java-aio-vs-nodejs/
他们建议Java的速度是原来的两倍,但要做自己的试验。
您将拥有多少个网站,位置,百分比等组合?您将来会添加多少个新尺寸?可能值得在启动时加载所有这些以避免不断访问数据库。您可以使用它们的组合来快速构建密钥,您可以在内存中查找广告的地址。这在Grails中应该足够快。
对于每秒数千个请求,您可能正在查看具有负载均衡器的群集服务器场。取决于构建页面内容的逻辑的复杂性。
一旦确定了浏览器用于加载广告的网址,我就喜欢CDN的想法,但这可能会变得昂贵!
如果是我,我会坚持使用一种技术(Grails)并在遇到问题时解决问题。