RabbitMQ – wymiana wiadomości w rozproszonym środowisku

Wymiana wiadomości w rozproszonym środowisku, w tym również Big Data, między poszczególnymi komponentami jest realizowana przez dedykowany serwer do wymiany komunikatów taki jak np. RabbitMQ. Z kolei dzięki takim rozwiązaniom jak Docker można w szybki i prosty sposób sprawdzić jak w praktyce wysyłać oraz odbierać wiadomości do / z RabbitMQ

Obraz Dockera z RabbitMQ

Do poniższych testów wykorzystałem obraz rabbitmq:3-management, który można pobrać i uruchomić za pomocą polecenia:

$ docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 -p 5672:5672 rabbitmq:3-management

Uruchomiony kontener udostępnia dwa porty – 8080 do interfejsu webowego oraz 5672 jako domyślny port do komunikacji z serwerem RabbitMQ. Stan uruchomionego kontenera można sprawdzić np. za pomocą polecenia:

$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f3aa0517d15f rabbitmq:3-management "docker-entrypoint.sh" 5 minutes ago Up 5 minutes 4369/tcp, 5671-5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:8080->15672/tcp some-rabbit

Interfejs webowy do zarządzania serwerem RabbitMQ

Kod klienta wysyłającego oraz odbierającego wiadomości

Poniższy przykład kodu klienta wysyłającego oraz odbierającego wiadomości przygotowane na podstawie tutoriala dostępnego na oficjalnej stronie RabbitMQ. Ze względu na coraz większą popularność języka Python wykorzystano go do poniższych przykładów. Przed rozpoczęciem pracy konieczne jest zainstalowanie modułu pika wymaganego do komunikacji z serwerem RabbitMQ.

$ pip install pika
Collecting pika
Downloading pika-0.10.0-py2.py3-none-any.whl (92kB)
100% |████████████████████████████████| 102kB 1.2MB/s
Installing collected packages: pika
Successfully installed pika-0.10.0

W celu wysłania komunikatu można wykorzystać kod (plik rabbitmq_send.py):

#!/usr/bin/env python
import pika

# connect to RabbitMQ server started in Docker container
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.99.100'))
channel = connection.channel()

# create a queue
channel.queue_declare(queue='hello')

# send message to queue
channel.basic_publish(exchange='',
routing_key='hello',
body='Hello World!')
print(" [x] Sent 'Hello World!'")

# close connection
connection.close()

W celu odebrania wiadomości można wykorzystać kod (plik rabbitmq_receive.py):

#!/usr/bin/env python
import pika

# connect to RabbitMQ server started in Docker container
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.99.100'))
channel = connection.channel()

# get queue
channel.queue_declare(queue='hello')

# callback function, which is run when rabbitmq receive message
def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)

# when it receives message, then run callback
channel.basic_consume(callback,
                      queue='hello',
                      no_ack=True)

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

Po uruchomieniu każdego z programów komunikacja powinna zadziałać jak niżej:

$ ./rabbitmq_send.py
[x] Sent 'Hello World!'

$ ./rabbitmq_receive.py
[*] Waiting for messages. To exit press CTRL+C
[x] Received 'Hello World!'

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.

Time limit is exhausted. Please reload CAPTCHA.