消息队列 | 青训营

151 阅读2分钟

本文主要涉及Kafka、BMQ和RocketMQ等消息队列的对比分析。

Golang消息队列:Kafka vs BMQ vs RocketMQ

随着业务规模的扩大,异步处理变得越来越重要。消息队列被广泛地应用于解耦业务,增加系统稳定性。Golang中常见的消息队列包括Kafka、BMQ和RocketMQ。本文将对这3种消息队列进行对比分析。

Kafka

Kafka是一个分布式的,基于发布/订阅的消息队列。它适用于高吞吐,低延迟的场景。

package main

import "github.com/confluentinc/confluent-kafka-go/kafka"

func main() {

  p, err := kafka.NewProducer(&kafka.ConfigMap{"bootstrap.servers": "localhost"})

  err = p.Produce(&kafka.Message{
    TopicPartition: kafka.TopicPartition{Topic: &topic, Partition: kafka.PartitionAny},
    Value:          []byte(message),
  }, nil)

}

Kafka的优点:

  • 吞吐量高,单机支持百万级QPS
  • 延迟低,支持毫秒级
  • 支持多订阅者
  • 持久化,消息写入磁盘

缺点:

  • 学习曲线较陡峭
  • 运维相对复杂
  • 不支持消息推送

BMQ

BMQ是一款基于TCP的消息队列,由百度开源。

package main

import (
	"github.com/bmizerany/bmq/queue"
)

func main() {
	
  q := queue.New("test")

  err := q.Pub([]byte("hello"), 0)
  
  if msg, err := q.Sub(); err == nil {
    // 处理消息
  }
  
}

BMQ的优点:

  • 上手简单,使用TCP协议
  • 支持阻塞和非阻塞API
  • 支持消息重试和超时

缺点:

  • 不支持集群,可靠性一般
  • 性能一般,不适合高负载场景

RocketMQ

RocketMQ是阿里开源的分布式消息队列,拥有高吞吐和低延迟。

package main

import rocketmq "github.com/apache/rocketmq-client-go/v2"

func main() {

  p, _ := rocketmq.NewProducer(
    producer.WithNsResolver(primitive.NewPassthroughResolver([]string{"127.0.0.1:9876"})),
  )

  err := p.Start()
  if err != nil {
    fmt.Println(err.Error())
  }

  res, err := p.SendSync(context.Background(),
     primitive.NewMessage("test",[]byte("hello world")))

}

RocketMQ的优点:

  • 吞吐量大,延迟低
  • 支持消息重试,顺序消息
  • 功能强大,企业级稳定

缺点:

  • 上手较难,需要部署NameServer等
  • 仅开源版支持Go语言

总结

  • Kafka擅长大吞吐量,适合数据处理
  • BMQ简单易用,适合小系统
  • RocketMQ功能完善,适合大规模企业应用

消息队列在分布式系统中扮演重要角色。我对比了Golang中的3种典型消息队列实现,各有优劣,可以根据业务场景选择合适的消息队列。