2012-03-03 7 views
1

ウェブ開発では、レールとノードを混在させたいと思っています。両方の世界(高速ウェブ開発のためのレールと並行処理のためのレール)を最大限に活用したいからです。私は、一部の人々は、イベントコントローラを備えたフルルビースタックをレールコントローラに統合して、イベントループモデルでファイバを使用することですべての要求を非ブロックにすることを選択していることを知っています。私はそれがどのように大きな画像で動作するかを理解することができました。このmoementでrails、redis、およびnode.jsのリクエスト処理はどのように非同期ですか?

は、しかし、私は、メッセージキューの概念とレールとのNode.jsとノンブロッキングリクエストの処理を行って試してみたいです。私はこれが仲介者としてredisを使用することによって達成できると聞きました。私はまだそれが今のところどのように動くのか把握しようとするのに苦労している。私が理解できるものから、2つのアプリケーションA(レール)とB(ノードJ)と赤い線があります。 rails appはREST方式でコントローラを経由するユーザからのリクエストを処理し、そこからレールがredisを通過し、次にredisがキューを形成し、node.jsアプリケーションがそのキューをピックアップし、後で必要な処理を行いますバックエンドデータベースから読み取る)。

私の質問:

  1. それでは、どのように並行性とスケーラビリティを向上させるのでしょうか?何よりも、 は、コントローラが を同期して要求を処理してから、redisに書き込むので、node.jsが最後にキュー を非同期的に受信できるとしても、要求は ブロックされます。 (私は非同期ではないと感じていますが、終了するのが最後でない場合は ノンブロッキングです)。

  2. redis が仲介者の場合、node.jsはここでプロキシまたはアプリケーションと見なされますか?

  3. 私はRedisのために新たなんだと、まだそれを学びます。私はそのようにMongoDBやCouchDBのように私のバックエンドデータベースのための100%のNoSQL ソリューションを、使用している場合、彼らは完全にRedisのことで交換可能であるかのRedis以上のRabbitMQのような メッセージキューツールとして見られていますか?

  4. メッセージングキューはスレッド化とは異なる同時実行性の概念ですか、または イベントループモデルとは異なりますか、またはそれらを補うものですか?

これはすべて私の質問です。私はメッセージキューの概念が初めてです。正しい方向への助けと指針、そして私がもっと学ぶのに役立つ記事を感謝します。ありがとう。

答えて

2

ここでは、一緒に行かないものをいくつか混在させています。

てみましょう最初の確認私たちが関わった技術

Railsのの強み/弱みについては同じページ上にある作る:それはウェブ開発の簡素化とデータベース・バックアップのWebアプリケーションを提供するために最適ですために使用します。 Rubyワーカーでスレッドを使い果たしても、長時間実行されるリクエストを多数処理しなければならない場合はパフォーマンスはあまり高くありませんが、より多くのWebノードで複数のWebサーバ(1 db )。

Node.js:並行性の高いシナリオでは、最適です。規則的なWebアプリケーションを書くためのレールほど簡単ではありません。しかし、長期間実行される低cpuタスクの狂った量の近くで効率的に処理することができます。

Redisの:それのデータ構造(インクリメント/デクリメント値、リストに/ prepentプッシュ/ポップを追加で操作サポートキーバリューストア - 一度に書き込みを複数のクライアントで一貫し、このDBの作業を行うすべての操作を)

ここからわかるように、RailsとNodeが同じリクエストを処理するという利点はありません.Redisを介して通信します。要求がノード・サーバーによって処理されると、Railsスタックを経由しても利点はありません。 ノード・サーバーに処理をオフロードしても、要求を処理するRails Webサーバーであり、ノードからの応答を待って、必要なスケーラビリティを失うことがあります。それは単に意味をなさない。

NodeとRailsを同時に設定すると、スケーリングの要件が大幅に異なるアプリケーションの特定の領域に配置されます。

たとえば、サッカーゲームのライブ統計を表示するウェブサイトを作成している場合、アプリには2つの異なる懸念事項があることが簡単にわかります。「通常の」サイトには、サインアップ、請求、レールによる迅速な実装。また、ユーザーがライブ結果を見ているサイトの「ライブ」部分は、一度に多くのクライアントを処理することを期待しています。つまり、何かが起きるのを待っています(低いCPU高並列性)。

このような場合、サイトの2つの部分を実際にRubyとNodeアプリケーションに分けて、Redisのような店を通じてユーザーに関するデータを共有すると便利です(実際には共有状態が必要です両方とも同期の目的で見ることができ、書き込むことができます)。

例えば、サインアップ/ログインの部分にはRailsを使用します。サインアップすると、セッションクッキーをユーザーの権限と共に(ユーザーはどんなゲームに従うことができますか)レディスに書き込んで、そのユーザーをNode.jsアプリ。 ノードアプリケーションは、Redisからセッション情報を読み取り、ユーザーにサービスを提供できます。

アドバイスの単語: Node.jsをツールボックスに投げるだけでスケーラビリティを得ることはできません。 Node.jsがどのような点で優れているのか(低CPUの高並列処理)、現在選択されているテクノロジが持ついくつかの問題を解決するためにどのように活用できるかを本当に把握する必要があります。

0

私はあなたのために3答えることができます。 Redisは、結果が実際にディスク上にある操作を実行したとき、それを処理するトランザクションが少し異なっていることを保証しません。また、データベース全体をメモリに格納する必要があります。状況に応じて、これが問題になることがあります。しかし、それは信じられないほど速いです。メッセージングキューではなく、キューから簡単にキューを作成することはできますが、それは目的ではありません。あなたがキューイングシステムだけを持っていたいなら、あなたはおそらく何か他のものでうまくいくでしょう。