← Назад ко всем вопросам

В чём разница между очередью и топиком (pub/sub)?

1️⃣ Как кратко ответить

Очередь (queue) и топик (topic) — это два разных подхода к обмену сообщениями в системах обмена сообщениями. Очередь используется для point-to-point коммуникации, где каждое сообщение обрабатывается одним получателем. Топик используется для publish/subscribe модели, где одно сообщение может быть получено несколькими подписчиками.

2️⃣ Подробное объяснение темы

Очереди и топики — это два основных паттерна обмена сообщениями, которые используются в системах обмена сообщениями, таких как RabbitMQ, Apache Kafka и другие. Они помогают организовать взаимодействие между различными компонентами системы, обеспечивая асинхронную передачу данных.

Очередь (Queue):

Очередь — это структура данных, работающая по принципу FIFO (First In, First Out), что означает, что первое сообщение, помещенное в очередь, будет первым обработано. Очереди используются в модели point-to-point, где каждое сообщение обрабатывается только одним получателем. Это полезно, когда необходимо распределить нагрузку между несколькими потребителями, например, в случае обработки задач.

Пример использования очереди:

  • Представьте себе систему обработки заказов в интернет-магазине. Каждый заказ помещается в очередь, и несколько серверов (потребителей) обрабатывают заказы по мере их поступления. Каждый заказ обрабатывается только одним сервером, что позволяет равномерно распределить нагрузку.

Топик (Topic):

Топик используется в модели publish/subscribe, где одно сообщение может быть получено несколькими подписчиками. В этой модели отправитель (публикатор) отправляет сообщение в топик, и все подписчики, которые подписаны на этот топик, получают копию сообщения. Это полезно, когда необходимо уведомить несколько систем о каком-либо событии.

Пример использования топика:

  • Представьте себе систему уведомлений о погоде. Когда поступает новое предупреждение о погоде, оно публикуется в топик. Все подписчики, такие как мобильные приложения, веб-сайты и другие системы, получают это уведомление и могут отобразить его пользователям.

Кодовый пример:

Рассмотрим пример использования RabbitMQ для реализации очереди и топика.

import pika
​
# Установка соединения с RabbitMQ
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
​
# Пример очереди
# Создание очереди
channel.queue_declare(queue='task_queue', durable=True)
​
# Отправка сообщения в очередь
channel.basic_publish(exchange='',
                      routing_key='task_queue',
                      body='Hello Queue!',
                      properties=pika.BasicProperties(
                          delivery_mode=2,  # Сообщение будет сохранено на диске
                      ))
​
# Пример топика
# Создание топика
channel.exchange_declare(exchange='logs', exchange_type='fanout')
​
# Отправка сообщения в топик
channel.basic_publish(exchange='logs',
                      routing_key='',
                      body='Hello Topic!')
​
# Закрытие соединения
connection.close()
  • pika.BlockingConnection(pika.ConnectionParameters('localhost')): Устанавливает соединение с RabbitMQ сервером, работающим на локальной машине.
  • channel.queue_declare(queue='task_queue', durable=True): Создает очередь с именем task_queue. Параметр durable=True гарантирует, что очередь будет сохранена на диске и не потеряется при перезапуске сервера.
  • channel.basic_publish(...): Отправляет сообщение в указанную очередь или топик. В случае очереди используется routing_key, чтобы указать, в какую очередь отправить сообщение. В случае топика используется exchange, чтобы указать, в какой топик отправить сообщение.
  • channel.exchange_declare(exchange='logs', exchange_type='fanout'): Создает топик с именем logs и типом fanout, что означает, что сообщение будет отправлено всем подписчикам.

Очереди и топики позволяют гибко организовать взаимодействие между компонентами системы, обеспечивая надежную и масштабируемую передачу сообщений.

Тема: Очереди и брокеры сообщений
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки