Skip to content

Commit

Permalink
SH-9 RabbitMq - Worker Queues
Browse files Browse the repository at this point in the history
  • Loading branch information
Onur Ozgur OZKAN committed Apr 25, 2014
1 parent ef21ed8 commit 91dfe74
Show file tree
Hide file tree
Showing 2 changed files with 104 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.
104 changes: 104 additions & 0 deletions source/posts/2014-04-25-rabbitmq-arka-plan-isleri-ornegi.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
---
title: RabbitMQ 1 - Arka Plan İşleri Örneği
date: 2014-04-25
author: onurozgurozkan
tags: rabbitmq, amqp, bunny, ruby, arkaplan işleri, tr
---

Bir önceki makalemizde 'RabbitMQ ile Merhaba Dünya Örneğini' yapmıştık. Bu örneğimizde ise özellikle Resque, DelayJob gibi arka plan işler için RabbitMQ kullanacağız.

This comment has been minimized.

Copy link
@baygunm

baygunm Apr 25, 2014

Contributor

Doğrusu hangisidir? DelayJob mı, DelayedJob mı?

This comment has been minimized.

Copy link
@onurozgurozkan

onurozgurozkan Apr 25, 2014

Ben fixleyeyim. Bağlantı da vereyim tam olsun.

This comment has been minimized.

Copy link
@baygunm

baygunm Apr 25, 2014

Contributor

👍


![Örnek 2](articles/2013-04-25-rabbitmq.png)

Bir önceki örnekte `Producer`, `Consumer`'ye 'Merhaba Dünya' yazısı gönderiyordu. Gerçek hayatta bu işlem arka plan işlemlere iyi bir örnek değildir. Arkaplan işleri daha çok süre gerektiren ve işlerin bir tek instance tarafından değilde bir den çok instance tarafından yapıldığı işlemlerdir. Yedek alma, rapor çıkarmak, resim düzenleme gibi işlemler bunlara örnektir. Bu işlemlerin ortak özelliği yapılmalarının vakit almasıdır.

This comment has been minimized.

Copy link
@baygunm

baygunm Apr 25, 2014

Contributor

değil de -> de ayrı yazılması gerekiyor,
bir den -> birden birleşik yazılması gerekiyor

This comment has been minimized.

Copy link
@onurozgurozkan

onurozgurozkan Apr 25, 2014

Fixed.


## Hazırlık

O zaman bu örneğimizde `Producer` mesajı gönderirken onun ne kadar süreceğinide textin içinde göndersin ki gerçek bir arkaplan işini simüle edelim. Örneğin `Hello ...` işleminin bitmesi 3 saniye sürerken `Hello .....` 5 saniye sürsün.

This comment has been minimized.

Copy link
@baygunm

baygunm Apr 25, 2014

Contributor

süreceğinide -> de ayrı yazımı düzeltelim

This comment has been minimized.

Copy link
@onurozgurozkan

onurozgurozkan Apr 25, 2014

Fixed.


Buna göre kodlarımızı düzenleyelim. `send.rb` artık yapılacak iş olduğundan `new_task.rb` demek daha doğru olur.

```ruby
msg = ARGV.empty? ? "Hello World!" : ARGV.join(" ")

q.publish(msg, :persistent => true)
puts " [x] Published #{msg}"
```

`receive.rb` dosyamızda işi yapan kod olduğuna göre ona da `worker.rb` demek daha doğru olacaktır.

This comment has been minimized.

Copy link
@baygunm

baygunm Apr 25, 2014

Contributor

👍


```ruby
q.subscribe(:ack => true, :block => true) do |delivery_info, properties, body|
puts " [x] Received #{body}"
# imitate some work
sleep body.count(".").to_i
puts " [x] Done"

ch.ack(delivery_info.delivery_tag)
end
```

Scriptlerimizi çalıştırabiliriz. Unutmayın scriptleri ayrı ayrı tablarda çalıştırmalısınız.

```bash
shell1$ ruby -rubygems worker.rb
shell2$ ruby -rubygems new_task.rb
```

## Sıra ile dağıtma

Worker Queue'nin en büyük avantajı yapılacak işlerin paralel yapılabilmesidir. Çok rahat bir şekilde yeni workerlar ekleyip uygulamanızı ölçeklendirebilirsiniz.

Aynı anda iki worker çalıştırırsanız aşağıdaki sonucu alacaksınız.

```bash
shell1$ ruby -rubygems worker.rb
[*] Waiting for messages. To exit press CTRL+C
```

```bash
shell2$ ruby -rubygems worker.rb
[*] Waiting for messages. To exit press CTRL+C
```

Mesajlarımızı gönderelim

```bash
shell3$ ruby -rubygems new_task.rb First message.
shell3$ ruby -rubygems new_task.rb Second message..
shell3$ ruby -rubygems new_task.rb Third message...
shell3$ ruby -rubygems new_task.rb Fourth message....
shell3$ ruby -rubygems new_task.rb Fifth message.....
```

Shell1 ve Shell2 için çıktılar

```bash
shell1$ ruby -rubygems worker.rb
[*] Waiting for messages. To exit press CTRL+C
[x] Received 'First message.'
[x] Received 'Third message...'
[x] Received 'Fifth message.....'
```

```bash
shell2$ ruby -rubygems worker.rb
[*] Waiting for messages. To exit press CTRL+C
[x] Received 'Second message..'
[x] Received 'Fourth message....'
```

Gördüğünüz gibi yapılacak işler shell1 ve shell2 arasında paylaşılmaktadir.

## Mesajların kabul edilmesi

## Mesajların devamlılığı

## Mesajların adil dağıtılması

## Hepsi bir arada

Saygılar.

### Kaynaklar

* [https://www.rabbitmq.com/tutorials/tutorial-one-ruby.html](https://www.rabbitmq.com/tutorials/tutorial-one-ruby.html)

1 comment on commit 91dfe74

@baygunm
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good work

Please sign in to comment.