ラベル Server の投稿を表示しています。 すべての投稿を表示
ラベル Server の投稿を表示しています。 すべての投稿を表示

2015年4月15日水曜日

RabbitMQ - 基本を学ぶ -

前回RabbitMQのインストールをしたので、RabbitMQの基本を学習していきます。
私自身がRabbitMQの初心者なので用語から学習していきます。言語はrubyを使います。

  • mac
  • vagrant1.7.2(cent os)

環境はcentosを利用します。ただ、今後はUbuntuに変更しようか迷っています。こういったデータもありますので…。
とりあえず今回のプロジェクトはcentosなので、centosを利用します。

git2.3.2をインストール

centos6.5のgitのバージョンは1.7.1です。せっかくなので2.3.1に変更します。


// yumをintsall 
sudo yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker
// source install
wget wget https://www.kernel.org/pub/software/scm/git/git-2.3.2.tar.gz
// 解凍
tar -zxf git-2.3.2.tar.gz

cd git-2.3.2
make prefix=/usr/local all
sudo make prefix=/usr/local install

// git version check
git --version
git version 2.3.2

ruby2.2.2をインストール


git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
rbenv --version
rbenv 0.4.0-146-g7ad01b2
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
rbenv install --list

  2.2.0
  2.2.1
  2.2.2
  2.3.0-dev

rbenv install 2.2.2
rbenv global 2.2.2
ruby -v

Hello worldの実装

まずはHello worldを実装して基本的な動きを理解します。

用語

  • producer : 送り手
  • consumer : 受け手

The Bunny client libraryをインストール

RabbitMQをrubyで動かすためのライブラリを導入します。


gem install bunny --version ">= 1.6.0"

上記ではグルーバルなgemを利用してますが、railsアプリ等を利用している人はBundlerを使いましょう。

送信

producer(send.rb)を作成


#!/usr/bin/env ruby
# encoding: utf-8

require "bunny"

conn = Bunny.new
conn.start

ch   = conn.create_channel
q    = ch.queue("hello")

ch.default_exchange.publish("Hello World!", :routing_key => q.name)
puts " [x] Sent 'Hello World!'"

conn.close         

メソッド名が非常に分かりやすく実装されています。

重要なポイントは"ch.default_exchange.publish("Hello World!", :routing_key => q.name)"の部分です。

exchangeはAMQPプロトコルのExchangeのことです。Exchangeは、生成されたMessageを受け取る役割を持ちます。
Routing keyはメッセージプロパティの一つです。デフォルトのExchangeはひとつのキューのメッセージへの道筋となります。

producer(send.rb)を実行


ruby send.rb
 [x] Sent 'Hello World!'

上記の処理ではExchangeから、"hello"というrouting_keyを指定して、キューに"Hello World!"というメッセージを設定しています。

受信

Consumer(receive.rb)を作成


#!/usr/bin/env ruby
# encoding: utf-8

require "bunny"

conn = Bunny.new(:automatically_recover => false)
conn.start

ch   = conn.create_channel
q    = ch.queue("hello")

begin
  puts " [*] Waiting for messages. To exit press CTRL+C"
  q.subscribe(:block => true) do |delivery_info, properties, body|
    puts " [x] Received #{body}"
  end
rescue Interrupt => _
  conn.close

  exit(0)
end      

consumer(receive.rb)を実行


ruby receive.rb
 [*] Waiting for messages. To exit press CTRL+C
 [x] Received Hello World!

上記のプログラムは、CTRL+Cを押すまで動き続けます。
もう一つターミナルを開いてsend.rbを実行してみてください。Consumer側のターミナルでsend.rbで送信したメッセージが表示されるはずです。

動作が確認できたら、これでHello worldは終了です。CTRL+Cでプログラムを止めましょう。

以上。(多分)まだ続きます。

参考サイト

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

RabbitMQ - インストールから設定まで -

RabbitMQを使用するための調査をしたので、まとめを記載します。
日本語の情報がかなり少ないけど、あまり使われていないのでしょうか…
テスト環境としてvagrantを利用します。

環境

  • mac
  • vagrant1.7.2(cent os)

記事履歴

  • 投稿:2015/04/14
  • 最終更新:2015/04/15

Erlang導入


// wget
wget https://www.rabbitmq.com/releases/erlang/erlang-17.4-1.el6.x86_64.rpm

// install erlang 
sudo rpm -ivh erlang-17.4-1.el6.x86_64.rpm

RabbitMQ導入


// wget
wget https://www.rabbitmq.com/releases/rabbitmq-server/v3.5.1/rabbitmq-server-3.5.1-1.noarch.rpm

// install RabbitMQ 
sudo rpm -ivh rabbitmq-server-3.5.1-1.noarch.rpm

chkconfig(サービス自動起動)の設定とサーバーの起動

RabbitMQ serverはパッケージとしてインストールされているので、デーモンとして起動されません。
なので、システムをブートした時にデフォルトでデーモンとして開始するために、以下のように設定をします。


// chkconfigの設定(自動起動)
sudo chkconfig rabbitmq-server on

// 状態を確認
chkconfig --list rabbitmq-server
rabbitmq-server 0:off 1:off 2:on 3:on 4:on 5:on 6:off

// サーバーを起動
sudo /sbin/service rabbitmq-server start
Starting rabbitmq-server: SUCCESS
rabbitmq-server.

Note: 上記の場合、RabbitMQはシステムユーザーrabbitmqとして動作している。
設定ファイルを変更する場合は、root、もしくはrabbitmqになって変更する必要があります。

動作確認


// ステータス確認
sudo rabbitmqctl status # sudo /sbin/service rabbitmq-server statusと同じ

[{pid,9967},
 {running_applications,[{rabbit,"RabbitMQ","3.5.1"},
                        {mnesia,"MNESIA  CXC 138 12","4.12.4"},
                        {os_mon,"CPO  CXC 138 46","2.3"},
                        {xmerl,"XML parser","1.3.7"},
                        {sasl,"SASL  CXC 138 11","2.4.1"},
                        {stdlib,"ERTS  CXC 138 10","2.3"},
                        {kernel,"ERTS  CXC 138 10","3.1"}]},
 {os,{unix,linux}},
 {erlang_version,"Erlang/OTP 17 [erts-6.3] [source] [64-bit] [async-threads:30] [kernel-poll:true]\n"},
 {memory,[{total,34863768},
          {connection_readers,0},
          {connection_writers,0},
          {connection_channels,0},
          {connection_other,2632},
          {queue_procs,2632},
          {queue_slave_procs,0},
          {plugins,0},
          {other_proc,13375752},
          {mnesia,57984},
          {mgmt_db,0},
          {msg_index,45136},
          {other_ets,732320},
          {binary,13416},
          {code,16576864},
          {atom,602729},
          {other_system,3454303}]},
 {alarms,[]},
 {listeners,[{clustering,25672,"::"},{amqp,5672,"::"}]},
 {vm_memory_high_watermark,0.4},
 {vm_memory_limit,192287539},
 {disk_free_limit,50000000},
 {disk_free,194548305920},
 {file_descriptors,[{total_limit,924},
                    {total_used,3},
                    {sockets_limit,829},
                    {sockets_used,1}]},
 {processes,[{limit,1048576},{used,123}]},
 {run_queue,0},
 {uptime,1244}]


ログ


// フォルダ移動
cd /var/log/rabbitmq 

tail -f rabbit@localhost.log
msg_store_persistent: using rabbit_msg_store_ets_index to provide index

=WARNING REPORT==== 14-Apr-2015::02:00:02 ===
msg_store_persistent: rebuilding indices from scratch

=INFO REPORT==== 14-Apr-2015::02:00:02 ===
started TCP Listener on [::]:5672

=INFO REPORT==== 14-Apr-2015::02:00:02 ===
Server startup complete; 0 plugins started.

Limits

Limitの数(スレッド数の上限)は、初期設定では少なすぎるので変更するべきです。
本番環境なら少なくとも65536にすることを薦めます。ただし、開発環境なら4096で十分です。


// プロセス数
ulimit -n
1024

// 変更(一時的に更新)
ulimit -S -n 4096

// プロセス数
ulimit -n
4096

Limitの変更方法は環境や状況に応じて異なります。ここが参考になります。

以上。続きます。

参考サイト

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加
Related Posts Plugin for WordPress, Blogger...