Sinatra::Streaming (Ruby を使用) を使用して HTTP サーバー (A) を作成します。WebSocket サーバー (B) からデータを読み取り、それをクライアント (C) に転送する必要があります。データの流れは「B→A→C」です。読み取り操作と書き込み操作はリアルタイムで行う必要があります。
可能な解決策として、Sinatra で WebSocket 接続を作成しようとしました。コードはこんな感じ:</p>
class Deploy < Sinatra::Base
helpers Sinatra::Streaming
set :sessions, true
set :server, 'thin'
get '/' do
stream(:keep_open) do |out|
#create a WebSocket connection
EM.run {
ws = Faye::WebSocket::Client.new('ws://0.0.0.0:8080/')
ws.on :message do |event|
out << event.data
out.flush
end
ws.on :close do |event|
ws = nil
end
}
end
end
end
faye-websocket など、いくつかの WebSocket クライアント ライブラリを試しました。~/.rvm/gems/ruby-2.0.0-p598/gems/sinatra-contrib-1.4.2/lib/sinatra/streaming.rb:100:in '<<': not opened for writing (IOError)の実行時と同様にプログラムが失敗しましたout << event.data。同時に WebSocket 接続が閉じられました。
WebSocket の IO が Sinatra Stream の IO を競合/クローズしているようです。
現在、WebSocket 接続を確立するためのサブプロセスを作成し、サブプロセスが Sinatra サーバー (A) と通信できるようにします。しかし、数十人が A にアクセスすると、システム リソースを消費しすぎる可能性があります。さらに、Sinatra Stream サーバーはnot opened for writing (IOError)、クライアントが多すぎたり、待機時間が長すぎたりすると、頻繁に中止されます。
だから私の質問は
- HTTPストリームサーバーにWebSocketクライアントを実装する方法は? (Sinatra の代わりに別の lib を使用しても問題ありません)
- Sinatra Stream に WebSocket クライアントを実装できる場合、Sinatra Stream サーバーの安定性を向上させるにはどうすればよいですか? (IOError を避ける)
下手な英語でごめんなさい。どうもありがとうございました!