Что такое топик в системах обмена сообщениями?

Ответ

Топик (Topic) — это именованный канал или категория в системах обмена сообщениями (брокерах), таких как Apache Kafka, RabbitMQ или Apache Pulsar. Производители (Producers) публикуют сообщения в топик, а потребители (Consumers) подписываются на топик для их получения. Это реализует шаблон "публикация-подписка" (Pub/Sub).

Ключевые характеристики:

  • Логическое разделение: Каждый топик предназначен для определенного типа событий или данных (например, user-registrations, order-payments).
  • Масштабируемость: В Kafka топик делится на партиции для параллельной обработки.
  • Надежность: Сообщения в топике обычно сохраняются на диске и реплицируются.

Пример создания топика и отправки сообщения в Apache Kafka (Java):

// 1. Настройка админа для управления топиками
Properties adminProps = new Properties();
adminProps.put("bootstrap.servers", "localhost:9092");
AdminClient admin = AdminClient.create(adminProps);

// Создание топика с 3 партициями и фактором репликации 1
NewTopic newTopic = new NewTopic("order-events", 3, (short) 1);
admin.createTopics(Collections.singleton(newTopic));

// 2. Отправка сообщения продюсером
Properties producerProps = new Properties();
producerProps.put("bootstrap.servers", "localhost:9092");
producerProps.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
producerProps.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

Producer<String, String> producer = new KafkaProducer<>(producerProps);
ProducerRecord<String, String> record = new ProducerRecord<>(
    "order-events", // Имя топика
    "order-123",    // Ключ (определяет партицию)
    "{"status": "paid"}" // Значение (тело сообщения)
);
producer.send(record);
producer.close();

Ответ 18+ 🔞

Да ты посмотри, что за хуйня творится в этих ваших распределённых системах! Вот есть у тебя, допустим, куча сервисов, и им надо переписываться, но не как дураки по HTTP друг другу в рот лезть, а культурно. Вот для этого и придумали Топик (Topic) — это типа именованный почтовый ящик, только для событий. В Apache Kafka, RabbitMQ и прочих Pulsar'ах.

Суть проще пареной репы, блядь:

  • Разделение логики, ёпта: Каждому событию — свой топик. Регистрация пользователей — user-registrations, оплата заказов — order-payments. Не вали всё в одну кучу, как свинья!
  • Масштабируется, овердохуища: В той же Kafka топик можно на партиции поделить, чтобы обрабатывать параллельно, а не ждать, пока один хромой осел всё прочитает.
  • Надёжность, чтоб её: Сообщения обычно на диск пишутся и между серверами копируются. Не потеряется, даже если один сервер накроется медным тазом.

Вот, смотри, как это в коде выглядит на Java для Kafka. Блоки кода не трогаю, они святые:

// 1. Сначала админа настроим, чтоб топик создать
Properties adminProps = new Properties();
adminProps.put("bootstrap.servers", "localhost:9092");
AdminClient admin = AdminClient.create(adminProps);

// Создаём топик "order-events" на 3 партиции. Репликация одна, для примера.
NewTopic newTopic = new NewTopic("order-events", 3, (short) 1);
admin.createTopics(Collections.singleton(newTopic));

// 2. А теперь продюсер, который сообщение в этот топик засунет
Properties producerProps = new Properties();
producerProps.put("bootstrap.servers", "localhost:9092");
producerProps.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
producerProps.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

Producer<String, String> producer = new KafkaProducer<>(producerProps);
// Вот само сообщение. Кидаем в топик "order-events", с ключом "order-123" и JSON'ом внутри.
ProducerRecord<String, String> record = new ProducerRecord<>(
    "order-events", // Имя топика, куда шлём
    "order-123",    // Ключ (по нему решается, в какую партицию попадёт)
    "{"status": "paid"}" // Само тело сообщения, в рот меня чих-пых
);
producer.send(record); // Полетело!
producer.close();

Вот и вся магия. Один написал, другой — подписался и прочитал. Никаких прямых связей, всё через топик. Красота, ёпта!