Skip to content

Commit

Permalink
SH-7 RabbitMQ
Browse files Browse the repository at this point in the history
  • Loading branch information
Onur Ozgur OZKAN committed Apr 20, 2014
1 parent ef21ed8 commit 801dd02
Show file tree
Hide file tree
Showing 2 changed files with 225 additions and 0 deletions.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
225 changes: 225 additions & 0 deletions source/posts/2014-04-20-rabbitmq.md
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)

0 comments on commit 801dd02

Please sign in to comment.