- 使用docker开启一个Pulsar服务
docker run -d -p 6650:6650 -p 8080:8080 apachepulsar/pulsar:latest bin/pulsar standalone
在Go 中使用Apache
1. 安装依赖
go get github.com/apache/pulsar-client-go/pulsar
2. 创建角色(生产者,消费者,读取器)
a. 生产者
-
- 绑定url
- 使用Topic确定主题
- 发送字节数据
- 根据发送消息的报错,来判断消息是否发送成功
// 生产者(用于发送消息到队列)
func TestProducer(t *testing.T) {
client, err := pulsar.NewClient(pulsar.ClientOptions{
URL: "pulsar://60.204.241.30:6650",
})
defer client.Close()
producer, err := client.CreateProducer(pulsar.ProducerOptions{
Topic: "my-topic",
})
_, err = producer.Send(context.Background(), &pulsar.ProducerMessage{
Payload: []byte("11111111"),
})
defer producer.Close()
if err != nil {
fmt.Println("Failed to publish message", err)
} else {
fmt.Println("Published message")
}
}
b. 消费者
-
- 用于接受消息并选择是否确认
- 订阅消息的主题
- 设置自己的订阅者名称(使用不同的订阅者名称防止消息的争抢)
// 消费者(读取消息,并选择是否要确认消息)
func TestConsumer(t *testing.T) {
client, err := pulsar.NewClient(pulsar.ClientOptions{
URL: "pulsar://60.204.241.30:6650",
})
if err != nil {
log.Fatal(err)
}
defer client.Close()
consumer, err := client.Subscribe(pulsar.ConsumerOptions{
Topic: "my-topic",
SubscriptionName: "my-sub",
Type: pulsar.Shared,
})
defer consumer.Close()
// 获取消息
for {
msg, err := consumer.Receive(context.Background())
if err != nil {
log.Fatal(err)
}
payload := msg.Payload()
fmt.Printf("Received message msgId: %#v -- content: '%s'\n", msg.ID(), string(payload))
err = consumer.Ack(msg)
if err != nil {
log.Fatal(err)
}
}
}
-
- Exclusive consumers(独占消费者)👆默认
-
-
- 消费者一对一消费一个队列,其他的消费者不能订阅这个队列,直到这个消费者挂掉
-
-
- 多个消费者可以共享一个队列,前提是你们的名称(SubscriptionName)不一样,名称一样的话视为同一个消费者
-
- Failover consumers(失败重试消费者)
-
-
- 类似于独占消费者,如果主消费者挂掉了就会选择一个从消费者来接受消息
-
- 订阅者要对消息进行确认,不确认的话,消息依旧是未读状态
- 重启这个消费者,依旧会接受到未读的所有消息
- Shared consumers(共享消费者)的状态下面,不同的消费者不接受的消息不回影响其他的消费者,也就是自己收自己的,互不干扰
c. 读取器
-
- 绑定服务端
- client.CreateReader创建
- 循环读取消息,包括确认掉的消息都会读取过来
- StartMessageID这个设置消息从这个id开始读取(消息格式一般是14:28:0)使用pulsar.EarliestMessageID()直接读取最开始的消息
// 读取器(读取所有的消息,包括确认的消息)
func TestReader(t *testing.T) {
client, err := pulsar.NewClient(pulsar.ClientOptions{URL: "pulsar://60.204.241.30:6650"})
if err != nil {
log.Fatal(err)
}
defer client.Close()
reader, err := client.CreateReader(pulsar.ReaderOptions{
Topic: "my-topic",
StartMessageID: pulsar.EarliestMessageID(),
})
if err != nil {
log.Fatal(err)
}
defer reader.Close()
for reader.HasNext() {
msg, err := reader.Next(context.Background())
if err != nil {
log.Fatal(err)
}
fmt.Printf("Received message msgId: %#v -- content: '%s'\n",
msg.ID(), string(msg.Payload()))
}
}