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!'