消息队列技术介绍 | 豆包MarsCode AI刷题

69 阅读2分钟

消息队列(Message Queue, MQ)是一种在分布式系统中广泛使用的通信方式。它提供异步通信机制,解耦生产者和消费者,并增强系统的可扩展性、可靠性和性能。本文将对以下四种常见消息队列进行介绍:

  • Kafka
  • RocketMQ
  • RabbitMQ
  • BMQ

一、Kafka

Kafka 是一个高吞吐量的分布式消息系统,常用于实时数据流处理。它以日志分区为核心,支持高并发生产与消费。

核心概念

  • Broker: Kafka集群中的服务器。
  • Topic: 消息的分类。
  • Partition: 每个Topic可以分为多个分区。
  • Consumer Group: 消费者分组,保证消息的组内唯一消费。

关键参数

    public static void main(String[] args) {
        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092"); // Kafka集群地址
        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        KafkaProducer<String, String> producer = new KafkaProducer<>(props);
        for (int i = 0; i < 10; i++) {
            producer.send(new ProducerRecord<>("my-topic", "key" + i, "value" + i));
        }
        producer.close();
    }

  • bootstrap.servers: Kafka集群地址。
  • key.serializer/value.serializer: 用于序列化消息的Key和Value。
  • acks: 确认模式,推荐配置为all确保数据可靠性。

二、RocketMQ

RocketMQ 是阿里巴巴开源的分布式消息系统,具有高性能和强一致性特点,特别适用于事务型消息场景。

核心概念

  • Producer: 消息的生产者。
  • Consumer: 消息的消费者。
  • Message Queue: 消息队列,实际存储消息的载体。

关键参数

    public static void main(String[] args) throws Exception {
        DefaultMQProducer producer = new DefaultMQProducer("producer-group");
        producer.setNamesrvAddr("localhost:9876"); // 设置NameServer地址
        producer.start();

        for (int i = 0; i < 10; i++) {
            Message msg = new Message("my-topic", "TagA", ("Hello RocketMQ " + i).getBytes());
            producer.send(msg);
        }
        producer.shutdown();
    }
  • namesrvAddr: NameServer地址。
  • retryTimesWhenSendFailed: 消息发送失败的重试次数。
  • maxMessageSize: 单条消息最大大小。

三、RabbitMQ

RabbitMQ 是基于AMQP协议构建的消息队列系统,适用于高可靠性场景。

核心概念

  • Exchange: 消息分发的交换器。
  • Queue: 存储消息的队列。
  • Binding: 绑定Exchange和Queue的关系。

关键参数

    private final static String QUEUE_NAME = "hello";

    public static void main(String[] argv) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost"); // RabbitMQ服务地址
        try (Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) {
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            for (int i = 0; i < 10; i++) {
                String message = "Hello RabbitMQ " + i;
                channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
            }
        }
    }
  • host: RabbitMQ服务器地址。
  • queueDeclare: 声明队列时的参数,包括持久化、排他性等。

总结

消息队列适用场景优势劣势
Kafka实时数据流处理高吞吐量、水平扩展性强学习曲线较陡
RocketMQ事务型消息,高并发场景支持事务消息,强一致性配置和运维复杂
RabbitMQ高可靠性和灵活性场景基于AMQP协议,社区支持广吞吐量相对较低
BMQ低延迟、高性能场景简单轻量,支持高性能消息处理社区支持相对较少

在选择消息队列时,应根据业务场景和需求评估其性能、可靠性、扩展性和学习成本。