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 服务器上