1

Rails-Appの場合、新しいデータがアップロードされた場合、接続されているすべてのクライアントに電話をかける必要があります。だから私はwebsocketを使いたいです。現在、新しいスレッドでソケットサーバーを起動するイニシャライザーに新しいファイルを作成しました。

require 'em-websocket'

$websocket_clients = []

Thread.new do
  EventMachine.run {
    EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 8080) do |ws|
      ws.onopen {
        $websocket_clients << ws
      }

      ws.onclose {
        $websocket_clients.delete(ws)
      }

    end
  }
end

だから私は使うことができます

$websocket_clients.each do |ws|
  ws.send "text"
end

私のコントローラーで。
今の私の質問は次のとおりです。これは良い習慣ですか、それとも私はそれで何か問題を経験しますか?

4

1 に答える 1

0

これにより、アプリケーションをデポリするときに問題が発生する可能性があります。アプリケーションをデプロイするときは、通常、それぞれがリクエストを処理する複数のワーカープロセスをフォークします-少なくとも2つの最も人気のあるサーバー(Phusion Passengerとunicorn)で。

各サーバーはWebSocketスレッドを開始しようとします。最初のポートはスムーズに起動し、ポートが最初のポートによってブロックされているため、次のポートはおそらくクラッシュします。この問題を修正し、上記のようにコードを使用してクライアントにメッセージを配信している場合は、おそらく大きな問題なく機能します。

ただし、ActiveRecordでスレッドセーフを有効にしない限り、データベースのクエリを開始すると問題が発生します。アプリケーションのWebSocket部分が大きくなった場合、サーバープロセスとは別にリクエストを処理する追加のデーモンに配置できます。

于 2012-08-01T23:04:39.390 に答える