最近遇到一个需求,对接某公有云上的坐席系统,需要接收人工坐席和客户对话的语音流,然后调用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. 两小时学会使用dubbo(直接API、spring、注解、springboot)

    最近上新的项目中需要用到dubbo,于是我决定温故知新,决定分享一下Dubbo在各种环境下的使用方式,本篇文章让你两小时就能学会使用dubbo 什么是Dubbo Dubbo是一个分布式.高性能.透明化 ...

  2. KubeSphere 在直播应用中的实践

    本文是上海站 Meetup 讲师唐明根据其分享内容整理的文章. 引言 目前媒体的主流传播渠道已从传统的报纸.广播.电视转向了互联网,各种视频及社交 App 成为了人们获取资讯的首选途径.苏州市广播电视 ...

  3. 开源之夏 2022 重磅来袭!欢迎报名 KubeSphere 社区项目!

    活动简介 "开源之夏(英文简称 OSPP)"是中科院软件所"开源软件供应链点亮计划"指导下的系列暑期活动,由软件所与 openEuler 社区共同主办. 开源之 ...

  4. Mysql导出文本文件

    使用mysqldump命令导出文本文件 mysqldump -u root -pPassword -T 目标目录 dbname [tables] [option]; 其中: Password 参数表示 ...

  5. Mysql篇-三大日志

    概述 undo log(回滚日志):是 Innodb 存储引擎层生成的日志,实现了事务中的原子性,主要用于事务回滚和 MVCC. redo log(重做日志):是 Innodb 存储引擎层生成的日志, ...

  6. 低功耗4G模组Air780E快速入门:使用文件系统存储温湿度数据

    ​ 伙伴们,今天我们来学习合宙低功耗4G模组Air780E快速入门之使用文件系统存储温湿度数据. 一.编写脚本 1.1 准备资料 780E开发板购买链接 780E开发板设计资料 LuatOS-Air7 ...

  7. 2023NOIP A层联测32 T4 红楼 ~ Eastern Dream

    2023NOIP A层联测32 T4 红楼 ~ Eastern Dream 根号分治加分块. Ps:分块后面真的用的多. 思路 考虑根号分治,将 \(x\) 分为 \(x \leq \sqrt n\) ...

  8. 如何制作一个HTML页面的锁屏功能

    如果后台一些界面比较敏感,希望主动或者被动的在人员不想暴露信息的情况下加一把锁,就是说避免信息一直在页面上暴露,可以使用"阅后即焚"这种思路,这种思路比较简单,显示了就过几秒删除, ...

  9. JAVA 注解示例 详解

    注解(Annotation) 为我们在代码中天界信息提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据(通过 解析注解 来使用这些数据). 注解的语法比较简单,除了@符号的使用以外, ...

  10. Nuxt.js 应用中的 webpack:done 事件钩子

    title: Nuxt.js 应用中的 webpack:done 事件钩子 date: 2024/11/26 updated: 2024/11/26 author: cmdragon excerpt: ...