🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] > [github](https://github.com/nats-io/nats-server) ## 概述 nats是Go实现的一个高性能分布式消息队列,适用于高并发高吞吐量的消息分发场景。早期的nats以速度为重,没有支持持久化。从16年开始,nats通过nats-streaming支持基于日志的持久化,以及可靠的消息传输。为了演示方便,我们本节中只使用nats 向subject为task发消息: ![](https://img.kancloud.cn/d8/8c/d88c96b10dce7b3906d72effddd92257_438x327.png) 以workers的queue从tasks subject订阅消息: ![](https://img.kancloud.cn/be/32/be3276dfff2f13e5eda8da9952daa1bb_584x156.png) ## 实例 **基本消息生产** ``` nc, err := nats.Connect(nats.DefaultURL) if err != nil {return} // 指定 subject 为 tasks,消息内容随意 err = nc.Publish("tasks", []byte("your task content")) nc.Flush() ``` **基本消息消费** 直接使用nats的subscribe API并不能达到任务分发的目的,因为pub sub本身是广播性质的。所有消费者都会收到完全一样的所有消息。 除了普通的subscribe之外,nats还提供了queue subscribe的功能。只要提供一个queue group名字(类似Kafka中的consumer group),即可均衡地将任务分发给消费者。 ``` nc, err := nats.Connect(nats.DefaultURL) if err != nil {return} // queue subscribe 相当于在消费者之间进行任务分发的分支均衡 // 前提是所有消费者都使用 workers 这个 queue // nats 中的 queue 概念上类似于 Kafka 中的 consumer group sub, err := nc.QueueSubscribeSync("tasks", "workers") if err != nil {return} var msg *nats.Msg for { msg, err = sub.NextMsg(time.Hour * 10000) if err != nil {break} // 正确地消费到了消息 // 可用 nats.Msg 对象处理任务 } ```