サーバーを台無しにしない方法としてフェイ

こんにちはハブラ 今日、私たちのプロジェクトの1つで、 Cometテクノロジーを使用したために、サーバーリクエストの数を2〜3注文減らした方法についてお話したいと思います。



問題の本質:タクシーサービスのWebアプリケーション、ディスパッチャがリモートで(自宅、オフィスなどから)動作します。 それぞれの前に-注文のリスト。 注文のステータスはいつでも変更できます-ドライバーが注文を受け取り、ドライバーが拒否し、クライアントが拒否し、別のディスパッチャが新しい注文を開きました。 ラッシュアワーではコールが中断することなく次々と送信されるため、ディスパッチャがほぼリアルタイムで画像を見ることが非常に重要です。 最初に、これは定期的に呼び出されるAJAX要求(setTimeout)を介して行われ、サーバーから現在の要求のレンダリングされたリストを受け取り、divの内容を置き換えました。 1〜2人の開発者と2、3人のテスターに​​とって、これは普通のアイデアのように思えました。 関連性とサーバーの負荷軽減との間の妥協の結果によると、3秒ごとにサーバーをプルすることにしました。



ただし、実際の生活ではすべてがすぐにその場所に置かれます。 まず、実際には、注文のリストで、5〜10ではなく、30〜40が同時に実行された注文です。 第二に、約12のディスパッチャがあります。 サーバーの負荷は自信を持って上がりました。 サーバーの人気が高まり、Cometテクノロジー、より具体的には有用なfaye gemに基づいてリストの更新をやり直すまで待たないことにしました。



このアイデアはロングポーリングの原則に基づいています。これは、ページがロードされるときに、JavaScriptがメッセージサーバーに隠されたAJAXリクエストを行い、そのリクエストがバイトを与えないことです。 次に、リクエストがタイムアウトで落ちる-javascriptがリクエストを繰り返すか、クライアント側で実行される通常のjavascriptが戻ってきます。



gemの使用は非常に簡単です。

1. faye gemをインストールします(Gemfileに追加し、バンドルインストールを行います)



2.追加

require "net/http"







config / application.rbに



これは、メッセージ送信ヘルパーが機能するために必要です-おそらく、彼らはそれをgemに統合しますが、今のところは手で入力する必要があります。



3.テキストを含む新しいファイルを作成します

FAYE_TOKEN = "anything"







これにより、メッセージサーバーがアプリケーションを区別する線が設定されます(複数ある場合)。 「何か」の代わりに、後で混乱しないように、何でも書くことができます。



4.メッセージを送信するためのヘルパーを作成します(application_helper.rbなど)。

def broadcast(channel, &block)

message = {:channel => channel, :data => capture(&block), :ext => {:auth_token => FAYE_TOKEN}}

uri = URI.parse("http://moesuperprilozhenie.ru:9292/faye")

Net::HTTP.post_form(uri, :message => message.to_json)

end









このヘルパーは、どのビューでも何とか簡単に使用できます。

- broadcast "/orders/update" do

$("#orders_list").append("#{escape_javascript render(@orders) }");









5.プロジェクトのルートにファイル(faye.ruなど)を作成します

require 'faye'

require File.expand_path('../config/initializers/faye_token.rb', __FILE__)



class ServerAuth

def incoming(message, callback)

if message['channel'] !~ %r{^/meta/}

if message['ext']['auth_token'] != FAYE_TOKEN

message['error'] = 'Invalid authentication token'

end

end

callback.call(message)

end

end



faye_server = Faye::RackAdapter.new(:mount => '/faye', :timeout => 45)

faye_server.add_extension(ServerAuth.new)

run faye_server









これは、実際にクライアントに更新を送信するFaye Rackサーバーを起動するための指示です。



6.メッセージサーバーを起動します。

rackup faye.ru -s thin -E production









ここでは、シンWebサーバーに基づいて、運用モードでファイルfaye.ruに従ってメッセージサーバーを起動します。

ここには微妙な点があります--E生成引数は、アプリケーションの環境ではなく、fayeおよびthin自体の動作モードに適用されます。 -E developmentを指定すると、不具合が発生します。なぜわからないのか、おそらく修正されています。



7.ページをロードするJavaScriptで:

$(function() {

var faye = new Faye.Client('http://moesuperprilozhenie.ru:9292/faye');

faye.subscribe("/orders/update", function(data) {

eval(data);

});

});









8.プラグインjavascriptのリストにfaye.jsを追加します(メッセージサーバーから直接取得、この場合はmoesuperprilozhenie.ru:9292 / faye )。 Hamlの例:

= javascript_include_tag "http://moesuperprilozhenie.ru:9292/faye.js"









9.新しくねじ込まれたSelektelovskyプロセッサの負荷グラフを開き、喜んでください。



それが誰かを助けることを願っています。 Cometの使用方法、さまざまなチャット、ポケットベル、通知、およびさまざまな監視をランダムに一覧表示することは困難です。



UPD:この記事のコードはRailscastから引用されています。 ライアン・ベイツは敬意と敬意を払います。



All Articles