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