登录
首页 >  Golang >  Go问答

NATS JetStream:如何请求 JetStream 重新发送主题 foo.* 中最新的消息?

来源:stackoverflow

时间:2024-02-18 19:54:23 316浏览 收藏

golang学习网今天将给大家带来《NATS JetStream:如何请求 JetStream 重新发送主题 foo.* 中最新的消息?》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!

问题内容

本质上就是主题所说的内容。

我想知道 JetStream 是否可以通过某种方式进行查询,允许我们重新获取主题“foo.*”的最后 15 条消息,或者 JetStream 在过去 1.5 秒内收到的关于主题“foo.*”的消息.

如果可能的话,我们将不胜感激任何代码示例或代码示例链接。


正确答案


  • jetstream中有一种方法可以实现与时间相关的检索。

    now := time.Now()
    oneAndHalfSecondAgo := now.Add(time.Millisecond * -1500)
    
    js, _ := nc.JetStream()
    sub, err := js.SubscribeSync(
         "foo.*",
         nats.OrderedConsumer(),
         nats.StartTime(oneAndHalfSecondAgo),
    )
    
    for {
        msg, err := sub.NextMsg(10 * time.Second) //oldest->newer ones
        if err != nil {
            log.Fatal(err)
        }
    
        // 1. check timestamp of message and if its after ‘now’ then we break out of the for loop here
    
        // 2. if the message is before now we can push it in an array here
    }

    请注意,这种技术虽然有用,但效率相当低,因为我们一条一条地抓取消息。

    我们可以使用 .subscribe() (异步)修改它,但这样我们就会遇到不同的问题:

    我们会从 jetstream 过度拉取过去的时刻,然后我们必须确保我们抓取的缓冲消息确实会返回到 jetstream。据我所知,没有配置选项可以告诉 jetstream 有关“maxtime”的信息。

  • 至于如何“获取最新的 n 条消息”,可以修改上面的代码示例,以便他能够获取相当多的消息块(即最近 5 秒或 10 秒或 30 秒内的所有消息)在获取当前所有消息后,他可以获取最新的“n”条消息。

    这种技术当然并不理想,但似乎没有其他方法可以做到这一点 - 至少在撰写本文时没有。

据官方docs

  • 可以从特定时间开始抓取消息:最后 1.5 秒内。
  • 另一个要求,最后15条消息,我认为不可能

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>