-
Notifications
You must be signed in to change notification settings - Fork 21
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Onur Ozgur OZKAN
committed
Apr 20, 2014
1 parent
ef21ed8
commit 801dd02
Showing
2 changed files
with
225 additions
and
0 deletions.
There are no files selected for viewing
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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) |