С какими брокерами сообщений работал?

«С какими брокерами сообщений работал?» — вопрос из категории Брокеры сообщений, который задают на 26% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В DevOps-практиках я работал с различными брокерами сообщений, выбирая их под конкретные задачи по надежности, latency и пропускной способности.

Apache Kafka: Использовал для построения потоковых пайплайнов данных (event-driven архитектура). Разворачивал и поддерживал Kafka-кластеры (включая Zookeeper) в Kubernetes с помощью Helm-чартов или операторов (Strimzi). Настраивал топики, партиционирование, ретеншн политики. Интегрировал с коннекторами для Debezium (CDC) или для отправки логов в Elasticsearch.

RabbitMQ: Применял для фоновых задач (background jobs) и RPC-коммуникации между микросервисами в средах, где важна гарантированная доставка и гибкая маршрутизация (exchanges, queues, bindings). Настраивал кластеризацию для высокой доступности и мониторинг через Prometheus-экспортер.

Облачные managed-сервисы:

  • AWS SQS/SNS: Для простых, но масштабируемых очередей и нотификаций в AWS-экосистеме. SQS идеален для decoupling компонентов, например, между Lambda-функцией и обработчиком.
  • Google Pub/Sub: Использовал в проектах на GCP для глобальной event-архитектуры.

Выбор и эксплуатация: С точки зрения DevOps, ключевыми были:

  1. Надежность и мониторинг: Настройка алертов на длину очереди, latency потребителей, ошибки обработки.
  2. Масштабирование: Автоскейлинг consumer-групп в Kubernetes на основе нагрузки из очереди.
  3. Безопасность: Настройка аутентификации (SASL, SSL/TLS) и авторизации (ACL в Kafka, политики в AWS).

Пример настроймы потребителя Kafka для мониторинга логов приложения (Go):

package main

import (
    "fmt"
    "github.com/segmentio/kafka-go"
    "context"
)

func main() {
    r := kafka.NewReader(kafka.ReaderConfig{
        Brokers:   []string{"kafka-broker:9092"},
        Topic:     "app-logs",
        GroupID:   "log-processor-group",
    })
    defer r.Close()

    for {
        m, err := r.ReadMessage(context.Background())
        if err != nil {
            break
        }
        fmt.Printf("Log received: %sn", string(m.Value))
        // Далее: парсинг лога, отправка в Loki/Elasticsearch
    }
}