diff --git a/fadeeva_nastya_lab_4/Consumer_1.py b/fadeeva_nastya_lab_4/Consumer_1.py
new file mode 100644
index 0000000..30e8574
--- /dev/null
+++ b/fadeeva_nastya_lab_4/Consumer_1.py
@@ -0,0 +1,30 @@
+import pika
+import time
+
+
+def callback(ch, method, properties, body):
+    print(f'Consumer 1 получил сообщение: {body.decode()}')
+
+    # Время задержки по условию
+    time.sleep(2)
+
+    print('Consumer 1 закончил обработку')
+
+
+def consume_events_1():
+    connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
+    channel = connection.channel()
+
+    # Создание очереди
+    channel.queue_declare(queue='consumer1_queue')
+    # Привязка очереди
+    channel.queue_bind(exchange='beauty_salon_events', queue='consumer1_queue')
+
+    channel.basic_consume(queue='consumer1_queue', on_message_callback=callback, auto_ack=True)
+
+    print('Consumer 1 начал ожидать сообщения...')
+    channel.start_consuming()
+
+
+if __name__ == "__main__":
+    consume_events_1()
\ No newline at end of file
diff --git a/fadeeva_nastya_lab_4/Consumer_2.py b/fadeeva_nastya_lab_4/Consumer_2.py
new file mode 100644
index 0000000..5105d5d
--- /dev/null
+++ b/fadeeva_nastya_lab_4/Consumer_2.py
@@ -0,0 +1,28 @@
+import pika
+
+
+def callback(ch, method, properties, body):
+    print(f'Consumer 2 получил сообщение: {body.decode()}')
+
+    # Обработка "нон-стопом"
+    print('Consumer 2 закончил обработку')
+
+
+def consume_events_2():
+    connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
+    channel = connection.channel()
+
+    # Создание очереди
+    channel.queue_declare(queue='consumer2_queue')
+
+    # Привязка очереди
+    channel.queue_bind(exchange='beauty_salon_events', queue='consumer2_queue')
+
+    channel.basic_consume(queue='consumer2_queue', on_message_callback=callback, auto_ack=True)
+
+    print('Consumer 2 начал ожидать сообщения...')
+    channel.start_consuming()
+
+
+if __name__ == "__main__":
+    consume_events_2()
\ No newline at end of file
diff --git a/fadeeva_nastya_lab_4/README.md b/fadeeva_nastya_lab_4/README.md
new file mode 100644
index 0000000..df42ab4
--- /dev/null
+++ b/fadeeva_nastya_lab_4/README.md
@@ -0,0 +1,53 @@
+# Лабораторная работа №4 - Работа с брокером сообщений
+
+## Задание
+
++ Установить брокер сообщений RabbitMQ.
++ Пройти уроки 1, 2 и 3 из RabbitMQ Tutorials на любом языке программирования.
++ Продемонстрировать работу брокера сообщений.
+
+## Описание работы
+
+**Publisher** - осуществляет отправку сообщений своим клиентам.
+  
+**Consumer1** - принимает и обрабатывает сообщения с задержкой в 2-3 секунды.
+
+**Consumer2** - моментально принимает и обрабатывает сообщения.
+
+### Tutorials
+
+1. tutorial_1
+
+![tutorial_1.png](tutorial_1.png)
+
+2. tutorial_2
+
+![tutorial_2.png](tutorial_2.png)
+
+3. tutorial_3
+
+![tutorial_3.png](tutorial_3.png)
+
+## Работа с RabbitMQ
+
+![rabbitMQ.png](rabbitMQ.png)
+
+## Показания очереди queue_1 при одном запущенном экземпляре Consumer_1
+
+![queue_1_1.png](queue_1_1.png)
+
+## Показания очереди queue_2
+
+![queue_2_1.png](queue_2_1.png)
+
+## Показания очереди queue_1 при двух запущенных экземплярах Consumer_1
+![queue_1_2.png](queue_1_2.png)
+
+## Показания очереди queue_1 при трех запущенных экземплярах Consumer_1
+
+![queue_1_3.png](queue_1_3.png)
+
+## Видеозапись работы программы 
+
+https://vkvideo.ru/video186826232_456239555
+
diff --git a/fadeeva_nastya_lab_4/publisher.py b/fadeeva_nastya_lab_4/publisher.py
new file mode 100644
index 0000000..2f8352e
--- /dev/null
+++ b/fadeeva_nastya_lab_4/publisher.py
@@ -0,0 +1,28 @@
+import pika
+import time
+
+
+def publish_events():
+    connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
+    channel = connection.channel()
+
+    # Создание exchange типа fanout
+    channel.exchange_declare(exchange='beauty_salon_events', exchange_type='fanout')
+
+    events = [
+        "Test1",
+        "Test2",
+        "Test3",
+        "Test4",
+        "Test5"
+    ]
+
+    while True:
+        event = events[int(time.time()) % len(events)]
+        channel.basic_publish(exchange='beauty_salon_events', routing_key='', body=event)
+        print(f'Отправлено: {event}')
+        time.sleep(1)
+
+
+if __name__ == "__main__":
+    publish_events()
\ No newline at end of file
diff --git a/fadeeva_nastya_lab_4/queue_1 _1.png b/fadeeva_nastya_lab_4/queue_1 _1.png
new file mode 100644
index 0000000..b878a84
Binary files /dev/null and b/fadeeva_nastya_lab_4/queue_1 _1.png differ
diff --git a/fadeeva_nastya_lab_4/queue_1 _2.png b/fadeeva_nastya_lab_4/queue_1 _2.png
new file mode 100644
index 0000000..43a44d1
Binary files /dev/null and b/fadeeva_nastya_lab_4/queue_1 _2.png differ
diff --git a/fadeeva_nastya_lab_4/queue_1 _3.png b/fadeeva_nastya_lab_4/queue_1 _3.png
new file mode 100644
index 0000000..4a9cd17
Binary files /dev/null and b/fadeeva_nastya_lab_4/queue_1 _3.png differ
diff --git a/fadeeva_nastya_lab_4/queue_2_1.png b/fadeeva_nastya_lab_4/queue_2_1.png
new file mode 100644
index 0000000..303c07f
Binary files /dev/null and b/fadeeva_nastya_lab_4/queue_2_1.png differ
diff --git a/fadeeva_nastya_lab_4/rabbitMQ.png b/fadeeva_nastya_lab_4/rabbitMQ.png
new file mode 100644
index 0000000..e767fa6
Binary files /dev/null and b/fadeeva_nastya_lab_4/rabbitMQ.png differ
diff --git a/fadeeva_nastya_lab_4/tutorial_1.png b/fadeeva_nastya_lab_4/tutorial_1.png
new file mode 100644
index 0000000..95d43bb
Binary files /dev/null and b/fadeeva_nastya_lab_4/tutorial_1.png differ
diff --git a/fadeeva_nastya_lab_4/tutorial_1/receive.py b/fadeeva_nastya_lab_4/tutorial_1/receive.py
new file mode 100644
index 0000000..f118e0a
--- /dev/null
+++ b/fadeeva_nastya_lab_4/tutorial_1/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/fadeeva_nastya_lab_4/tutorial_1/send.py b/fadeeva_nastya_lab_4/tutorial_1/send.py
new file mode 100644
index 0000000..41cfff2
--- /dev/null
+++ b/fadeeva_nastya_lab_4/tutorial_1/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/fadeeva_nastya_lab_4/tutorial_2.png b/fadeeva_nastya_lab_4/tutorial_2.png
new file mode 100644
index 0000000..cd04043
Binary files /dev/null and b/fadeeva_nastya_lab_4/tutorial_2.png differ
diff --git a/fadeeva_nastya_lab_4/tutorial_2/new_task.py b/fadeeva_nastya_lab_4/tutorial_2/new_task.py
new file mode 100644
index 0000000..a2444e0
--- /dev/null
+++ b/fadeeva_nastya_lab_4/tutorial_2/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/fadeeva_nastya_lab_4/tutorial_2/worker.py b/fadeeva_nastya_lab_4/tutorial_2/worker.py
new file mode 100644
index 0000000..34cb8f7
--- /dev/null
+++ b/fadeeva_nastya_lab_4/tutorial_2/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/fadeeva_nastya_lab_4/tutorial_3.png b/fadeeva_nastya_lab_4/tutorial_3.png
new file mode 100644
index 0000000..af274c0
Binary files /dev/null and b/fadeeva_nastya_lab_4/tutorial_3.png differ
diff --git a/fadeeva_nastya_lab_4/tutorial_3/emit_log.py b/fadeeva_nastya_lab_4/tutorial_3/emit_log.py
new file mode 100644
index 0000000..45b6989
--- /dev/null
+++ b/fadeeva_nastya_lab_4/tutorial_3/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/fadeeva_nastya_lab_4/tutorial_3/receive_logs.py b/fadeeva_nastya_lab_4/tutorial_3/receive_logs.py
new file mode 100644
index 0000000..60d881d
--- /dev/null
+++ b/fadeeva_nastya_lab_4/tutorial_3/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