最近遇到一个需求,对接某公有云上的坐席系统,需要接收人工坐席和客户对话的语音流,然后调用ASR(Automatic Speech Recognition,自动语音识别)引擎,对语音流实时转写,最后将实时转写的内容推送到kafka,供下游系统消费。

大致流程图如下:

标绿的系统即是我方需求对接系统。

问题: 上述前面流程都没问题,但是发现最终的转写内容总是会丢最后的一两句话。对接系统也没有错误日志。

联系坐席客服系统研发人员协助排查问题,刚开始对方的研发人员也没发现问题,对方系统也没有错误日志(是压根就没打印日志,这个是最坑的)。最后排查很久依然无法找到问题,就只能对方的测试系统和我本地的系统直接联调。对方的系统开启日志后发现有一个报错,报错如下:

2024-04-02 15:23:46.144  INFO 1 --- [tReadThread-152] c.t.c.a.rasr.client.RasrClientWebSocket  [] [] [] [] [] : rasr-web-socket onClose. message=No async message support and buffer too small. Buffer size: [8,192], Message size: [76,992]...

该日志就很明显了,我方系统的Websocket服务端默认接收的字节流长度为8192,但是发送的字节流达到了76992,所以最后的音频流接收不到,导致最后几句话的内容丢失。

为什么只会丢失最后几句话?

原因:坐席客服系统重复发语音流的过程中语音流的长度为4096,未超过WebSocket服务端默认接收的字节流长度,所以中间过程没问题。但是最后通话结束后,坐席客服系统会把剩余所有的字节流全部发送过来,字节流的长度超过了8096,服务端不会接收该字节流导致最后的语音流丢失,且服务端没有相关错误日志。

怎么解决?

如何增加spring-sockjs-websocket服务器实现的输出缓冲区

因为是用Springboot整合Websocket,只需增加如下配置即可调整输出缓冲区:

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean; /**
* 开启WebSocket支持
*
* @author wave-muly
*/
@Slf4j
@Configuration
public class WebSocketConfig { @Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
} @Bean
public ServletServerContainerFactoryBean createServletServerContainerFactoryBean() {
ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
container.setMaxTextMessageBufferSize(102400);
container.setMaxBinaryMessageBufferSize(102400);
log.info("Websocket factory returned");
return container;
}
}

参考链接:

How to increase output buffer for spring sockjs websocket server implementation - Stack Overflow

在spring-boot利用websocket上传文件发现的问题 | 生子当如哈士奇的小空间

Springboot整合WebSocket作为服务端遇到的坑的更多相关文章

  1. springboot整合websocket实现客户端与服务端通信

    定义  WebSocket是通过单个TCP连接提供全双工(双向通信)通信信道的计算机通信协议.此WebSocket API可在用户的浏览器和服务器之间进行双向通信.用户可以向服务器发送消息并接收事件驱 ...

  2. Springboot整合Websocket遇到的坑

    Springboot整合Websocket遇到的坑 一.使用Springboot内嵌的tomcat启动websocket 1.添加ServerEndpointExporter配置bean @Confi ...

  3. SpringBoot 整合 WebSocket

    SpringBoot 整合 WebSocket(topic广播) 1.什么是WebSocket WebSocket为游览器和服务器提供了双工异步通信的功能,即游览器可以向服务器发送消息,服务器也可以向 ...

  4. springboot整合websocket原生版

    目录 HTTP缺点 HTTP websocket区别 websocket原理 使用场景 springboot整合websocket 环境准备 客户端连接 加入战队 微信公众号 主题 HTTP请求用于我 ...

  5. springboot整合websocket实现一对一消息推送和广播消息推送

    maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  6. spring集成webSocket实现服务端向前端推送消息

    原文:https://blog.csdn.net/ya_nuo/article/details/79612158 spring集成webSocket实现服务端向前端推送消息   1.前端连接webso ...

  7. Spring Boot 集成 WebSocket 实现服务端推送消息到客户端

    假设有这样一个场景:服务端的资源经常在更新,客户端需要尽量及时地了解到这些更新发生后展示给用户,如果是 HTTP 1.1,通常会开启 ajax 请求询问服务端是否有更新,通过定时器反复轮询服务端响应的 ...

  8. SpringBoot整合websocket简单示例

    依赖 <!-- springboot整合websocket --> <dependency> <groupId>org.springframework.boot&l ...

  9. SpringBoot整合log4j2进行日志配置及防坑指南

    写在前面 最近项目经理要求将原先项目中的日志配置logBack,修改为log4j2,据说是log4j2性能更优于logback,具体快多少,网上有说快10多倍,看来还是很快的,于是新的一波挑战又开始了 ...

  10. springboot整合websocket高级版

    目录 sockjs介绍 产生的原因 环境搭建 springboot整合sockjs 使用场景 聊天室开发 点对点通信 群聊 效果 总结 加入战队 微信公众号 上一章节我们说了websocket的优缺点 ...

随机推荐

  1. Android复习(二)应用资源——>更多类型

    更多资源类型 本页面定义了更多类型的可具体化的资源,包括: Bool 带有布尔值的 XML 资源. 颜色 带有颜色值(十六进制颜色)的 XML 资源. 尺寸 带有尺寸值(包含度量单位)的 XML 资源 ...

  2. select语句

    SELECT语句可以从表中选择数据 SELECT <列名1>,<列名2> as "aaa" FROM <表名>; 查询两列数据SELECT * ...

  3. .NET 内存管理两种有效的资源释放方式

    前言 嗨,大家好!今天我们要聊一聊 .NET 中的内存管理.你知道吗?虽然 .NET 有一个很好的垃圾回收系统来自动清理不再使用的对象,但在某些情况下,我们还需要自己动手来释放一些特殊的资源,比如打开 ...

  4. go: 在proto中使用oneof类型

    在proto中,可以使用OneOf类型,使用一个字段存储不同类型的数据.类似go中的interface. 假设有proto如下,Val是一个OneOf数据类型,它可以为double/int/str.. ...

  5. 下一代云电脑技术来临,为什么PC Farm才是未来,以ToDesk为例

    近年来飞速发展的云电脑技术,正在挤压传统电脑的生存空间.由于用户对电脑计算能力的要求日益增高,而传统电脑往往会受限于硬件性能无法更新,更换花费较高等因素,难以满足用户对高性能电脑的期待. 与此同时,下 ...

  6. 宝塔linux 搭建

    前言 2020年的时候,用宝塔搭了个WordPress,一个人的博客不算是博客,没有社区氛围.就转到博客园了. 21年跟着教程,写了一个PHP的个人博客项目. 又有一台阿里云的服务器,就把代码部署上去 ...

  7. Java面试题中高级进阶(JVM篇Java内存)

    前言 本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!说说Java内存结构?说说对象分配规则?描述一下JVM加载class文件的原理机制?似乎有点模糊了,那就大概看一下面试题吧.好记性不如烂键 ...

  8. "安装VMware Tools"显示灰色的解决办法

    用VMware Workstation Pro好几年了,期间这个问题也遇到过好几次,这次把解决方案记录一下,若后续有其他情况其他解决方案将在此博文更新. Step1:关闭虚拟机: Step2:在虚拟机 ...

  9. php技术交流群

    php技术交流群-656679284,为PHP广大爱好者提供技术交流,有问必答,相互学习相互进步!也欢迎大牛入群指导!

  10. 遗传算法+强化学习—TPG—Emergent Tangled Graph Representations for Atari Game Playing Agents

    最近在看进化算法在强化学习(RL)领域的一些应用,有些论文中将使用进化算法解决强化学习问题的算法归为非强化学习算法,然而又有些论文把使用进化算法解决强化学习问题的算法归为强化学习算法,不过更多的论文是 ...