如何使已发布的队列自动持久化?
How to make a published queue automatically durable?
我正在试验 Nats 流媒体服务器,到目前为止它看起来很有前途。
但是,队列似乎只有在为其创建持久订阅后才能持久。
这当然是有道理的,但是它在微服务架构中的实践如何运作?
例如,假设您正在发布服务,而 Service1 正在将消息发送到尚未持久且没有侦听器的队列。一段时间后相应的服务启动并使该队列持久化。您是只处理这种有希望的短暂损失还是确保先启动后期服务?
抱歉耽搁了。在 NATS Streaming 中,发布到频道的任何消息都会被存储,无论订阅兴趣如何。您可以在 "foo" 上试验并发布 3 条消息。然后,您可以开始订阅(甚至是非持久订阅)并重播这些消息。这只是指定订阅起点的问题。例如,有一个选项可以交付 "all available"。使用 Go nats 示例,它将是:
$ go run examples/stan-pub/main.go foo msg1
Published [foo] : 'msg1'
$ go run examples/stan-pub/main.go foo msg2
Published [foo] : 'msg2'
$ go run examples/stan-pub/main.go foo msg3
Published [foo] : 'msg3'
$ go run examples/stan-sub/main.go -id "me" -all foo
Connected to nats://127.0.0.1:4222 clusterID: [test-cluster] clientID: [me]
Listening on [foo], clientID=[me], qgroup=[] durable=[]
[#1] Received: sequence:1 subject:"foo" data:"msg1" timestamp:1583947471103854000
[#2] Received: sequence:2 subject:"foo" data:"msg2" timestamp:1583947472684693000
[#3] Received: sequence:3 subject:"foo" data:"msg3" timestamp:1583947473990567000
我正在试验 Nats 流媒体服务器,到目前为止它看起来很有前途。 但是,队列似乎只有在为其创建持久订阅后才能持久。 这当然是有道理的,但是它在微服务架构中的实践如何运作?
例如,假设您正在发布服务,而 Service1 正在将消息发送到尚未持久且没有侦听器的队列。一段时间后相应的服务启动并使该队列持久化。您是只处理这种有希望的短暂损失还是确保先启动后期服务?
抱歉耽搁了。在 NATS Streaming 中,发布到频道的任何消息都会被存储,无论订阅兴趣如何。您可以在 "foo" 上试验并发布 3 条消息。然后,您可以开始订阅(甚至是非持久订阅)并重播这些消息。这只是指定订阅起点的问题。例如,有一个选项可以交付 "all available"。使用 Go nats 示例,它将是:
$ go run examples/stan-pub/main.go foo msg1
Published [foo] : 'msg1'
$ go run examples/stan-pub/main.go foo msg2
Published [foo] : 'msg2'
$ go run examples/stan-pub/main.go foo msg3
Published [foo] : 'msg3'
$ go run examples/stan-sub/main.go -id "me" -all foo
Connected to nats://127.0.0.1:4222 clusterID: [test-cluster] clientID: [me]
Listening on [foo], clientID=[me], qgroup=[] durable=[]
[#1] Received: sequence:1 subject:"foo" data:"msg1" timestamp:1583947471103854000
[#2] Received: sequence:2 subject:"foo" data:"msg2" timestamp:1583947472684693000
[#3] Received: sequence:3 subject:"foo" data:"msg3" timestamp:1583947473990567000