nats消息队列学习笔记

2023-10-02 16:47:38 百科 悟空

nats 简介和使用

nats 有 3 个产品

    core-nats: 不做持久化的及时信息传输系统
    nats-streaming: 基于 nats 的持久化消息队列(已弃用)
    nats-jetstream: 基于 nats 的持久化消息队列

这里主要讨论 core-nats 和 nats-jetstream

nats 快速开始

  • 启动 nats
  • # 启动 nats
    docker run --network host -p 4222:4222 nats
  • Connect 连接
  • nc, err := nats.Connect("nats://localhost:4222")
    if err != nil {
      log.Fatal("NATS 连接失败")
    }
    defer nc.Close()
  • Publish 发布/生产消息
  • // 生产消息
    err := nc.Publish("foo", []byte("Hello World"))
    if err != nil {
      log.Fatal("NATS 发布失败")
    }
    // Flush 发布缓冲区
    err = nc.Flush()
    if err != nil {
      log.Fatal("NATS Flush 失败")
    }
  • 出于性能考虑, 发布的消息先写入到类似 Buffer 缓存的地方, 然后再一次性发送到 nats 服务器

    • Subscribe 订阅/消费消息
    • // 消费消息
      _, err = nc.Subscribe("foo", func(msg *nats.Msg) {
        fmt.Printf("收到消息: %s\n", msg.Data)
      })
      if err != nil {
        log.Fatal("NATS 订阅失败")
      // 消费消息
      // queue 是队列组的名称, 同一组队列最多只有一个接收者能成功接收
      _, _ = nc.QueueSubscribe("foo", "queue", func(msg *nats.Msg) {
          fmt.Printf("收到消息: %s\n", string(msg.Data))
      })
    • 信息传递模式

      NATS支持4种主要的通信模式。它们是

          基于主题
          发布-订阅
          请求-回复/分散-收集
          队列组

      每一个都是不同的模式,都有其使用案例,有一些重叠。允许所有这四种模式给了NATS极大的灵活性和功能,以应对多个应用程序之间的各种不同情况,或一个大型单体。

      基于主题的消息传递

      A 主题在NATS中是一个简单的字符串,代表对数据的兴趣。它被分_层标记_以支持_通配符订阅_。

          foo.* 匹配 _foo.bar_和 foo.baz
          foo.*.bar匹配 _foo.a.bar_和 foo.b.bar
          _foo.>_匹配上述任何一个
          _>_匹配NATS中的所有内容

      这种消息传递模式允许发布者使用一个_Subject_来共享数据,而消费者可以通过使用通配符来监听这些Subject来接收这些消息。

          从某种意义上说,这种模式是基于观察者设计模式的,它通常有一个_主题_和_观察者_。

      例如,如果有人向_'audit.us.east'_发送消息,那么所有监听该确切主题或通配符主题的订阅者都会收到这个消息。

      }

    •  
    •  
    •  

发表评论: