21

Railsアプリケーションがあり、それに何らかのWebSocketサポートを追加したいと考えています。さまざまなグーグルから、Rubyベースの最高のWebSocketソリューションはEventMachineで実行されているem-websocketであるように見えます。

EventMachineリアクターをRailsに「統合」する方法があるかどうか疑問に思いました。初期化コードはどこに置きますか?これはこれを達成するための適切な方法ですか?

SinatraにフォールバックしてEventMachineリクエストを実行するこの例を見GETたことがありますが、それは私が探しているものではありません。

どんな助けでも大歓迎です。

4

8 に答える 8

9

Rails プロセスの 1 つを永続的にブロックする永続的な実行ループであるため、Rails 自体の内部で Eventmachine エンジンを実行することはできません。通常行われるのは、Eventmachine を使用するサイドプロセスがあり、Rails がソケットを介してそれと通信して通知を送信することです。

Juggernautは、Websocket クライアントと Rails フックを実装して通知を送信するこの種の例として役立ちます。プロジェクトはその後、JavaScript Node.js バージョンを支持して Ruby バージョンを非推奨にしましたが、これは依然として Eventmachine の使用方法の非常に完全な例として役立ちます。

于 2011-04-27T04:53:07.073 に答える
6

レール アプリケーションをシン サーバー (bundle exec thin start) で実行する場合、シン サーバーで EventMachine を実行すると、レール アプリケーションは必要な場所で EM コードを実行できます。

例:

そのコードを持つライブラリ o 初期化子:

EM.next_tick do
  EM.add_periodic_timer(20) do
    puts 'from Event Machine in rails code'
  end
end

Railsプロセスのアプリケーションをブロックしません。

于 2011-12-02T12:55:14.897 に答える
4

私はこれを調べるのにかなりの時間を費やしました。EventMachine はレール インストールでスレッドとして実行する必要があり (Thin を使用している場合を除く)、Passenger にはいくつかの特別な考慮事項があります。ここに実装を書きました: http://www.hiringthing.com/2011/11/04/eventmachine-with-rails.html

アップデート

この構成を Momentarily という gem に引き出しました。ソースはこちらhttps://github.com/eatenbyagrue/momentarily

于 2011-11-04T18:58:34.443 に答える
2

em-synchronyを使用して、ファイバーでリアクターを起動してみます。Railsアプリでは、WebSocketリクエストに応答するためにリアクターを実行したままにしておきたいように聞こえるので、おそらくイニシャライザーで開始できます。他の回答で示唆されているように、reactorとのソケット通信をセットアップするか、reactorとrailsの両方のコードがデータを交換するために読み書きできるデータストアへの非同期クライアントの1つを使用する必要があると思います。

私の同僚の何人かは、EventMachine内でテストを実行するために、ルビーコードでオンデマンドでEMリアクターを起動するいくつかの例をまとめました。考えられる例としてそれを使用してみます。eventmachineによるレーキとテスト

于 2011-04-27T06:07:52.377 に答える
2

Crampを検討することを検討します。これは EventMachine の上に構築された非同期フレームワークであり、シン サーバーをサポートします。

Rack ミドルウェアのサポート + Rainbows! およびシン Web サーバー

于 2012-03-23T05:36:50.460 に答える
0

私は同じ問題を抱えていて、解決策を見つけました。まず、コードをlibdir (例: /lib/listener/init.rb) に配置し、EM を実行するクラス メソッドを 1 つ作成します(例: ) Listener.run

#!/usr/bin/env ruby

require File.expand_path('../../config/environment', File.dirname(__FILE__))

class Listener
  def self.run
  # your code here
  # you can access your models too
  end
end

その後ダンテジェムを使用。ファイルを作成し/init/listenerます。コードは次のようになります。

#!/usr/bin/env ruby

require File.expand_path('../../lib/listener/init.rb', __FILE__)

log_file = File.expand_path('../../log/listener.stdout.log', __FILE__)
pid_file = File.expand_path('../../tmp/listener.pid', __FILE__)

listener = Dante::Runner.new('listener')

if ARGV[0] === 'start'
  listener.execute(daemonize: true,
                   pid_path: pid_file,
                   log_path: log_file) { Listener.run }
elsif ARGV[0] === 'restart'
  listener.execute(daemonize: true,
                   restart: true,
                   pid_path: pid_file,
                   log_path: log_file) { Listener.run }
elsif ARGV[0] === 'stop'
  listener.execute(kill: true, pid_path: pid_file)
end

これで、次のようなコードを実行できます: ./bin/listener start, ./bin/listener restart,./bin/listener stop

Godを使用して、リスナーの実行を監視できます。ただし、同じ pid ファイル ( /tmp/listener.pid) を使用していることを確認してください。

于 2016-12-13T01:47:15.023 に答える
0

できれば EM をこれ以上使用するべきではありません。EM はメンテナンスされていないようです。バグに遭遇した場合は、自己責任で行ってください。

https://github.com/eventmachine/eventmachine/issues/479 - つまり、パターン:

Thread.new{ EM.run }

によって使用されEM::Synchrony、インターネット上で見つかったさまざまな回答 ( EventMachine や Ruby スレッド - ここで実際に何が起こっているのか?など) は、JRuby の eventmachine 実装では壊れています (ファイバーは jruby のスレッドであり、現在、これがいつ変更されるかについてのロードマップはありません)。

JRuby メッセージング オプションは次のようになります。

  1. TorqueBox (HornetQ にバンドルされています)、http: //torquebox.org/news/2011/08/15/websockets-stomp-and-torquebox/ を使用して展開します。 Java の背景
  2. Faye の新しいバージョンは JRuby で動作するはずです。Faye は jruby on rails で動作します
  3. 将来のために注意してください。セルロイドコミュニティに注目してください。そこからいくつかの興味深い分散ソリューションが生まれています https://github.com/celluloid/reel/wiki/WebSocketshttps://github.com/celluloid/dcell
  4. ?
于 2013-12-24T06:42:10.323 に答える