NATS 创建重复的收件箱以供回复
NATS creating duplicate inboxes for reply
我一直在玩 NATS 消息传递,使用 C# 客户端。我创建了一个发送同步请求的消息发布者:
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>}
我猜回复只能发给一个发布者,所以另一个发布者丢失了。
感谢您提出这个问题;重复的回复主题是一个错误。
一位贡献者最近为这个问题添加了一个 fix(源于 Random
如何使用 Environment.TickCount
作为种子)。
修复目前在 master 分支中;当新版本被删除时,我会更新这个答案。
我一直在玩 NATS 消息传递,使用 C# 客户端。我创建了一个发送同步请求的消息发布者:
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>}
我猜回复只能发给一个发布者,所以另一个发布者丢失了。
感谢您提出这个问题;重复的回复主题是一个错误。
一位贡献者最近为这个问题添加了一个 fix(源于 Random
如何使用 Environment.TickCount
作为种子)。
修复目前在 master 分支中;当新版本被删除时,我会更新这个答案。