logo
post image
user image

DIGITAL GENERATION

Muallif

July 19, 2024

216

RabbitMQ haqida, ishga tushirish va python'da ishlash

Python

RabbitMQ - xabarlar menjeri bo'lib, u Erlang dasturlash tilida yozilgan. U bir nechta xizmat(servis)lar o'rtasida ma'lumotlarni yuborish(xabarlar) uchun mo'ljallangan: bitta xizmat navbatga xabar joylaydi, boshqa xizmat esa o'sha xabarni qabul qiladi.

RabbitMQ - xabarlar menjeri bo'lib, u Erlang dasturlash tilida yozilgan. U bir nechta xizmat(servis)lar o'rtasida ma'lumotlarni yuborish(xabarlar) uchun mo'ljallangan: bitta xizmat navbatga xabar joylaydi, boshqa xizmat esa o'sha xabarni qabul qiladi.

Quyida RabbitMQ'ni o'rnatish, uni ishga tushirish va Python dasturlash tili yordamida RabbitMQ bilan ishlash ko'rsatilgan.

O'rnatish

Arch Linux'ga o'rnatish uchun terminaldan quyidagi buyruq beriladi:


 

bash

Копировать код

sudo pacman -S rabbitmq

Debian/Ubuntuga o'rnatish uchun terminaldan quyidagi buyruq beriladi:


 

bash

Копировать код

apt install rabbitmq-server

Yoki bo'lmasa, Docker orqali ishga tushirish quyidagicha:


 

bash

Копировать код

docker run docker pull rabbitmq

RabbitMQ rabbit-plugins yordamida plagin(plugins)lar bilan ishlash imkoni beradi.

Faol plaginlarni ko'rish uchun quyidagi buyruq beriladi:


 

bash

Копировать код

admin@ip-172-31-33-210:~$ sudo rabbitmq-plugins list

rabbitmq_management plaginini faollashtiramiz:


 

bash

Копировать код

admin@ip-172-31-33-210:~$ sudo rabbitmq-plugins enable rabbitmq_management

Faol plaginlar /etc/rabbitmq/enabled_plugins faylida saqlanadi:


 

bash

Копировать код

root@ip-172-31-33-210:/home/admin# cat /etc/rabbitmq/enabled_plugins [rabbitmq_management].

HTTP API

rabbitmq_management plagini RabbitMQ'dan API orqali 15672 portda foydalanish imkonini beradi:


 

bash

Копировать код

root@ip-172-31-33-210:/home/admin# netstat -anp | grep 15672

So'rovga misol:


 

bash

Копировать код

root@ip-172-31-33-210:/home/admin# curl -i -u guest:guest localhost:15672/api/overview

rabbitmqadmin python'dan yaratilgan dasturiy uskuna bo'lib, HTTP API yordamida turli xil operatsiyalar bajarish imkonini beradi, masalan, navbatlarni ko'rish, almashish nuqtalarni kuzatish, foydalanuvchilarni tekshirish va boshqalar. U rabbitmq_management plaginini talab qiladi.

rabbitmqctl

Bu plagin asosan klasterdagi nodlarni boshqarish uchun qo'llaniladi - yangi qo'shish, o'chirish, qayta ishga tushirish va loglarni boshqarish uchun.

Shunga o'xshash rabbitmqadmin plagini foydalanuvchilarni, navbatlarni, almashinuv nuqtalarini boshqarish uchun ishlatilinadi.


 

bash

Копировать код

root@ip-172-31-33-210:/home/admin# rabbitmqctl status

Foydalanuvchilarni ko'rish:


 

bash

Копировать код

root@ip-172-31-33-210:/home/admin# rabbitmqctl list_users

Web-UI

Plagin faollashtirilganidan so'ng, veb interfeys orqali unga ulanish mumkin: localhost:15672

guest foydalanuvchi taqiqlangan. Shu sababli yangi foydalanuvchi qo'shib olamiz:


 

bash

Копировать код

root@ip-172-31-33-210:/home/admin# rabbitmqctl add_user test test

Uni administrator qilib belgilaymiz:


 

bash

Копировать код

root@ip-172-31-33-210:/home/admin# rabbitmqctl set_user_tags test administrator

Va unga barcha huquqlarni beramiz:


 

bash

Копировать код

root@ip-172-31-33-210:/home/admin# rabbitmqctl set_permissions -p / test ".*" ".*" ".*"

RabbitMQ ni ichiga kiramiz:

RabbitMQ'ning 4 ta muhim tushunchasi bor:

  • producer - mijoz, u xabarlarni yubadi;
  • queue - xabarlar navbati;
  • consumer - mijoz, u navbatdan xabarlarni oladi;
  • exchange - u producerdan xabarlarni oladi, xabar turiga qarab uni kerakli navbatga yuboradi.

Misol. RabbitMQ bilan ishlash uchun AMQP (Advanced Message Queuing Protocol) kerak bo'ladi. Python'da u bilan pika, py-amqplib va boshqa kutubxonalar yordamida ishlash mumkin.

pika kutubxonasini o'rnatamiz:


 

bash

Копировать код

apt install python-pika

Xabar yuborish

producer uchun skript yozamiz, u navbatga xabar yuboradi:


 

python

Копировать код

#!/usr/bin/env python import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() channel.queue_declare(queue='hello') channel.basic_publish(exchange='', routing_key='hello', body='Hello World!') print(" [x] Sent 'Hello World!'") connection.close()

Bu yerda quyidagilar bajariladi:

  • localhost'dagi rabbitmq serverga bog'lanish - connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
  • hello nomli navbat yaratiladi - queue_declare(queue='hello')
  • Xabar almashinuvi nuqtasi(exchange) orqali navbatga hello(routing_key='hello') xabar yuboriladi.
  • Server bilan bog'lanish yopiladi - connection.close()

Skriptni ishga tushiramiz:


 

bash

Копировать код

admin@ip-172-31-33-210:~$ ./producer.py

rabbitmqadmin orqali tekshiramiz:


 

bash

Копировать код

root@ip-172-31-33-210:/home/admin# rabbitmqadmin get queue='hello'

rabbitmqctl buyruqi orqali navbatlar ro'yxatini tekshiramiz:


 

bash

Копировать код

root@ip-172-31-33-210:/home/admin# rabbitmqctl list_queues

hello navbatida 1 dona xabar mavjud. Uni qabul qilamiz.

Navbatdan xabarni o'qib olish

Ikkinchi skript consumer.py - navbatdan xabarni qabul qiladi va uni ekranga chiqaradi:


 

python

Копировать код

#!/usr/bin/env python import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() channel.queue_declare(queue='hello') def callback(ch, method, properties, body): print(" [x] Received %r" % body) channel.basic_consume(callback, queue='hello', no_ack=True) print(' [*] Waiting for messages. To exit press CTRL+C') channel.start_consuming()

Bu yerda quyidagilar bajariladi:

  • Birinchi skript kabi rabbitmq bilan bog'lanamiz;
  • Agar hello nomli navbat bo'lmasa, u yaratilinadi;
  • callback() funksiyasini yaratamiz, u xabarni qabul qiladi va uni ekranga chiqaradi;
  • Uni basic_consume() ni chaqiramiz, unga navbat nomi yuboramiz;
  • Cheksiz siklni ishga tushiramiz start_consuming().

Ishga tushiramiz:


 

bash

Копировать код

root@ip-172-31-33-210:/home/admin# ./consumer.py

Navbatni tekshiramiz, endi u bo'sh!


 

bash

Копировать код

root@ip-172-31-33-210:/home/admin# rabbitmqctl list_queues

Izohlar