diff --git a/.idea/.name b/.idea/.name
new file mode 100644
index 0000000..3ad0378
--- /dev/null
+++ b/.idea/.name
@@ -0,0 +1 @@
+Consumer_1.py
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..74ac817
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tukaeva_alfiya_lab_4/.idea/.gitignore b/tukaeva_alfiya_lab_4/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/tukaeva_alfiya_lab_4/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/tukaeva_alfiya_lab_4/.idea/inspectionProfiles/Project_Default.xml b/tukaeva_alfiya_lab_4/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..f966c2e
--- /dev/null
+++ b/tukaeva_alfiya_lab_4/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tukaeva_alfiya_lab_4/.idea/inspectionProfiles/profiles_settings.xml b/tukaeva_alfiya_lab_4/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/tukaeva_alfiya_lab_4/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tukaeva_alfiya_lab_4/.idea/misc.xml b/tukaeva_alfiya_lab_4/.idea/misc.xml
new file mode 100644
index 0000000..442f653
--- /dev/null
+++ b/tukaeva_alfiya_lab_4/.idea/misc.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/tukaeva_alfiya_lab_4/.idea/modules.xml b/tukaeva_alfiya_lab_4/.idea/modules.xml
new file mode 100644
index 0000000..9af9c9d
--- /dev/null
+++ b/tukaeva_alfiya_lab_4/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tukaeva_alfiya_lab_4/.idea/tukaeva_alfiya_lab_4.iml b/tukaeva_alfiya_lab_4/.idea/tukaeva_alfiya_lab_4.iml
new file mode 100644
index 0000000..d0876a7
--- /dev/null
+++ b/tukaeva_alfiya_lab_4/.idea/tukaeva_alfiya_lab_4.iml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tukaeva_alfiya_lab_4/.idea/vcs.xml b/tukaeva_alfiya_lab_4/.idea/vcs.xml
new file mode 100644
index 0000000..6c0b863
--- /dev/null
+++ b/tukaeva_alfiya_lab_4/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tukaeva_alfiya_lab_4/1_lesson/receive.py b/tukaeva_alfiya_lab_4/1_lesson/receive.py
new file mode 100644
index 0000000..f118e0a
--- /dev/null
+++ b/tukaeva_alfiya_lab_4/1_lesson/receive.py
@@ -0,0 +1,25 @@
+import pika, sys, os
+
+def main():
+ connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
+ channel = connection.channel()
+
+ channel.queue_declare(queue='hello')
+
+ def callback(ch, method, properties, body):
+ print(f" [x] Received {body}")
+
+ channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=True)
+
+ print(' [*] Waiting for messages. To exit press CTRL+C')
+ channel.start_consuming()
+
+if __name__ == '__main__':
+ try:
+ main()
+ except KeyboardInterrupt:
+ print('Interrupted')
+ try:
+ sys.exit(0)
+ except SystemExit:
+ os._exit(0)
\ No newline at end of file
diff --git a/tukaeva_alfiya_lab_4/1_lesson/send.py b/tukaeva_alfiya_lab_4/1_lesson/send.py
new file mode 100644
index 0000000..41cfff2
--- /dev/null
+++ b/tukaeva_alfiya_lab_4/1_lesson/send.py
@@ -0,0 +1,11 @@
+import pika
+
+connection = pika.BlockingConnection(
+ pika.ConnectionParameters(host='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()
\ No newline at end of file
diff --git a/tukaeva_alfiya_lab_4/2_lesson/new_task.py b/tukaeva_alfiya_lab_4/2_lesson/new_task.py
new file mode 100644
index 0000000..a2444e0
--- /dev/null
+++ b/tukaeva_alfiya_lab_4/2_lesson/new_task.py
@@ -0,0 +1,19 @@
+import pika
+import sys
+
+connection = pika.BlockingConnection(
+ pika.ConnectionParameters(host='localhost'))
+channel = connection.channel()
+
+channel.queue_declare(queue='task_queue', durable=True)
+
+message = ' '.join(sys.argv[1:]) or "Hello World!"
+channel.basic_publish(
+ exchange='',
+ routing_key='task_queue',
+ body=message,
+ properties=pika.BasicProperties(
+ delivery_mode=pika.DeliveryMode.Persistent
+ ))
+print(f" [x] Sent {message}")
+connection.close()
\ No newline at end of file
diff --git a/tukaeva_alfiya_lab_4/2_lesson/worker.py b/tukaeva_alfiya_lab_4/2_lesson/worker.py
new file mode 100644
index 0000000..34cb8f7
--- /dev/null
+++ b/tukaeva_alfiya_lab_4/2_lesson/worker.py
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+import pika
+import time
+
+connection = pika.BlockingConnection(
+ pika.ConnectionParameters(host='localhost'))
+channel = connection.channel()
+
+channel.queue_declare(queue='task_queue', durable=True)
+print(' [*] Waiting for messages. To exit press CTRL+C')
+
+
+def callback(ch, method, properties, body):
+ print(f" [x] Received {body.decode()}")
+ time.sleep(body.count(b'.'))
+ print(" [x] Done")
+ ch.basic_ack(delivery_tag=method.delivery_tag)
+
+
+channel.basic_qos(prefetch_count=1)
+channel.basic_consume(queue='task_queue', on_message_callback=callback)
+
+channel.start_consuming()
\ No newline at end of file
diff --git a/tukaeva_alfiya_lab_4/3_lesson/emit_log.py b/tukaeva_alfiya_lab_4/3_lesson/emit_log.py
new file mode 100644
index 0000000..45b6989
--- /dev/null
+++ b/tukaeva_alfiya_lab_4/3_lesson/emit_log.py
@@ -0,0 +1,13 @@
+import pika
+import sys
+
+connection = pika.BlockingConnection(
+ pika.ConnectionParameters(host='localhost'))
+channel = connection.channel()
+
+channel.exchange_declare(exchange='logs', exchange_type='fanout')
+
+message = ' '.join(sys.argv[1:]) or "info: Hello World!"
+channel.basic_publish(exchange='logs', routing_key='', body=message)
+print(f" [x] Sent {message}")
+connection.close()
\ No newline at end of file
diff --git a/tukaeva_alfiya_lab_4/3_lesson/receive_logs.py b/tukaeva_alfiya_lab_4/3_lesson/receive_logs.py
new file mode 100644
index 0000000..60d881d
--- /dev/null
+++ b/tukaeva_alfiya_lab_4/3_lesson/receive_logs.py
@@ -0,0 +1,22 @@
+import pika
+
+connection = pika.BlockingConnection(
+ pika.ConnectionParameters(host='localhost'))
+channel = connection.channel()
+
+channel.exchange_declare(exchange='logs', exchange_type='fanout')
+
+result = channel.queue_declare(queue='', exclusive=True)
+queue_name = result.method.queue
+
+channel.queue_bind(exchange='logs', queue=queue_name)
+
+print(' [*] Waiting for logs. To exit press CTRL+C')
+
+def callback(ch, method, properties, body):
+ print(f" [x] {body}")
+
+channel.basic_consume(
+ queue=queue_name, on_message_callback=callback, auto_ack=True)
+
+channel.start_consuming()
\ No newline at end of file
diff --git a/tukaeva_alfiya_lab_4/Consumer_1.py b/tukaeva_alfiya_lab_4/Consumer_1.py
new file mode 100644
index 0000000..2018626
--- /dev/null
+++ b/tukaeva_alfiya_lab_4/Consumer_1.py
@@ -0,0 +1,26 @@
+import random
+import time
+import pika
+
+queue_name = 'queue_1'
+exchange = 'logs'
+
+
+def callback(ch, method, properties, body):
+ print(f" [Consumer_1] - получено сообщение - {body.decode()}")
+ time.sleep(random.choice([2, 3]))
+ print(f" [Consumer_1] - сообщение обработано")
+ print()
+ ch.basic_ack(delivery_tag=method.delivery_tag)
+
+
+if __name__ == '__main__':
+ connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
+ channel = connection.channel()
+ try:
+ channel.queue_declare(queue=queue_name)
+ channel.queue_bind(exchange=exchange, queue=queue_name)
+ channel.basic_consume(queue=queue_name, on_message_callback=callback)
+ channel.start_consuming()
+ except KeyboardInterrupt:
+ connection.close()
\ No newline at end of file
diff --git a/tukaeva_alfiya_lab_4/Consumer_2.py b/tukaeva_alfiya_lab_4/Consumer_2.py
new file mode 100644
index 0000000..533fac8
--- /dev/null
+++ b/tukaeva_alfiya_lab_4/Consumer_2.py
@@ -0,0 +1,25 @@
+import pika
+
+queue_name = 'queue_2'
+exchange = 'logs'
+
+
+def callback(ch, method, properties, body):
+ print(f" [Consumer_2] - получено сообщение - {body.decode()}")
+ print(f" [Consumer_2] - сообщение обработано")
+ print()
+ ch.basic_ack(delivery_tag=method.delivery_tag)
+
+
+if __name__ == '__main__':
+ connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
+ channel = connection.channel()
+ try:
+ # своя не анонимная очередь
+ channel.queue_declare(queue=queue_name)
+ # binding на exchange
+ channel.queue_bind(exchange=exchange, queue=queue_name)
+ channel.basic_consume(queue=queue_name, on_message_callback=callback)
+ channel.start_consuming()
+ except KeyboardInterrupt:
+ connection.close()
diff --git a/tukaeva_alfiya_lab_4/Publisher.py b/tukaeva_alfiya_lab_4/Publisher.py
new file mode 100644
index 0000000..6f6efb2
--- /dev/null
+++ b/tukaeva_alfiya_lab_4/Publisher.py
@@ -0,0 +1,17 @@
+import random
+import time
+
+import pika
+
+if __name__ == '__main__':
+ connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
+ channel = connection.channel()
+ channel.exchange_declare(exchange='logs', exchange_type='fanout')
+
+ try:
+ while True:
+ message = random.choice(['SIGABRT', 'SIGALRM', 'SIGKILL', 'SIGSTOP', 'SIGTERM', 'SIGINT', 'SIGQUIT'])
+ channel.basic_publish(exchange='logs', routing_key='', body=message)
+ time.sleep(1)
+ except KeyboardInterrupt:
+ connection.close()
\ No newline at end of file
diff --git a/tukaeva_alfiya_lab_4/README.md b/tukaeva_alfiya_lab_4/README.md
new file mode 100644
index 0000000..e290983
--- /dev/null
+++ b/tukaeva_alfiya_lab_4/README.md
@@ -0,0 +1,53 @@
+# Лабораторная работа №4 - Работа с брокером сообщений
+
+## Задание
+
+
+* Установить брокер сообщений RabbitMQ.
+* Пройти уроки 1, 2 и 3 из RabbitMQ Tutorials на любом языке программирования.
+* Продемонстрировать работу брокера сообщений.
+
+## Работа программы:
+
+Класс ```Publisher``` успешно осуществляет отправку сообщений своим клиентам.
+
+Класс ```Consumer1``` осуществляет принятие и обработку сообщений с задержкой в 3 секунды, это можно заметить на видео.
+
+Класс ```Consumer2``` мгновенно осуществляет принятие и обработку сообщений.
+
+### Уроки
+
+ 1. lesson_1
+
+![](lesson_1.png "")
+
+ 2. lesson_2
+
+![](lesson_2.png "")
+
+ 3. lesson_3
+
+![](lesson_3.png "")
+
+## Работа с RabbitMQ Management UI
+
+![](rabbitmq.png "")
+
+### Показания очереди queue_1 при одном запущенном экземпляре Consumer_1
+
+![](queue_1_1.png "")
+
+### Показания очереди queue_2
+
+![](queue_2.png "")
+
+### Показания очереди queue_1 при двух запущенных экземплярах Consumer_1
+
+![](queue_1_2.png "")
+
+### Показания очереди queue_1 при трех запущенных экземплярах Consumer_1
+
+![](queue_1_3.png "")
+
+# Видео
+https://vk.com/video230744264_456239106?list=ln-JCuDuG12swuj6vibPz
diff --git a/tukaeva_alfiya_lab_4/lesson_1.png b/tukaeva_alfiya_lab_4/lesson_1.png
new file mode 100644
index 0000000..d4a339d
Binary files /dev/null and b/tukaeva_alfiya_lab_4/lesson_1.png differ
diff --git a/tukaeva_alfiya_lab_4/lesson_2.png b/tukaeva_alfiya_lab_4/lesson_2.png
new file mode 100644
index 0000000..1516aab
Binary files /dev/null and b/tukaeva_alfiya_lab_4/lesson_2.png differ
diff --git a/tukaeva_alfiya_lab_4/lesson_3.png b/tukaeva_alfiya_lab_4/lesson_3.png
new file mode 100644
index 0000000..4814988
Binary files /dev/null and b/tukaeva_alfiya_lab_4/lesson_3.png differ
diff --git a/tukaeva_alfiya_lab_4/queue_1_1.png b/tukaeva_alfiya_lab_4/queue_1_1.png
new file mode 100644
index 0000000..d541247
Binary files /dev/null and b/tukaeva_alfiya_lab_4/queue_1_1.png differ
diff --git a/tukaeva_alfiya_lab_4/queue_1_2.png b/tukaeva_alfiya_lab_4/queue_1_2.png
new file mode 100644
index 0000000..609e51c
Binary files /dev/null and b/tukaeva_alfiya_lab_4/queue_1_2.png differ
diff --git a/tukaeva_alfiya_lab_4/queue_1_3.png b/tukaeva_alfiya_lab_4/queue_1_3.png
new file mode 100644
index 0000000..bb8063f
Binary files /dev/null and b/tukaeva_alfiya_lab_4/queue_1_3.png differ
diff --git a/tukaeva_alfiya_lab_4/queue_2.png b/tukaeva_alfiya_lab_4/queue_2.png
new file mode 100644
index 0000000..3bbca99
Binary files /dev/null and b/tukaeva_alfiya_lab_4/queue_2.png differ
diff --git a/tukaeva_alfiya_lab_4/rabbitmq.png b/tukaeva_alfiya_lab_4/rabbitmq.png
new file mode 100644
index 0000000..9102864
Binary files /dev/null and b/tukaeva_alfiya_lab_4/rabbitmq.png differ