ActiveMQを使用したRuby on Railsアプリケーションのパフォーマンスの改善

私の投稿では、Ruby on railsフレームワークで書かれたプロジェクトでActiveMQを使用する可能性について話したいと思います。



メッセージキューとは何ですか?



MQは、アプリケーションコンポーネント間の非同期メッセージングアーキテクチャです。 つまり、送信者と受信者は異なる時間に対話できます。 このようなシステムは、ブローカーを介して相互作用するプロデューサー(送信者)とコンシューマ(受信者)で構成されます。



このようなシステムを使用すると、非同期モードでコードを実行することにより、アプリケーションのパフォーマンスを大幅に向上させることができます。 ユーザーがそのようなコードの完了を待たないように、サイトの一部の実行を遅くするコードがあるとします。非同期モードで実行することをお勧めします。 いくつかの簡単な例:

-サムネイルの生成。

-統計の収集;

-手紙/メッセージの配布;

-テーブルからのデータの削除。

-データのインデックス作成。

-データベースにデータをインポートします。



そのような例は数多くありますが、非同期モードで実行するために送信できるプロジェクトのコードの一部は誰でも見つけることができると思います。



ActiveMQとは何ですか?



ActiveMQは、メッセージブローカーシステムのオープンな実装です。 このシステムの利点は、高いパフォーマンス、オープン性、顧客をあらゆる言語で実装できることです。 ActiveMQは現在、次のプロトコルをサポートしています。

-OpenWire(独自のバイナリプロトコル);

-ストンプ;

-REST;

-WS通知;

-XMPP。



ActiveMQをインストールする



説明はLinuxについても当てはまりますが、Windowsにインストールしても問題はないはずです。 次のコマンドを実行します。



wget apache.multihomed.net/activemq/apache-activemq/5.2.0/apache-activemq-5.2.0-bin.tar.gz

tar xvf apache-activemq-5.2.0-bin.tar.gz

sudo cp -R ./apache-activemq-5.2.0 /usr/local/apache-activemq








インストールが完了しました。 ActiveMQを起動します。



sudo /usr/local/apache-activemq/bin/activemq &







すべて準備完了です。



Ruby on RailsでActiveMQを使用する



非同期モードでコードを実行することがいかに便利かを理解するために、まず実行に時間がかかるコードを作成しましょう。



rails test

cd test

script/generate controller test

script/server








テストコントローラーのコードを次の形式に変換します。



class TestController < ApplicationController

def index

self.class.benchmark('Write to file') do

path = File.join(RAILS_ROOT, 'tmp', 'test')

file_test = File.new(path, 'w')



10000000.times do

file_test.write("Some test message\n")

end

end



render :text => 'Data saved'

end

end








http://0.0.0.0 {000 / test / indexを開いて、コードの完了までしばらく待たなければならないことがわかります。 私のベンチマークでは、このコードは10秒間実行され、すべてのユーザーがそのような時間を待つ準備ができているわけではないことが示されました。



ActiveMQと対話するには、ActiveMessagingプラグインを使用することをお勧めします。Stompクライアントを直接使用できることに注意してください。 ただし、この場合、別のMQシステムに簡単かつ簡単に切り替えることができなくなります。



ActiveMessagingは、Ruby on Rails用のプラグインであり、非同期モードでコードを実行するプロジェクトで非常に簡単に使用できます。 Stompなど、多数のプロトコルをサポートしています。 ActiveMQを操作するために使用できます。



プロジェクトにインストールします。



script/plugin install activemessaging.googlecode.com/svn/trunk/plugins/activemessaging







stompプロトコルを使用するには、クライアントをインストールする必要もあります。



gem install stomp







インストールが完了しました。



ActiveMessagingには2つの構成ファイルがあります。

-config / broker.yml-接続の設定が含まれています。

-config / messaging.rb-キュー設定が含まれています。



非同期モードの実行可能コードは、いわゆるプロセッサーで記述されます。 最初のプロセッサを生成するには、次のコマンドを実行します。



script/generate processor Test







プロセッサ(/app/processors/test_proccesor.rb)を開き、テストコードをここに転送します。



class TestProcessor < ApplicationProcessor

subscribes_to :test



def on_message(message)

path = File.join(RAILS_ROOT, 'tmp', 'test')

file_test = File.new(path, 'w')



10000000.times do

file_test.write("#{message}\n")

end



logger.debug 'Data saved'

end

end








インデックスアクションコードを次のように変換します。



def index

publish :test, 'Some test message'

render :text => 'Message sent'

end








ここでは、「test test message」というメッセージをtestという名前で宛先に渡すだけです。つまり、プロデューサー関数を実行します。 構成ファイルconfig / messaging.rbを開くと、destination'a testという名前でキュー/キュー/テストが表示され、メッセージが送信されます。



デーモンを起動します。これは私たちのコンシューマーです。 キュー/キュー/テストからすべてのメッセージを読み取り、TestProcessorに渡します。



script/poller start







テストの純度を高めるために、データを書き込んだファイルを削除します。



rm /tmp/test







ページhttp://0.0.0.0 {000 / test / indexを更新し、コードがほぼ瞬時に実行されることをすぐに確認します。次に、tmpに移動し、これで新しく作成されたテストファイルを確認します。 ログに移動して、「データが保存されました」というメッセージを表示することもできます。



ほとんどの場合、いくつかのパラメーターを指定してコードを実行する必要があります。 XML、JSON、またはYamlのパラメーターを使用してハッシュを変換し、メッセージとして渡すことができます。 JSONが好きです。



記録された行数と、ファイルに書き込まれたメッセージ自体を転送してみましょう。 インデックスアクションを少し変更しましょう。



def index

publish :test, {:count => 200000, :message => 'Some new test message'}.to_json

render :text => 'Message sent'

end








on_messageメソッドも変更します。



def on_message(message)

options = JSON.parse(message).symbolize_keys

path = File.join(RAILS_ROOT, 'tmp', 'test')

file_test = File.new(path, 'w')



options[:count].times do

file_test.write("#{options[:message]}\n")

end



logger.debug 'Data saved'

end








rubyにはJSONを操作するための標準関数がないため、gemをインストールする必要があります。



sudo gem install json







TestProcessorにプラグインします。



require 'json'







ここで、デーモンの作業を中断して再起動します。



script/poller stop

script/poller start








ここでも、ページhttp://0.0.0.0 {000 / test / indexを更新します。 tmp / testファイルを開くと、「Some new test message」という行がすでに上書きされたファイルが表示されます。



通常のアクションと同様に、プロセッサでモデルを使用するのは非常に簡単です。 わかりやすくするための小さな例:



def on_message(message)

options = JSON.parse(message).symbolize_keys



Product.find(:all).each do |product|

product.price = options[:price]

product.save

end

end








ActiveMQには、送信されたメッセージの統計、キューのリスト、さらにはメッセージを送信できるユーティリティがあり、デバッグに使用すると非常に便利です。 http://0.0.0.0:8161/admin/にあります。



この投稿が、プロジェクトでActiveMQを使用することのシンプルさと利点を示したことを願っています。 プロジェクトで少しリファクタリングすると、アプリケーションの呼吸が異なります。



All Articles