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

Какие знаешь Message брокеры?

2.0 Middle🔥 141 комментариев
#Брокеры сообщений

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Message брокеры в Java

Message брокеры — это системы обмена сообщениями между микросервисами и приложениями. Они обеспечивают асинхронную коммуникацию, масштабируемость и надёжность доставки данных. Вместо прямого вызова сервис-к-сервису используется промежуточный брокер, который буферизирует сообщения.

1. RabbitMQ

RabbitMQ — один из самых популярных брокеров. Использует AMQP протокол (Advanced Message Queuing Protocol). Основан на очередях и exchange-ах.

// Подключение
@Configuration
@EnableRabbit
public class RabbitConfig {
    public static final String QUEUE_NAME = "user.events";
    public static final String EXCHANGE_NAME = "user-exchange";
    
    @Bean
    Queue queue() {
        return new Queue(QUEUE_NAME);
    }
    
    @Bean
    DirectExchange exchange() {
        return new DirectExchange(EXCHANGE_NAME);
    }
    
    @Bean
    Binding binding(Queue queue, DirectExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with("user.#");
    }
}

// Publisher
@Component
public class UserEventPublisher {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    public void publishUserCreated(String userId) {
        rabbitTemplate.convertAndSend(EXCHANGE_NAME, "user.created", userId);
    }
}

// Consumer
@Component
public class UserEventListener {
    @RabbitListener(queues = QUEUE_NAME)
    public void handleUserEvent(String userId) {
        System.out.println("Received event for user: " + userId);
    }
}

Преимущества RabbitMQ:

  • Надёжная доставка с подтверждением
  • Гибкая маршрутизация (exchanges, bindings)
  • Стабильный и проверенный

Недостатки:

  • Требует управления сложной топологией
  • Медленнее чем Kafka на больших нагрузках

2. Apache Kafka

Kafka — распределённый брокер событий. Оптимизирован для высоких пропускных способностей, хранит сообщения на диске, поддерживает consumer groups.

// Конфигурация
@Configuration
public class KafkaConfig {
    @Bean
    public ProducerFactory<String, String> producerFactory() {
        Map<String, Object> configProps = new HashMap<>();
        configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        return new DefaultProducerFactory<>(configProps);
    }
    
    @Bean
    public KafkaTemplate<String, String> kafkaTemplate() {
        return new KafkaTemplate<>(producerFactory());
    }
}

// Producer
@Component
public class UserEventProducer {
    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;
    
    public void sendEvent(String userId, String event) {
        kafkaTemplate.send("user-events", userId, event);
    }
}

// Consumer
@Component
public class UserEventConsumer {
    @KafkaListener(topics = "user-events", groupId = "user-service-group")
    public void consume(String message) {
        System.out.println("Received: " + message);
    }
}

Преимущества Kafka:

  • Отличная производительность (миллионы сообщений/сек)
  • Долгосрочное хранение с replay
  • Consumer groups для параллельной обработки
  • Идеален для Event Sourcing

Недостатки:

  • Более сложная в развёртывании
  • Требует больше ресурсов

3. Amazon SQS

SQS (Simple Queue Service) — облачный сервис Amazon для асинхронной очереди сообщений.

@Configuration
public class SqsConfig {
    @Bean
    public AmazonSQS amazonSQS() {
        return AmazonSQSClientBuilder.standard()
            .withRegion(Regions.US_EAST_1)
            .withCredentials(new DefaultAWSCredentialsProviderChain())
            .build();
    }
}

@Component
public class SqsMessageProducer {
    @Autowired
    private AmazonSQS amazonSQS;
    
    public void sendMessage(String queueUrl, String message) {
        amazonSQS.sendMessage(queueUrl, message);
    }
}

@Component
public class SqsMessageConsumer {
    @Autowired
    private AmazonSQS amazonSQS;
    
    public void receiveMessages(String queueUrl) {
        ReceiveMessageRequest request = new ReceiveMessageRequest(queueUrl)
            .withMaxNumberOfMessages(10);
        
        List<Message> messages = amazonSQS.receiveMessage(request).getMessages();
        for (Message message : messages) {
            System.out.println("Message: " + message.getBody());
            amazonSQS.deleteMessage(queueUrl, message.getReceiptHandle());
        }
    }
}

Преимущества SQS:

  • Полностью управляемый сервис (serverless)
  • Интеграция с AWS экосистемой
  • Автоматическое масштабирование

Недостатки:

  • Зависит от облачного провайдера
  • Может быть дорого на больших нагрузках

4. Apache ActiveMQ

ActiveMQ — open-source брокер сообщений с поддержкой JMS (Java Message Service).

@Configuration
public class JmsConfig {
    @Bean
    public ActiveMQConnectionFactory connectionFactory() {
        return new ActiveMQConnectionFactory("tcp://localhost:61616");
    }
    
    @Bean
    public JmsTemplate jmsTemplate() {
        return new JmsTemplate(connectionFactory());
    }
}

@Component
public class JmsProducer {
    @Autowired
    private JmsTemplate jmsTemplate;
    
    public void sendMessage(String message) {
        jmsTemplate.convertAndSend("myQueue", message);
    }
}

@Component
public class JmsConsumer {
    @JmsListener(destination = "myQueue")
    public void receiveMessage(String message) {
        System.out.println("Received: " + message);
    }
}

5. Google Cloud Pub/Sub

Pub/Sub — управляемый сервис Google для асинхронной обработки сообщений с гарантией доставки.

@Configuration
public class PubSubConfig {
    @Bean
    public Publisher getPublisher() throws IOException {
        return Publisher.newBuilder(
            TopicName.of("my-project", "my-topic")).build();
    }
}

@Component
public class PubSubMessageProducer {
    @Autowired
    private Publisher publisher;
    
    public void publishMessage(String message) {
        PubsubMessage pubsubMessage = PubsubMessage.newBuilder()
            .setData(ByteString.copyFromUtf8(message))
            .build();
        
        publisher.publish(pubsubMessage);
    }
}

Сравнительная таблица

БрокерПротоколНадёжностьСкоростьIdeal для
RabbitMQAMQPВысокаяСредняяRequest-reply, routing
KafkaTCPВысокаяОчень высокаяEvent streaming, big data
SQSHTTPSВысокаяСредняяAWS приложения
ActiveMQJMSВысокаяСредняяLegacy системы
Pub/SubgRPCВысокаяСредняяGoogle Cloud

Когда использовать

  • Kafka — микросервисная архитектура, event sourcing, big data
  • RabbitMQ — нужна гибкая маршрутизация, enterprise приложения
  • SQS — используешь AWS, нужна простота
  • Pub/Sub — используешь Google Cloud

Выбор зависит от требований по пропускной способности, надёжности, сложности и облачного провайдера.

Какие знаешь Message брокеры? | PrepBro