You need to enable JavaScript to run this app.
文档中心
云原生消息引擎

云原生消息引擎

复制全文
下载 pdf
SDK 参考
Go SDK
复制全文
下载 pdf
Go SDK
本文介绍如何通过 Go SDK 接入云原生消息引擎 BMQ 并收发消息。​
背景信息​
您可以直接使用开源 SDK sarama 进行收发消息。如需了解详细信息,请参见sarama。​
前提条件​
  • (可选)您如果需要通过 SASL 用户名和密码进行鉴权,还需提前创建用户并获取密码。具体操作,请参见创建 SASL 用户。​
发送消息​
编写并运行BmqProducerDemo.go发送消息。​
PLAINTEXT​
使用PLAINTEXT协议接入点地址连接 BMQ 实例时,无需鉴权。​
​
import (​
"log"​
​
"github.com/IBM/sarama"​
)​
​
func main() {​
brokers := []string{"xxx"} // 接入点地址​
​
config := sarama.NewConfig()​
config.Version = sarama.V0_10_2_0​
config.Producer.Return.Successes = true​
​
// 创建生产者​
producer, err := sarama.NewSyncProducer(brokers, config)​
if err != nil {​
log.Println("Failed to create producer: ", err)​
return​
}​
defer producer.Close()​
​
// 生产消息​
message := &sarama.ProducerMessage{​
Topic: "my_topic", //Topic名称​
Key: sarama.StringEncoder("test_key"),​
Value: sarama.StringEncoder("test_value"),​
}​
​
partition, offset, err := producer.SendMessage(message)​
if err != nil {​
log.Println("Failed to send message: ", err)​
return​
}​
​
log.Printf("Message sent successfully. Partition: %d, Offset: %d\n", partition, offset)​
}​
​
SASL_PLAINTEXT​
通过 SASL 用户名和密码进行鉴权。您需要获取有权限用户的名称和密码,如何获取请参见查看 SASL 用户密码。​
​
import (​
"log"​
​
"github.com/IBM/sarama"​
)​
​
func main() {​
brokers := []string{"xxx"} // 接入点地址​
​
config := sarama.NewConfig()​
config.Version = sarama.V0_10_2_0​
config.Producer.Return.Successes = true​
​
// SASL_PLAINTEXT配置​
config.Net.SASL.Enable = true​
config.Net.SASL.User = "用户名"​
config.Net.SASL.Password = "密码"​
config.Net.SASL.Mechanism = sarama.SASLTypePlaintext​
config.Net.SASL.Version = 0​
​
// 创建生产者​
producer, err := sarama.NewSyncProducer(brokers, config)​
if err != nil {​
log.Println("Failed to create producer: ", err)​
return​
}​
defer producer.Close()​
​
// 生产消息​
message := &sarama.ProducerMessage{​
Topic: "my_topic", //Topic名称​
Key: sarama.StringEncoder("test_key"),​
Value: sarama.StringEncoder("test_value"),​
}​
​
partition, offset, err := producer.SendMessage(message)​
if err != nil {​
log.Println("Failed to send message: ", err)​
return​
}​
​
log.Printf("Message sent successfully. Partition: %d, Offset: %d\n", partition, offset)​
}​
​
SASL_SSL​
通过 SASL 用户名和密码进行鉴权。您需要获取有权限用户的名称和密码,如何获取请参见查看 SASL 用户密码。​
​
import (​
"log"​
​
"github.com/IBM/sarama"​
)​
​
func main() {​
brokers := []string{"xxx"} // 接入点地址​
​
config := sarama.NewConfig()​
config.Version = sarama.V0_10_2_0​
config.Producer.Return.Successes = true​
config.Net.SASL.Version = 0​
config.Net.TLS.Config = &tls.Config{}​
config.Net.TLS.Config.InsecureSkipVerify = true​
​
// SASL_SSL配置​
config.Net.SASL.Enable = true​
config.Net.SASL.User = "用户"​
config.Net.SASL.Password = "密码"​
config.Net.SASL.Mechanism = sarama.SASLTypePlaintext​
config.Net.TLS.Enable = true​
​
// 创建生产者​
producer, err := sarama.NewSyncProducer(brokers, config)​
if err != nil {​
log.Println("Failed to create producer: ", err)​
return​
}​
defer producer.Close()​
​
// 生产消息​
message := &sarama.ProducerMessage{​
Topic: "my_topic", //Topic名称​
Key: sarama.StringEncoder("test_key"),​
Value: sarama.StringEncoder("test_value"),​
}​
​
partition, offset, err := producer.SendMessage(message)​
if err != nil {​
log.Println("Failed to send message: ", err)​
return​
}​
​
log.Printf("Message sent successfully. Partition: %d, Offset: %d\n", partition, offset)​
}​
​
消费消息​
编写并运行BmqConsumerDemo.go消费消息。​
PLAINTEXT​
使用PLAINTEXT协议接入点地址连接 BMQ 实例时,无需鉴权。​
​
package main​
​
import (​
"fmt"​
"os"​
"os/signal"​
"sync"​
​
"github.com/IBM/sarama"​
)​
​
func main() {​
brokers := []string{"xxx"} // 接入点地址​
topic := "my_topic" //要消费的topic​
cg := "test_cg" //消费者组​
​
config := sarama.NewConfig()​
config.Version = sarama.V0_10_2_0​
​
// 1. create client​
var client sarama.Client​
var err error​
client, err = sarama.NewClient(brokers, config)​
if err != nil {​
fmt.Println("create sarama client error:", err)​
}​
defer func() {​
if err := client.Close(); err != nil {​
fmt.Println("client close error:", err)​
} else {​
fmt.Println("Close client!")​
}​
}()​
​
// 2. create consumer​
consumer, err := sarama.NewConsumerFromClient(client)​
defer func() {​
if err := consumer.Close(); err != nil {​
fmt.Println("consumer close error:", err)​
} else {​
fmt.Println("Close consumer!")​
}​
}()​
if err != nil {​
fmt.Println("new consumer error:", err)​
}​
​
// 3. offset manager​
offsetManager, err := sarama.NewOffsetManagerFromClient(cg, client)​
defer func() {​
if err := offsetManager.Close(); err != nil {​
fmt.Println("close offset manager error:", err)​
} else {​
fmt.Println("Close offset manager!")​
}​
}()​
if err != nil {​
fmt.Println("new offset manager error:", err)​
}​
​
if !config.Consumer.Offsets.AutoCommit.Enable {​
defer offsetManager.Commit()​
}​
​
thr := sync.WaitGroup{}​
signals := make(chan os.Signal, 1)​
signal.Notify(signals, os.Interrupt)​
quit := make(chan int)​
​
// 4. start to consume partitions​
partitions, err := client.Partitions(topic)​
if err != nil {​
fmt.Println("get partitions error:", err)​
}​
fmt.Println("start consume. topic:", topic, "partitions:", partitions)​
for _, partition := range partitions {​
thr.Add(1)​
go consumePartition(quit, &thr, consumer, offsetManager, int32(partition), topic)​
}​
​
<-signals​
close(quit)​
thr.Wait()​
}​
​
func consumePartition(quit <-chan int, thr *sync.WaitGroup, consumer sarama.Consumer,​
offsetManager sarama.OffsetManager, partition int32, topic string) {​
defer thr.Done()​
​
partitionOffsetManager, err := offsetManager.ManagePartition(topic, partition)​
if err != nil {​
fmt.Println("create partitionOffsetManager err:", err)​
}​
offset, _ := partitionOffsetManager.NextOffset()​
if offset == -1 {​
offset = sarama.OffsetNewest​
}​
​
var partitionConsumer sarama.PartitionConsumer​
partitionConsumer, err = consumer.ConsumePartition(topic, partition, offset)​
if err != nil {​
fmt.Println("create partition consumer err:", err)​
return​
}​
defer func() {​
if err := partitionConsumer.Close(); err != nil {​
fmt.Println(err)​
} else {​
fmt.Println("Close partition", partition)​
}​
}()​
for {​
select {​
case msg := <-partitionConsumer.Messages():​
fmt.Println("[Consume] topic:",​
msg.Topic, "parition:", msg.Partition, "offset:", msg.Offset, "key:", msg.Key, "value:", msg.Value)​
partitionOffsetManager.MarkOffset(msg.Offset+1, "")​
case err := <-partitionConsumer.Errors():​
fmt.Println("consume error:", err)​
case <-quit:​
return​
}​
}​
}​
​
SASL_PLAINTEXT​
通过 SASL 用户名和密码进行鉴权。您需要获取有权限用户的名称和密码,如何获取请参见查看 SASL 用户密码。​
​
package main​
​
import (​
"fmt"​
"os"​
"os/signal"​
"sync"​
​
"github.com/IBM/sarama"​
)​
​
func main() {​
brokers := []string{"xxx"} // 接入点地址​
topic := "my_topic" //要消费的topic​
cg := "test_cg" //消费者组​
​
config := sarama.NewConfig()​
config.Version = sarama.V0_10_2_0​
​
// SASL_PLAINTEXT配置​
config.Net.SASL.Enable = true​
config.Net.SASL.User = "用户名"​
config.Net.SASL.Password = "密码"​
config.Net.SASL.Mechanism = sarama.SASLTypePlaintext​
config.Net.SASL.Version = 0​
​
// 1. create client​
var client sarama.Client​
var err error​
client, err = sarama.NewClient(brokers, config)​
if err != nil {​
fmt.Println("create sarama client error:", err)​
}​
defer func() {​
if err := client.Close(); err != nil {​
fmt.Println("client close error:", err)​
} else {​
fmt.Println("Close client!")​
}​
}()​
​
// 2. create consumer​
consumer, err := sarama.NewConsumerFromClient(client)​
defer func() {​
if err := consumer.Close(); err != nil {​
fmt.Println("consumer close error:", err)​
} else {​
fmt.Println("Close consumer!")​
}​
}()​
if err != nil {​
fmt.Println("new consumer error:", err)​
}​
​
// 3. offset manager​
offsetManager, err := sarama.NewOffsetManagerFromClient(cg, client)​
defer func() {​
if err := offsetManager.Close(); err != nil {​
fmt.Println("close offset manager error:", err)​
} else {​
fmt.Println("Close offset manager!")​
}​
}()​
if err != nil {​
fmt.Println("new offset manager error:", err)​
}​
​
if !config.Consumer.Offsets.AutoCommit.Enable {​
defer offsetManager.Commit()​
}​
​
thr := sync.WaitGroup{}​
signals := make(chan os.Signal, 1)​
signal.Notify(signals, os.Interrupt)​
quit := make(chan int)​
​
// 4. start to consume partitions​
partitions, err := client.Partitions(topic)​
if err != nil {​
fmt.Println("get partitions error:", err)​
}​
fmt.Println("start consume. topic:", topic, "partitions:", partitions)​
for _, partition := range partitions {​
thr.Add(1)​
go consumePartition(quit, &thr, consumer, offsetManager, int32(partition), topic)​
}​
​
<-signals​
close(quit)​
thr.Wait()​
}​
​
func consumePartition(quit <-chan int, thr *sync.WaitGroup, consumer sarama.Consumer,​
offsetManager sarama.OffsetManager, partition int32, topic string) {​
defer thr.Done()​
​
partitionOffsetManager, err := offsetManager.ManagePartition(topic, partition)​
if err != nil {​
fmt.Println("create partitionOffsetManager err:", err)​
}​
offset, _ := partitionOffsetManager.NextOffset()​
if offset == -1 {​
offset = sarama.OffsetNewest​
}​
​
var partitionConsumer sarama.PartitionConsumer​
partitionConsumer, err = consumer.ConsumePartition(topic, partition, offset)​
if err != nil {​
fmt.Println("create partition consumer err:", err)​
return​
}​
defer func() {​
if err := partitionConsumer.Close(); err != nil {​
fmt.Println(err)​
} else {​
fmt.Println("Close partition", partition)​
}​
}()​
for {​
select {​
case msg := <-partitionConsumer.Messages():​
fmt.Println("[Consume] topic:",​
msg.Topic, "parition:", msg.Partition, "offset:", msg.Offset, "key:", msg.Key, "value:", msg.Value)​
partitionOffsetManager.MarkOffset(msg.Offset+1, "")​
case err := <-partitionConsumer.Errors():​
fmt.Println("consume error:", err)​
case <-quit:​
return​
}​
}​
}​
​
SASL_SSL​
通过 SASL 用户名和密码进行鉴权。您需要获取有权限用户的名称和密码,如何获取请参见查看 SASL 用户密码。​
​
package main​
​
import (​
"fmt"​
"os"​
"os/signal"​
"sync"​
​
"github.com/IBM/sarama"​
)​
​
func main() {​
brokers := []string{"xxx"} // 接入点地址​
topic := "my_topic" //要消费的topic​
cg := "test_cg" //消费者组​
​
config := sarama.NewConfig()​
config.Version = sarama.V0_10_2_0​
​
// SASL_SSL配置​
config.Net.SASL.Enable = true​
config.Net.SASL.User = "用户"​
config.Net.SASL.Password = "密码"​
config.Net.SASL.Mechanism = sarama.SASLTypePlaintext​
config.Net.TLS.Enable = true​
config.Net.SASL.Version = 0​
config.Net.TLS.Config = &tls.Config{}​
config.Net.TLS.Config.InsecureSkipVerify = true​
​
// 1. create client​
var client sarama.Client​
var err error​
client, err = sarama.NewClient(brokers, config)​
if err != nil {​
fmt.Println("create sarama client error:", err)​
}​
defer func() {​
if err := client.Close(); err != nil {​
fmt.Println("client close error:", err)​
} else {​
fmt.Println("Close client!")​
}​
}()​
​
// 2. create consumer​
consumer, err := sarama.NewConsumerFromClient(client)​
defer func() {​
if err := consumer.Close(); err != nil {​
fmt.Println("consumer close error:", err)​
} else {​
fmt.Println("Close consumer!")​
}​
}()​
if err != nil {​
fmt.Println("new consumer error:", err)​
}​
​
// 3. offset manager​
offsetManager, err := sarama.NewOffsetManagerFromClient(cg, client)​
defer func() {​
if err := offsetManager.Close(); err != nil {​
fmt.Println("close offset manager error:", err)​
} else {​
fmt.Println("Close offset manager!")​
}​
}()​
if err != nil {​
fmt.Println("new offset manager error:", err)​
}​
​
if !config.Consumer.Offsets.AutoCommit.Enable {​
defer offsetManager.Commit()​
}​
​
thr := sync.WaitGroup{}​
signals := make(chan os.Signal, 1)​
signal.Notify(signals, os.Interrupt)​
quit := make(chan int)​
​
// 4. start to consume partitions​
partitions, err := client.Partitions(topic)​
if err != nil {​
fmt.Println("get partitions error:", err)​
}​
fmt.Println("start consume. topic:", topic, "partitions:", partitions)​
for _, partition := range partitions {​
thr.Add(1)​
go consumePartition(quit, &thr, consumer, offsetManager, int32(partition), topic)​
}​
​
<-signals​
close(quit)​
thr.Wait()​
}​
​
func consumePartition(quit <-chan int, thr *sync.WaitGroup, consumer sarama.Consumer,​
offsetManager sarama.OffsetManager, partition int32, topic string) {​
defer thr.Done()​
​
partitionOffsetManager, err := offsetManager.ManagePartition(topic, partition)​
if err != nil {​
fmt.Println("create partitionOffsetManager err:", err)​
}​
offset, _ := partitionOffsetManager.NextOffset()​
if offset == -1 {​
offset = sarama.OffsetNewest​
}​
​
var partitionConsumer sarama.PartitionConsumer​
partitionConsumer, err = consumer.ConsumePartition(topic, partition, offset)​
if err != nil {​
fmt.Println("create partition consumer err:", err)​
return​
}​
defer func() {​
if err := partitionConsumer.Close(); err != nil {​
fmt.Println(err)​
} else {​
fmt.Println("Close partition", partition)​
}​
}()​
for {​
select {​
case msg := <-partitionConsumer.Messages():​
fmt.Println("[Consume] topic:",​
msg.Topic, "parition:", msg.Partition, "offset:", msg.Offset, "key:", msg.Key, "value:", msg.Value)​
partitionOffsetManager.MarkOffset(msg.Offset+1, "")​
case err := <-partitionConsumer.Errors():​
fmt.Println("consume error:", err)​
case <-quit:​
return​
}​
}​
}​
​
​
最近更新时间:2025.08.04 17:30:00
这个页面对您有帮助吗?
有用
有用
无用
无用