5

私は、Grails で広告キャンペーンを処理するためのバックエンドを作成したプロジェクトの最中にあり、広告サーバー部分を作成する最良の方法を見つけようとしています。つまり、実際の広告をエンド ユーザー (ブラウザ) に提供する部分です。

最近の 3 つのプロジェクトでは、Grails を使用してきました。Grails は、迅速な開発と、Spring と Hibernate による Java コミュニティからの優れたサポートにより、非常に気に入っています。ただし、Grails にはまだいくつかのパフォーマンスの問題があり、このタスクに Grails が正しい選択であるかどうかはわかりません。私は他の選択肢を検討してきましたが、どの方法に行くか決めることができません。サーバーは、毎秒数千のリクエストを処理できる必要があり、さらに堅牢である必要があります。DB 構造は次のとおりです (簡略化)。

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

基本的に、広告サーバーは、特定のサイトと位置について DB から必要な行を取得し、表示する広告を選択する必要があります (パーセンテージに応じて)。

以下は、私が検討しているさまざまな選択肢です (すべて複数のインスタンスを持ち、ロード バランサーを使用する必要があります)。

  • GrailsRedisおよび MongoDBの併用- このトリオのパフォーマンスに関するレポートは見つかりませんでした。以前のプロジェクトで、Grails には多くのパフォーマンスの問題があることがわかりました。その多くはさまざまな方法で処理しましたが、Ad Server の場合はそうなるかどうかわかりません。
  • Node.jsとキー値ストア - Node.js はおそらく非常に高速ですが、まだ安定していないため、この段階で実装するのは少し危険です。
  • Ruby on Rails とキー バリュー ストア - Ruby on Rails の開発はまだ行っていませんが、Google で調べたところ、Ruby on Rails は Grails よりもはるかに優れたパフォーマンスを発揮します。
  • キーと値のストアを備えたPHP - PHP プログラミングも行っていませんが、PHP を使用している大規模なサイトではパフォーマンスが優れているため、優れた代替手段と見なす必要があります。

提案や推奨事項は大歓迎です。

4

3 に答える 3

3

そのために CDN を使用するアプリケーションから画像を提供しないでください。アプリケーションが行う必要があるのは、表示する追加を決定し、CDN に保存された広告へのリンクを返すことだけである限り、1 秒あたり何千ものリクエストを処理しても問題ありません。また、1 つのサーバーからすべてを提供しようとしないでください。ロード バランシングは、このようなアプリケーションの味方であり、選択したフレームワークのすべてのパフォーマンスの問題を非難するのは合理的ではありません。

于 2011-05-16T18:18:54.997 に答える
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/?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);
});
于 2011-05-17T20:33:44.670 に答える
1

パフォーマンスに関して、Java と node.js を比較してこれらを見つけました。

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

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

彼らは、Java が 2 倍高速であることを示唆していますが、独自の試行を行ってください。

サイト、位置、パーセントなどの組み合わせはいくつありますか? 今後、いくつの新しいディメンションを追加しますか? 常にデータベースにアクセスすることを避けるために、起動時にそれらすべてをロードする価値があるでしょう。それらの組み合わせを使用して、メモリ内の広告のアドレスを検索するキー ファストを作成できます。これは、Grails では十分に高速です。

1 秒あたり数千のリクエストの場合、おそらくロード バランサーが前もってクラスター化されたファームを見ていることでしょう。ページのコンテンツを構築するロジックの複雑さに依存します。

ブラウザーが広告を読み込むために使用する URL を決定したら、CDN のアイデアは気に入っていますが、費用がかかる可能性があります。

私だったら、1 つのテクノロジ (Grails) に固執し、直面する問題を解決します。

于 2011-05-16T19:44:58.983 に答える