NATS为回复创建重复的收件箱

时间:2017-07-04 11:22:15

标签: c# nats.io

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

IConnection connection = new ConnectionFactory().CreateConnection();
Msg rsp = connection.Request("subject", Encoding.ASCII.GetBytes("some text"));

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

IConnection connection = new ConnectionFactory().CreateConnection();
connection.SubscribeAsync(
    "subject",
    "queue",
    (sender, args) =>
    {
        connection.Publish(args.Message.Reply, new byte[] { 0x00 });
    });

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

但是,如果我开始使用多个队列组,则会出现问题。假设我创建了20个发布者,使用主题“S1”,“S2”,“S3”发布,...对于每个发布者,我创建了5个订阅者,因此第一个发布者的订阅者具有“S1”主题和队列名称“Q1”& c。

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

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

Subject=S3;Reply=_INBOX.C403F3CD707D0EA6F4B1167CE0;Payload=<some text>}
Subject=S4;Reply=_INBOX.C403F3CD707D0EA6F4B1167CE0;Payload=<some text>}

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

1 个答案:

答案 0 :(得分:2)

谢谢你提出这个问题;复制的回复主题是一个错误。  最近,撰稿人为此问题添加了fix(源自Random如何使用Environment.TickCount作为种子)。

修复程序目前在master分支中;我会在新版本发布时更新此答案。