RocketMQ 简介 | 青训营笔记

39 阅读2分钟

RocketMQ 简介

1.1 什么是 RocketMQ

RocketMQ 是阿里巴巴开源的消息中间件,它是纯 Java 开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。

1.2 RocketMQ 的特点

  • 支持发布订阅模式和消息队列模式
  • 支持顺序消息
  • 支持事务消息
  • 支持延时消息
  • 支持批量消息
  • 支持消息回溯

1.3 RocketMQ 的安装

1.3.1 下载

下载地址:rocketmq.apache.org/dowloading_…

1.3.2 解压

tar -zxvf rocketmq-all-4.7.1-bin-release.zip

1.3.3 配置

cd rocketmq-all-4.7.1-bin-release/conf
cp broker.conf.example broker.conf
cp namesrv.conf.example namesrv.conf

1.3.4 启动

cd rocketmq-all-4.7.1-bin-release/bin
nohup sh mqnamesrv &
nohup sh mqbroker -n localhost:9876 &

1.3.5 关闭

cd rocketmq-all-4.7.1-bin-release/bin
sh mqshutdown namesrv
sh mqshutdown broker

1.4 Go 语言使用 RocketMQ

1.4.1 安装 RocketMQ Go 客户端

go get github.com/apache/rocketmq-client-go/v2

1.4.2 生产者

package main

import (
    "context"
    "fmt"
    "github.com/apache/rocketmq-client-go/v2"
    "github.com/apache/rocketmq-client-go/v2/consumer"
    "github.com/apache/rocketmq-client-go/v2/primitive"
    "github.com/apache/rocketmq-client-go/v2/producer"
    "log"
    "time"
)

func main() {
    p, _ := rocketmq.NewProducer(
        producer.WithNameServer([]string{"localhost:9876"}),
    )
    err := p.Start()
    if err != nil {
        log.Fatal(err)
    }
    defer p.Shutdown()

    for i := 0; i < 10; i++ {
        msg := &primitive.Message{
            Topic: "test",
            Body:  []byte(fmt.Sprintf("Hello RocketMQ Go Client! %d", i)),
        }
        res, err := p.SendSync(context.Background(), msg)
        if err != nil {
            log.Fatal(err)
        }
        fmt.Printf("send message success. result=%s\n", res.String())
    }
}

1.4.3 消费者

package main

import (
    "context"
    "fmt"
    "github.com/apache/rocketmq-client-go/v2"
    "github.com/apache/rocketmq-client-go/v2/consumer"
    "github.com/apache/rocketmq-client-go/v2/primitive"
    "log"
    "time"
)

func main() {
    c, _ := rocketmq.NewPushConsumer(
        consumer.WithGroupName("testGroup"),
        consumer.WithNameServer([]string{"localhost:9876"}),
    )
    err := c.Subscribe("test", consumer.MessageSelector{}, func(ctx context.Context, msgs ...*primitive.MessageExt) (consumer.ConsumeResult, error) {
        for i := range msgs {
            fmt.Printf("received message: %s\n", msgs[i].Body)
        }
        return consumer.ConsumeSuccess, nil
    })
    if err != nil {
        log.Fatal(err)
    }
    err = c.Start()
    if err != nil {
        log.Fatal(err)
    }
    defer c.Shutdown()

    time.Sleep(time.Hour)
}

1.5 RocketMQ 的架构

1.6 RocketMQ 的消息存储

1.6.1 消息存储的类型

  • 非持久化消息:不存储在磁盘上,只存储在内存中,重启后消息丢失
  • 持久化消息:存储在磁盘上,重启后消息不丢失

1.6.2 消息存储的位置

  • Broker:存储在 Broker 服务器上
  • NameServer:存储在 NameServer 服务器上

1.6.3 消息存储的方式

  • 集群模式:消息存储在多个 Broker 服务器上
  • 广播模式:消息存储在多个 Broker 服务器上

1.7 RocketMQ 的消息发送

1.7.1 消息发送的方式

  • 同步发送:发送消息后,等待 Broker 返回结果
  • 异步发送:发送消息后,不等待 Broker 返回结果,通过回调函数处理结果
  • 单向发送:发送消息后,不等待 Broker 返回结果,不处理结果

1.7.2 消息发送的顺序

  • 顺序发送:发送消息后,按照发送顺序存储在 Broker 服务器上
  • 无序发送:发送消息后,按照发送顺序存储在 Broker 服务器上