Solace JCSMP API显示“订户流已阻塞”

时间:2018-10-13 08:24:10

标签: solace

当使用Solace JCSMP Java库订阅Direct Messaging中负载较重的主题时,我收到以下内容。我可以知道会有什么影响吗?这会导致消息丢失吗?有什么补救措施?

2018-10-08 10:18:43 INFO  FlowHandleImpl:67 - Subscriber flow congested, disabling connection read.
2018-10-08 10:18:43 INFO  FlowHandleImpl:42 - Subscriber flow uncongested, re-enabling connection read.

1 个答案:

答案 0 :(得分:0)

根据Solace支持,这是由API中的内部消息流队列已满引起的。以下总结了我对Solace支持的了解。

Java API维护内部消息队列,以传递到使用者会话。如果此队列达到使用者的拥塞限制(默认为5000个元素),则API将停止从套接字读取数据,并且出口缓冲区工作队列将在Solace路由器上受到反压力。 “订户流已拥塞,禁用了连接读取” 发生这种情况时将生成日志。这可能导致消息丢弃。一旦应用程序赶上了,API就会继续从套接字读取数据,并生成类似“用户流未阻塞,重新启用连接读取”之类的日志。

我们可以通过调用com.solacesystems.jcsmp.JCSMPGlobalProperties的setConsumerDefaultFlowCongestionLimit()进行调整

在发生此问题时,可以使用以下CLI命令检查消息丢弃:

show client <name> stats detail
show client <name> connections wide
show client <name> stats queues

如果在发布时将“传递到一个(DTO)”设置为true的情况下发布消息,则增加消息订阅者的数量将有助于负载均衡负载,并且可以减轻消息丢弃的问题。

了解Solace API如何使用Threading When Receiving Messages处理传入消息以了解此问题也很有趣。

在同步和异步接收消息时,每个使用者流都有自己的内部消息队列。消息总是通过上下文/反应器线程添加到这些队列中。

在异步情况下,将消息添加到使用者流的消息队列中时,有一个事件被添加到称为使用者通知调度队列的单独队列中。该事件唤醒使用者分配线程。根据事件,调度线程将从消息队列中取出消息,并将其传递到相应的消息回调。

在同步情况下,应用程序线程通过调用receive()从消息队列中使消息出队。在这种情况下,不使用使用者通知调度队列。