【发布时间】:2017-11-13 04:03:12
【问题描述】:
我使用 SpringMVC 4 + Tomcat。我的应用程序使用@Autowired SimpMessagingTemplate 有 2 个类(A 和 B)。每个类都有一个调用“convertAndSend”的线程。
A 类发送一条由 8 个双字段和 3 个长字段组成的消息。它将消息发送到大约。 500 个主题,例如“/topic/prices.X”(其中 X - 一些随机字符串)。频率 - 在单个循环中每秒最多 4 次(针对每个主题)。
B 类发送一个包含 8 个双字段、4 个长字段和 4 个字符串字段的消息。它将消息发送到单个主题,例如“/topic/dmaEvents”。频率 - 每秒数次(最多可达 20 次)。
对于我的应用程序来说,保持消息顺序非常重要,因此我应用了此处描述的解决方案:
SockJS receive stomp messages from spring websocket out of order
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.taskExecutor().corePoolSize(1);
}
我们有大约 10-20 个客户端同时连接并订阅所有主题。客户端应用程序 - 使用“websocket-sharp”库和自定义实现 STOMP 协议的 .Net 应用程序。服务器在纽约,客户端在芝加哥和伦敦。
在我们的 UAT 环境中一切正常,但在 prod one 中,用户抱怨以下问题:
- 在某些情况下,来自 B 类的消息会延迟大约 30-40 秒传送到客户端。同时,来自 A 类的消息会毫无延迟地传递。当来自 A 类的消息的频率以最大频率发送时会发生这种情况(每个主题每秒 4 次 = 每秒 2000 条消息)。当频率降低时,延迟消失。
我用 sequenceId 标记了每条消息,并注意到来自 ClassB 的消息以错误的顺序传递。例如,服务器发送:
- message1 -> /topic/prices.A
- message2 -> /topic/prices.B
- message3 -> /topic/dmaEvents
- message4 -> /topic/prices.C
- message5 -> /topic/prices.D
客户收到:
- message1 -> /topic/prices.A
- message2 -> /topic/prices.B
- message4 -> /topic/prices.C
- message5 -> /topic/prices.D
- message3 -> /topic/dmaEvents
问题1:这是预期的行为吗?
问题 2:延迟的原因可能是什么?我应该摆脱registration.taskExecutor().corePoolSize(1)的解决方案吗?并实现一个逻辑来保护客户端的消息顺序?
谢谢。
【问题讨论】:
标签: java spring websocket stomp