我希望有人能帮我解决我正在使用的Qpid C ++应用程序遇到的问题。基本上,我们有一个应用程序以大约10Hz的速率将状态发布到last_value_queue,并且其他几个应用程序不断处理此状态。接收者也将状态用作一种心跳,并且如果状态消息在一段时间内没有更新,则会抱怨(确切地说是500ms)。
大约一天工作正常,之后我们开始看到问题。每隔几个小时,接收器的单次提取呼叫将阻塞超过500毫秒(有时长达900毫秒)。这种情况将持续到我们重新启动代理。
我不是专家,但我认为我没有做任何特别愚蠢的事情。我已经能够使用一对连接到代理的小应用程序重复此行为。发送方每隔100ms发送一个std :: chrono :: time_point对象设置为当前时间。接收器获取消息并计算延迟到毫秒。延迟总是0ms或1ms,除了在所有快乐的第一天之后每小时左右的单峰值。连接创建如下:
qpid::messaging::Connection c("host1:5672","{ reconnect: true}");
,发件人和收件人都是用字符串
创建的"testQueue; { mode: browse, create: always, node: { type: queue, x-declare:{ arguments:{'qpid.last_value_queue_key':'key','qpid.replicate':'none'}}}}"
在代理上启用了高可用性复制,但我为了测试目的明确禁用了所有内容。当代理和应用程序在LAN上的同一主机或不同主机上运行时,我发现行为没有区别。使用qpid-stat,我可以看到代理复制队列仍在传输相当多的数据,但它的消息计数总是为0,所以我认为它发送的数量超过它可以处理的数量。谁能想到我可能会遗漏的任何可能导致这种行为的事情?我们正在使用Qpid 0.26和C ++代理。