2012-06-16 13 views
5

node.jsのアプリケーション状態を保存するにはどうすればよいですか?Node.jsにアプリケーション状態を保存する

RESTful APIを使用して多数の(10,000以上の)製品をEコマースアプリケーションにインポートするスクリプトがNode.JSにあります。 APIにはリクエストの量に制限があり、私たちはその制限に対してぼかしをかけています。以前の実行では、おそらくAPI制限を超えたためにスクリプトはError: connect ETIMEDOUTで終了しました。私は5回接続しようとすることができたいと思うし、それが限界が復元された1時間後に再開に失敗した場合。

クラッシュが発生した場合(電源が切れたり、ネットワークがクラ​​ッシュするなど)、進捗状況を保存することも有益です。そして、中止した時点からスクリプトを再開することができます。

Node.jsが巨大なイベントキューとして動作し、すべてのhttp要求とそのコールバックが(ほかのイベントとともに)キューに入れられることがわかりました。これにより、現在の実行状態を保存するための主要なターゲットになります。他の楽しい(このプロジェクトにはまったく必要ではない)、異なるネットワーク上の複数のマシン間で作業を分散してスループットを向上させることができます。

既存の方法はありますか?おそらくフレームワーク?あるいは、私はこれを自分で実装する必要があります。その場合、これをどのように行うことができるかについての有用な情報を感謝するでしょう。

+0

*永続ジョブキュー*が必要です。それらの多くがあります。どちらかといえば見栄えの良いものは[Kue](http://learnboost.github.com/kue/)です。 –

+0

私はあなたが絶対に正しいと思います。 Kueはとても華麗です。だから、基本的にプロデューサーで私は私のデータファイルを読んでいるだろうし、消費者で私は各製品を追加/更新することができます。だから、それぞれの製品は別々の仕事になるでしょう。 –

答えて

3

私は一緒にいくつかと(あなたは私がNode.jsの巨大イベントキューとして動作していることを知っている

を言うとき、すべてのHTTP要求とそのコールバックがそのキューに入れます、あなたが何を意味するかわからないんだけど他のイベント)。これは、現在の実行状態を保存するための第一の目標になります

答えに関連する場合は、これをコメントしたり、解説してください。いくつかの理由のために、あなたは、単にこの特定のタスクのための永続性メカニズムを探しているなら、私はRedisをお勧めかもしれない、と述べた

  • それは多くのデータ型に関するatomic operationsすることができます。たとえば、要求数を表すRedadのエントリがnum_requests_madeである場合は、INCR num_requests_madeを使用してRedisで簡単にこの数値を増やすことができます。アトミックであることが保証されているため、複数のワーカーに容易に拡大できます。
  • several data typesがあり、お客様のニーズに役立つ可能性があります。たとえば、単純な文字列は、(以前の箇条書きのように)特定の期間に行われたAPIリクエストの数を表すことができます。リストに再送信する必要がある失敗したAPI要求の詳細を格納することができます。
  • pub/sub mechanismsは、プログラムの複数のインスタンス間で簡単に通信できるようにします。

これは面白いまたは有用なサウンド、あなたはすでにRedisのに慣れていない場合は、私は非常に少数のデータタイプを紹介し、それらのコマンドinteractive tutorialを、試しをお勧めします。もう1つの良い資料はA fifteen minute introduction to Redis data typesです。

+0

RedisはMongoDBと非常によく似ていますが、MongoにはPub/Subの機能はありません。このプロジェクトでは、開発のスピードが遅いので、配布は私にとって大きな問題ではありません。私はすでにNode.js(Mongoose)のMongoと仕事をしています。それで、あなたがそうでないと思わない限り、それにこだわる方が良いかもしれないと思いますか? また、Node.jsの偶数ループについても言及しました。キューについて言及し、すべてが順番に処理され、内部的に1つ以上のキューとして表される方法について説明しました。 –

+0

Redisは原子性とスピードに重点を置いていますが、もしあなたがMongoを知っていれば、このアプリケーションではうまく動作し、他のpub/subツール(ZeroMQ、RabbitMQなど)実際のドキュメントストレージを行っていない限り、レディスがより適していると思う(とKueはレディスによってサポートされている)。私はあなたが運転しているものを見ていると思いますが、何か慣れていない状態でどのように手を伸ばして状態を保存するかはわかりません。 –

+0

ありがとうBrandon :)皆さんのお答えは本当に私の方がより良い方向感を得るのを助けました。私はフォローアップの質問を開きます。あなたや@dan-dがKueを使って同様のことをする方法を記述した回答を追加できる場合、私はそれを答え、感謝としてマークします:) –

関連する問題