【问题标题】:Delays with STOMP over websocketSTOMP over websocket 的延迟
【发布时间】: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


    【解决方案1】:

    我遇到了类似的问题,即 STOMP 消息的延迟/缓慢传递,结果证明这是由 spring 中使用的反应器库引起的。

    将它更新到更高版本为我修复了它:

    runtime("io.projectreactor:reactor-core:2.0.6.RELEASE")
    runtime("io.projectreactor:reactor-net:2.0.6.RELEASE")
    runtime("io.netty:netty-all:4.0.33.Final")
    

    【讨论】:

      猜你喜欢
      • 2016-06-28
      • 1970-01-01
      • 2014-10-18
      • 1970-01-01
      • 2016-10-20
      • 2016-06-04
      • 2014-07-31
      • 2010-11-07
      • 2013-06-11
      相关资源
      最近更新 更多