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

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


All Articles