3

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)、クライアントが多すぎたり、待機時間が長すぎたりすると、頻繁に中止されます。

だから私の質問は

  1. HTTPストリームサーバーにWebSocketクライアントを実装する方法は? (Sinatra の代わりに別の lib を使用しても問題ありません)
  2. Sinatra Stream に WebSocket クライアントを実装できる場合、Sinatra Stream サーバーの安定性を向上させるにはどうすればよいですか? (IOError を避ける)

下手な英語でごめんなさい。どうもありがとうございました!

4

1 に答える 1

0

問題はかなり前に発生し、解決策の詳細を忘れていました。しかし、私の記憶力の弱さによると、このエラーを回避するには、Ruby のバージョンを更新する必要があります (>=ruby-2.1 は問題ないようです)。また、2 つの「書き込み」の間に数マイクロ秒の「スリープ」を追加しました。

Rubyのバージョンが主な理由だと思います。申し訳ありませんが、現在テストできません。

于 2015-11-13T22:12:22.843 に答える