RubyおよびEvent Machineのチャットサーバー

最近、大規模なインターネットプロジェクト用の小さなチャットデーモンを作成するという課題に直面しました。 RubyとEvent Machineの助けを借りてこの問題を解決しました。 カットの下の詳細と小さな例。



ネイティブのRubyソケットで書かれたチャットの試用版の後、十分に大きな負荷では機能しないことが明らかになりました。 さらに、それは不安定に機能しました。 コードを最適化することにしました。 トピックに関する必要な情報の検索が特に成功しなかったので、このWebサーバーの作成方法を見つけるためにシンプロジェクトページにアクセスすることにしました。 。 私はその約束に感銘を受け、試してみることにしました。

Event Machineのドキュメントから理解したように、ライブラリはネイティブRubyソケットを使用せず、ネットワークでの作業時に異なるアプローチを実装し、イベント駆動型プログラミングモデルも提供します。

それでは、EventMachineで最も簡単なチャットサーバーの作成を始めましょう。 開始するには、gemをインストールする必要があります。

sudo gem install eventmachine

コードにはすぐにコメントを付けます:

require 'rubygems'
require 'eventmachine'

module ChatLogic

@@connections = [] #

#
def post_init
@@connections << self
end

#
def receive_data data
#
@@connections.each{ |connection| connection.send_data data }
end

#
def unbind
@@connections.delete(self)
end
end

#
EventMachine::run {
host,port = "0.0.0.0", 8090
EventMachine::start_server host, port, ChatLogic
puts "Listening #{host}:#{port}..."
}


ハイライトされたGitHubコード。

ご覧のとおり、EventMachine :: start_serverメソッドの3番目のパラメーターは、プロトコルまたはユーザー機能の宣言を含むモジュールの名前です。 このモジュールは、EventMachine :: Connectionクラスに混在します。

また、ChatLogicモジュールには、対応するイベントの発生時にEventMachineが自動的に呼び出す3つのメソッドがあります。post_init、receive_data(data)、unbindは、接続、データの受信、切断時に接続をトリガーします。 もちろん、モジュールでは、サーバー操作ロジックを実装するための他のメソッドとクラスを定義できますが、自分で呼び出す必要があるのは自分だけです。

そこで、イベントマシンライブラリを使用して、最もシンプルで高速で安定したRubyチャットサーバーのコードを提供しました。これはプログラマの注目に値するようで、Rubyだけでなく利用可能です。

Source: https://habr.com/ru/post/J61920/


All Articles