Golang 消息服务NATS

背景:NATS 官方性能测试吞吐高于Kafka、NSQ、RabbitMQ、Redis等其他消息服务,而且是Go语言,值得关注。

Golang 消息服务NATS

NATS是一个分布式的消息队列系统,支持Pub,Sub/Req,Rsp 模型。

NATS实现了三种模式

Publish Subscribe 发布订阅模式

Request Reply 请求响应模式

Queueing 消息队列模式

安装:

go get github.com/nats-io/gnatsd

./sub -s nats://localhost:4222 -t abc

./pub -s nats://localhost:4222 abc msg_abc

NATS的消息通信模型是应用程序的数据被编码为一条消息,并通过发布者发送出去;订阅者接收到消息,进行解码,再处理。订阅者处理NATS消息可以是同步的或异步的。

NATS的协议是一个简单的、基于文本的发布/订阅风格的协议。客户端连接到 gnatsd(NATS服务器),并与 gnatsd 进行通信,通信基于普通的 TCP/IP 套接字,并定义了很小的操作集,换行表示终止。

NATS支持每一个服务按照集群模式方式运行。可以将这些服务组织在一起形成一个集群来提高服务器的容量的消息传递系统,并可以提升整个系统的弹性话和高可用性。NATS集群服务器转发是通过一个跳跃来完成的。这意味着每个gnatsd当从一个客户端接收到消息之后通过路由信息会立即转发给对应注册的gnatsd实例。接收到的消息通过一个路由才会分发给本地的客户。

官方示例:

nc, _ := nats.Connect(nats.DefaultURL)

// Simple Publisher

nc.Publish("foo", []byte("Hello World"))

// Simple Async Subscriber

nc.Subscribe("foo", func(m *nats.Msg) {

fmt.Printf("Received a message: %s\n", string(m.Data))

})

// Simple Sync Subscriber

sub, err := nc.SubscribeSync("foo")

m, err := sub.NextMsg(timeout)

// Channel Subscriber

ch := make(chan *nats.Msg, 64)

sub, err := nc.ChanSubscribe("foo", ch)

msg :=

// Unsubscribe

sub.Unsubscribe()

// Requests

msg, err := nc.Request("help", []byte("help me"), 10*time.Millisecond)

// Replies

nc.Subscribe("help", func(m *Msg) {

nc.Publish(m.Reply, []byte("I can help!"))

})

// Close connection

nc, _ := nats.Connect("nats://localhost:4222")

nc.Close();

参考文献:https://www.nats.io/documentation/

小结:NATS 是Go语言写的,性能还可以,但是要用到企业级还有很多的不足,持久化,ACK,重试,failover等都需要进一步的完善。

更多内容请关注每日编程,每天进步一点。


分享到:


相關文章: