2、rocketmq 简单使用
使用 rocketmq-client-go 调用
发送普通消息
package main import ( "context" "fmt" "github.com/apache/rocketmq-client-go/v2" "github.com/apache/rocketmq-client-go/v2/primitive" "github.com/apache/rocketmq-client-go/v2/producer" ) func main() { p,err := rocketmq.NewProducer(producer.WithNameServer([]string{"172.31.224.1:9876"})) if err != nil { panic("produce 生成失败") } if err = p.Start(); err != nil { panic("produce 启动失败") } res,err := p.SendSync(context.Background(),primitive.NewMessage("hellomq",[]byte("hello i m message"))) if err != nil { panic("发送失败") } fmt.Println("发送成功",res.String()) if err = p.Shutdown(); err != nil { panic("关闭 produce 失败") } }
消费消息
func main() { c,_ := rocketmq.NewPushConsumer( consumer.WithNameServer([]string{"172.31.224.1:9876"}), consumer.WithGroupName("imgroup"), // groupname 用于负载均衡,某个消息被这个主机消费了,别的主机就不会去消费 ) _ = c.Subscribe("hellomq",consumer.MessageSelector{}, func(ctx context.Context, ext ...*primitive.MessageExt) (consumer.ConsumeResult, error) { for i := range ext{ fmt.Println("获取到值",ext[i]) } return consumer.ConsumeSuccess,nil }) _ = c.Start() // 不能让 主 routine 退出 time.Sleep(time.Hour) _ = c.Shutdown() }
延迟消息
多数用来做库存归还
func main() { p,_ := rocketmq.NewProducer(producer.WithNameServer([]string{"172.31.224.1:9876"})) _ = p.Start() msg := primitive.NewMessage("hellomq",[]byte("i m delay message")) // 级别 1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h msg.WithDelayTimeLevel(3) // 3是10s res,_ := p.SendSync(context.Background(),msg) fmt.Println("发送成功",res.String()) _ = p.Shutdown() }
事务消息
package main import ( "context" "fmt" "github.com/apache/rocketmq-client-go/v2" "github.com/apache/rocketmq-client-go/v2/primitive" "github.com/apache/rocketmq-client-go/v2/producer" "time" ) type Orderlistener struct{} // 事务开始 func (*Orderlistener) ExecuteLocalTransaction(msg *primitive.Message) primitive.LocalTransactionState { fmt.Println("开始执行一些逻辑") time.Sleep(time.Second * 5) fmt.Println("逻辑执行结束") // 若是成功就进行投递 //return primitive.CommitMessageState // 失败直接进行回滚 //return primitive.RollbackMessageState // 长时间无响应就标记 UnknowState 进行消息回查 return primitive.UnknowState } // 消息回查(当服务宕掉,下次进去还会进行回查) func (*Orderlistener) CheckLocalTransaction(msg *primitive.MessageExt) primitive.LocalTransactionState { // 开始进行回查 fmt.Println("开始进行回查") time.Sleep(time.Second * 5) // 回查成功就投递,失败就回滚 return primitive.CommitMessageState //return primitive.RollbackMessageState } func main() { p,_ := rocketmq.NewTransactionProducer(&Orderlistener{},producer.WithNameServer([]string{"192.168.1.163:9876"})) _ = p.Start() res,err := p.SendMessageInTransaction(context.Background(),primitive.NewMessage("hellomq",[]byte("i am transaction mq rollback"))) if err != nil { panic(err) } fmt.Println("发送成功",res.String()) time.Sleep(time.Hour) _ = p.Shutdown() }

浙公网安备 33010602011771号