问题标签 [nats.io]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
578 浏览

c# - NATS 为回复创建重复的收件箱

我一直在使用 C# 客户端玩 NATS 消息传递。我创建了一个发送同步请求的消息发布者:

我使用队列组创建多个订阅者:

一切都很好。我可以发送多条消息,每条消息都发送给一个且只有一个订阅者,发送响应。

但是,如果我开始使用多个队列组,事情就会出错。假设我创建了 20 个发布者,使用主题“S1”、“S2”、“S3”进行发布……对于每个发布者我创建 5 个订阅者,所以第一个发布者的订阅者有一个主题“S1”和一个队列名称“Q1”等。

当我启动一个测试应用程序,让 20 个发布者在各自的线程中运行时,事情很快就停止了工作。发布者在等待同步响应时挂起。

我添加了一些跟踪,似乎回复令牌被复制了。因此,例如,两个不同的订阅者接收指定相同收件箱的消息以进行回复:

我猜回复只能发给一个发布者,所以另一个会丢失。

0 投票
2 回答
1786 浏览

message-queue - NATS 发布者可以将单个消息发送到多个队列吗?

我正在构建一个系统,其中两个不同的实体需要处理来自同一源的消息(以不同的方式 - 例如一个将记录所有消息,而另一个实体可能想要聚合数据)。

理想情况下,每个实体在性能和弹性方面都是完全可扩展的,因此我们有多个发布者、多个日志订阅者和多个聚合订阅者,但每个发布者生成的每条消息仍然只由一个日志订阅者和一个聚合订阅者处理。

使用 AMQP,我们可以通过将消息发布到扇出交换器来实现这一点,该交换器将消息分发到两个队列,每个队列都有许多订阅者。我知道在 NATS 中可以实现相同的行为,只需让所有订阅者根据其角色使用两个不同的“队列组名称”来监听相同的“主题”。

在这种情况下,发给主题的消息将被从每个队列组传递给一个订阅者,即每条消息将被准确地传递 n 次,n 是不同队列组的数量而不是订阅者的数量。这个对吗?

0 投票
1 回答
450 浏览

python - 如何使用 Python Tornado 为 NATS 客户端设置延迟的、非阻塞的自停止

我试图让 Tornado 在超时后停止而不阻止任何现有功能。我可能错过了 Tornado 约定,但无论我使用 spawn_callback、Task 还是 Thread,我似乎都在阻止主循环。

首先,我这样做的原因是因为我想在客户端应用程序中使用世界著名的 NATS 消息总线来发布消息(不是通常的直接 HTTP 功能),然后等待订阅的响应。异步行为的典型问题,官方 NATS Python 客户端使用 Tornado,所以我也在尝试使用它。

我怀疑我的问题与理解 tornado.gen.coroutine 装饰器如何与线程一起工作有关。

我的代码片段如下。如果有人注意到我的明显问题,我将不胜感激。谢谢!

0 投票
1 回答
1314 浏览

scala - NATS 流媒体服务器用户速率限制和一次交付

我正在玩一些 NATS 流媒体,但订阅者速率限制有问题。当我将飞行中的最大值设置为 1 并将超时设置为 1 秒并且我有一个基本上是 Thread.sleep(1000) 的消费者时,我会多次获得相同的事件。我认为通过限制飞行和使用手动确认这不应该发生。我怎样才能在非常慢的消费者身上得到非常好的一次交付?

0 投票
1 回答
116 浏览

python - 协程产量继续主

我正在尝试使用协程将数据发送到 NATS(nats.io 消息系统)。

当我尝试在没有参数和 for 循环的情况下调用此代码时,它运行良好。

但是当我添加参数时,yield nc.connect 函数不会返回任何内容并继续主函数。

如何使用参数调用任何协程?

0 投票
1 回答
927 浏览

nats.io - NATS IO 性能调优

我用 Java 编写了发布者和订阅者。在服务器级别也进行了集群。能够以 500 TPS(每秒事务)的速率发布和订阅 30 KB 的消息。

但我想将我们的性能提高到 2000 TPS 以上。请建议如何实现相同的目标。

我已经将 Java 与 Apache Camel 一起使用。

0 投票
2 回答
3373 浏览

go - Golang Nats 订阅问题

我目前从事微服务架构的工作。在我将 NATS 插入我的项目之前,我想用它测试一些简单的场景。

在一个场景中,我有一个简单的发布者,它在 localhost:4222 上运行的基本 Nats 服务器上的 for 循环中发布 100.000 条消息。

最大的问题是订阅者。当他收到 30.000 - 40.000 条消息时,我的整个 main.go 程序和所有其他 go 例程都会停止并且什么也不做。我可以用 ctrl + c 退出。但是发布者仍在继续发送消息。当我打开一个新终端并启动一个新的订阅者实例时,一切都会再次正常工作,直到订阅者收到大约 30000 条消息。最糟糕的是,服务器上什至没有出现一个错误,也没有日志,所以我不知道发生了什么。

之后,我尝试用 QueueSubscribe 方法替换订阅方法,一切正常。

订阅和队列订阅的主要区别是什么?

NATS-Streaming 是更好的机会吗?或者在哪些情况下我应该更喜欢 Streaming 以及标准 NATS-Server

这是我的代码:

出版商:

订户:

0 投票
2 回答
1575 浏览

asynchronous - 对请求的 NATS 异步回复不是异步的

我正在尝试使用 GO 语言在 gnatsd 中实现请求/响应功能,我意识到 gnatsd 不会以异步方式回复请求。

我使用 NATS github 示例https://github.com/nats-io/go-nats/tree/master/examples - 示例 nats-req.go 和 nats-rply.go开始了我的调查。这些例子效果很好。

然后我修改它们只是为了测试 gnatsd 上的并行请求,并提供一些调试信息,其中处理异步回复的 goroutine ID。有修改示例的源代码。

nats-rply.go已被修改为简单地返回传入请求的文本以及有关当前 goroutine ID 的信息。我还在异步处理功能中添加了 1 秒睡眠来模拟一些处理时间。

nats-req.go已被修改为在并行启动的 10 个单独的 goroutine 中发送 10 个请求,请求超时已设置为 3.5 秒。我尝试了具有共享 NATS 连接(函数 oneReq())的 goroutine 以及具有自己的 NATS 连接(函数 onReqSeparateConnect())的 goroutine - 结果相同。

并且有结果 - 不需要的行为,看起来 nats-rply.go 只创建了一个 goroutine 来处理传入的请求,并且请求以串行方式处理。nats-req.go 一次性发送所有 10 个请求,超时设置为 3.5 秒。nats-rply.go 开始以串行方式以一秒的间隔响应请求,因此只有 3 个请求得到满足,直到 3.5 秒超时被破坏 - 其余请求超时。响应消息还包含所有传入请求的 GoroutineID!即使再次启动 nats-req,goroutine id 也是一样的,只有在 nats-rply.go 服务器重新启动时,ID 才会更改。

nats-req.go 日志

nats-rply.go 日志

请任何想法,如何在 NATS 中使用异步(并行)响应处理正确实现请求/响应通信?感谢您提供任何信息。

0 投票
1 回答
1424 浏览

go - Nats.io QueueSubscribe 超时行为

我正在评估 NATS 以迁移现有的基于 msg 的软件我没有找到有关 msg 超时异常和过载的文档。例如:

  • 选择订阅者后,是否知道发布者发布的超时设置?是否可以通知额外的时间延长?
  • If the elected subscriber is aware that some DBMS connection is missing and cannot complete It could be possible to bounce the message

NATS 服务器将接收另一个订阅者并重新发布相同的消息?

迭戈

0 投票
3 回答
602 浏览

performance - NATS IO 内部架构

目前我正在为一个项目将 TIBCO RV 迁移到 NATS IO。我很想知道是什么内部架构使 NATS IO 在其网站http://nats.io/about/中声称具有卓越的性能。我在网上找不到任何解释 nats 内部结构的资源。有人可以帮我吗?