使用STOMP延迟websocket

时间:2017-06-11 17:13:56

标签: java spring websocket stomp

我使用SpringMVC 4 + Tomcat。我的应用程序有2个类(A和B)和@Autowired SimpMessagingTemplate。每个类都有一个调用" convertAndSend"。

的线程

A类发送一条由8个双字段和3个长字段组成的消息。它向大约发送消息。 500个主题,如" /topic/prices.X" (其中X - 一些随机字符串)。频率 - 单个循环中每秒最多4次(每个主题)。

B类发送的消息包含8个双字段,4个长字段和4个字符串字段。它将消息发送到像#34; / 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个客户端同时连接并订阅了所有主题。客户端应用程序 - .Net使用" websocket-sharp"具有STOMP协议的自定义实现的库。服务器在纽约,客户在芝加哥和伦敦。

在我们的UAT环境中一切正常,但在产品中,一位用户抱怨以下问题:

  • 在某些情况下,来自B类的消息会以大约30-40秒的延迟发送给客户。同时,来自A类的消息不会有任何延迟。当以最大频率发送来自A类的消息的频率(每个主题每秒4次=每秒2000条消息)时,会发生这种情况。当频率降低时,延迟消失。

我用sequenceId标记了每条消息,并注意到来自ClassB的消息无论如何都以错误的顺序传递。例如,服务器发送:

  • message1 - > /topic/prices.A
  • message2 - > /topic/prices.B
  • message3 - > /主题/ 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 - > /主题/ dmaEvents
问题1:预期的行为是什么?

问题2:延迟可能是什么原因?我应该用registration.taskExecutor()去掉解决方案.coreCoolSize(1);并实现一个逻辑来保护客户端的消息顺序?

谢谢。

1 个答案:

答案 0 :(得分:0)

我遇到类似的问题,STOMP消息的停止/缓慢交付,结果是春天使用的反应堆库造成的。

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

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")