2

WebSocket コンポーネントを使用して Web アプリケーションを構築し、ミル ラック ベースのフロントエンドを実行したいと考えています。私の最初の計画は、フロントエンドに Camping を使用し、サーバーをシンで実行し、ラックconfig.ruを次のようにすることでした。

require 'rack'
require './parts/web-frontend'
require './parts/websocket'

AppStationary = Rack::File.new("./stationary")
run Rack::Cascade.new(AppWebSockets, AppWebPages, AppStationary)

AppWebSocketsは websocket-rack によって提供されており、うまく機能します。リクエストがない場合は、Upgrade: WebSocket単純に 404 になり、リクエストはカスケードをたどってキャンプ アプリAppWebPages.

このキャンプ Web アプリケーションは、通常の http リクエストを使用して CouchDB データベースと通信するために、必然的に IO へのアクセスを必要とすることが明らかになりつつあります。eventmachine と互換性のある非同期ライブラリなど、http リクエストを実行する方法はたくさんあります。コールバックをサブスクライブすると、ラックが返され、応答を作成する準備が整うまでに、ページは既に応答しています。em-synchrony を使用して、Ruby 1.9 のファイバーを介して同時実行性を取得できるようにしたいと考えています。 .

em-synchrony サポートが組み込まれている、シンに似ていると主張する Goliath と呼ばれる Web サーバーに遭遇しましたが、サーバーを起動してテストするためのコマンド ライン ユーティリティがなく、別の種類のファイルをこれはかなり不快です。また、現在 Thin のサポートのみを指定している websocket-rack をサポートするかどうかも不明です。

キャンプや WebSocket へのアクセスなどの使い慣れたラックベースのツールを利用しながら、IO のブロックを回避するための良い方法は何ですか?

4

3 に答える 3

2

Goliath に関して言えば、Goliath は Thin に基づいています (私は Thin コードから始めて、そこから始めました)。多くのコードが変更されました (例えば、mongrel パーサーの代わりに http_parser.rb を使用するなど) が、元のベースは Thin でした。

サーバーを起動するには、.rb ファイルを実行するだけです。システムは Sinatra が使用するものと同じです (動作させるために Sinatra からコードを借りました)。必要に応じて独自のサーバーを作成することもできます。追加の制御が必要な場合は、リポジトリに例があります。私たちにとっては、起動をできるだけシンプルにし、作成するファイルをできるだけ少なくしたかったのです。そのため、.rb ファイルを起動し、God を使用してサーバーを起動/再起動するとうまくいきました。

RSpec/Test::Unit で記述したテストを、通常どおりにテスト ファイルを実行します。Goliath のテストはリアクターを起動し、単体テストから実際のリクエストを API に送信します (注: これはフォークではなく、EM を使用して、テストと同じプロセスでリアクターを実行します)。これらはすべて、goliath が提供する test_helper にラップされています。

Goliath にはラックアップ ファイルはありません。.rb ファイルを直接実行します。Goliath アプリケーションには、ミドルウェア使用コマンドが .rb ファイルに直接組み込まれています。私たち PostRank にとって、これはサーバーを定義する最も簡単で明確な方法でした。複数のファイルを使用する代わりに、ファイルで作業するときにすべての use ステートメント (それらが使用する余分なビットを含む) を表示しました。私たちにとって、これは勝利でした。走行距離は異なる場合があります。

websocket-rack が機能するかどうかはわかりませんが、Websocket サポートを直接 Goliath に焼き付けるためのブランチがリポジトリにあります。私はしばらくそれを見ていませんでした (修正が必要なアップストリームのバグがいくつかありました) が、それを起動して実行し、アップストリームを修正して master にマージするのはそれほど難しいことではありません。

em-synchrony と thin に関する質問に対しては、EM.synchrony {} ブロックをコードにラップするだけでよいはずです。Synchrony メソッドは、EM.run を呼び出して、ブロックを新しいファイバーでラップするだけです。リアクターが既に実行されている場合、EM は渡されたブロックをただちに実行します。Thin がすでにリアクターを開始している限り、これは正常に機能するはずです。

更新: websockets ブランチは Goliath メインラインにマージされているため、HEAD から実行している場合、Goliath に直接組み込まれた WebSocket サポートがあります。

于 2011-09-13T04:47:58.150 に答える
1

Cramp - http://cramp.inを見たことがありますか?Cramp は完全に非同期で、組み込みの websockets サポートがあります。

于 2011-09-04T10:28:17.663 に答える
1

Camping に非同期サポートを追加する方法の例を次に示します: https://gist.github.com/1192720 (アプリで使用する必要があるコードについては、65 を参照してください)。たぶん、gem か何かでラップする必要があります…</p>

于 2011-09-04T11:46:07.780 に答える