diff --git a/source/assets/images/articles/2013-04-20-rabbitmq-1.png b/source/assets/images/articles/2013-04-20-rabbitmq-1.png new file mode 100644 index 00000000..a0eeb5bf Binary files /dev/null and b/source/assets/images/articles/2013-04-20-rabbitmq-1.png differ diff --git a/source/posts/2014-04-20-rabbitmq.md b/source/posts/2014-04-20-rabbitmq.md new file mode 100644 index 00000000..ab4ea53e --- /dev/null +++ b/source/posts/2014-04-20-rabbitmq.md @@ -0,0 +1,225 @@ +--- +title: RabbitMQ'ya Hızlı Bir Giriş +date: 2014-04-20 +author: onurozgurozkan +tags: rabbitmq, ruby, tr +--- + +## RabbitMQ nedir? + +RabbitMQ, [Pivotal](http://www.gopivotal.com/) firması tarafından Erlang ile geliştirilen [AMQP](http://www.amqp.org/) standartlarına göre geliştirilmiş robust mesajlaşma uygulamasıdır. + +## Kimler kullanmalı? + +* Ölçeklenebilir uygulamalar yapmak istiyenler. +* Birden fazla uygulamayı belli bir standartta haberleştirmek isteyenler. +* Uygulamanızdaki resim işleme, rapor oluşturma gibi uzun süreç işleri arka planda yapmak isteyenler. + +## Öne çıkan özellikleri + +* Robust mesajlaşma +* Kullanım kolaylığı +* Geniş bir işletim sistemini üzerinde çalıştırılabilmesi +* Geniş bir geliştirme platformunu desteklemesi +* Açık kaynaklı ve ticari desteğinin bulunması + +## Kurulum + +Bu makalede sadece OSX için Homebrew ile kurulumu anlatılacaktır. İleri tarihde belki diğerleride eklenebilir. + +### OSX'e Homebrew ile kurulumu + +```bash +brew update +brew install rabbitmq +``` + +Çıktı + +``` +==> Downloading http://www.rabbitmq.com/releases/rabbitmq-server/v3.3.0/rabbitmq-server-mac-standalone-3.3.0.tar.gz +######################################################################## 100.0% +==> /usr/bin/unzip -qq -j /usr/local/Cellar/rabbitmq/3.3.0/plugins/rabbitmq_management-3.3.0.ez rabbitmq_management-3.3.0/priv/www/cli/rabbitmqadmin +==> Caveats +Management Plugin enabled by default at http://localhost:15672 + +Bash completion has been installed to: + /usr/local/etc/bash_completion.d + +To have launchd start rabbitmq at login: + ln -sfv /usr/local/opt/rabbitmq/*.plist ~/Library/LaunchAgents +Then to load rabbitmq now: + launchctl load ~/Library/LaunchAgents/homebrew.mxcl.rabbitmq.plist +Or, if you don't want/need launchctl, you can just run: + rabbitmq-server +==> Summary + /usr/local/Cellar/rabbitmq/3.3.0: 1002 files, 26M, built in 119 seconds +``` + +Yukarıdaki çıktıdan anlaşıldığı gibi dikkat edilmesi gereken bir kaç konu vardır. + +* Eğer işletim sisteminin açılışında RabbitMQ çalışacak ise aşağıdaki kodları çalıştırmanız gerekmektedir. + +```bash +ln -sfv /usr/local/opt/rabbitmq/*.plist ~/Library/LaunchAgents +launchctl load ~/Library/LaunchAgents/homebrew.mxcl.rabbitmq.plist +``` + +* Eğer RabbitMQ'yu manuel çalıştıracaksanız aşağıdaki kodu çalıştırmanız yeterlidir. + +```bash +rabbitmq-server +``` + +Eğer `rabbitmq-server` komutunu OSX bulamadı ise `.bash_profile` veya `.zshrc` dosyalarınızda `/user/local/sbin` yoktur. `echo $PATH` komutu ile olup olmadığını anlarsınız. Eğer yoksa `/usr/local/sbin`'i `$PATH`'inize eklemelisiniz çünkü Brew RabbitMQ'yu oraya kurmaktadır. + +RabbitMQ'u serverı çalıştırdıktan sonra `http://localhost:15672/` adresinden yönetim paneline girebilirsiniz. Varsayılan ayarlarda aynı makineden bağlanabilmesi kaydı ile `guest` kullanıcı ismi ve `guest` şifresi ile bir kullanıcı tanımlanmıştır. + +## Genel Tanımlar + +Örneklere geçmeden önce RabbitMQ ve mesajlaşma ile ilgili bir kaç tanımı belirtmekte fayda vardır. + +* **Producer**, mesajı gönderen taraftır. `P` ile gösterilir. +* **Queue**, mesajların biriktiği havuzdur. Bir nevi mailbox gibi düşünülebilir. +* **Consumer**, mesajı alan taraftır. `C` ile gösterilir. + +NOT: Producer, Queue ve Consumerlar aynı makine üzerinde olmak zorunda değildir. + +Bu örneği Ruby dilinde yapacağız. RabbitMQ'nun Ruby Client'ı olarak [Bunny](http://rubybunny.info/)'i gemini kullanabiliriz. Bunny'i kurmak için `gem install bunny` demeniz yeterlidir. + +## Örnek 1 - Merhaba Dünya + +Şimdi basit bir 'Merhaba Dünya' uygulaması ile RabbitMQ'da ilk mesajımızı gönderecek ve alacağız. Aşağıdaki grafik yapılacak işlemi gösterecektir. + +![Örnek 1](articles/2013-04-20-rabbitmq-1.png) + +**Mesajın gönderilmesi** + +* RabbitMQ'ya bağlanmak için + +```ruby +#!/usr/bin/env ruby +# encoding: utf-8 + +require "bunny" + +conn = Bunny.new(:automatically_recover => false) +conn.start +``` + +* Yeni bir kanal yaratmak için + +```ruby +ch = conn.create_channel +``` + +* Yaratılan kanaldan bir queue isimlendirip mesaj göndermek için + +```ruby +q = ch.queue("hello") +ch.default_exchange.publish("Hello World!", :routing_key => q.name) +puts " [x] Sent 'Hello World!'" +``` + +* Bağlantıyı kapatmak için + +```ruby +conn.close +``` + +* Hepsini birleştirip `sender.rb` dosyasını oluşturalım. + +```ruby +#!/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") +ch.default_exchange.publish("Hello World!", :routing_key => q.name) +puts " [x] Sent 'Hello World!'" + +conn.close +``` + +**Mesajın alınması** + +* RabbitMQ'a bağlanmak, yeni bir kanal açmak ve kuyruğu tanımlamak için + +```ruby +#!/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") +``` + +* Mesajları dinlemek için `Bunny::Queue#subscribe` methodu kullanılır. + +```ruby +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 +``` + +* Hepsini birleştirip `receiver.rb` dosyasını oluşturalım. + +```ruby +#!/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 +``` + +**Terminalden dosyaları çalıştıralım.** + +Unutmayın ayrı ayrı sekmelerde çalıştıracaksınız! + +```bash +$ ruby -rubygems send.rb +$ ruby -rubygems receive.rb +``` + +Sonuçları terminal çıktılarından görebileceğiniz gibi `http://localhost:15672/` adresinden veya terminalden `rabbitmqctl list_queues` kodu ile de görebilirsiniz. + +Bundan sonraki makalemiz RabbitMQ ve iş kuyrukları üzerine olacaktır. + +Saygılar. + +### Kaynaklar + +* [http://en.wikipedia.org/wiki/RabbitMQ](http://en.wikipedia.org/wiki/RabbitMQ) +* [https://www.rabbitmq.com/install-homebrew.html](https://www.rabbitmq.com/install-homebrew.html) +* [https://www.rabbitmq.com/tutorials/tutorial-one-ruby.html](https://www.rabbitmq.com/tutorials/tutorial-one-ruby.html) \ No newline at end of file