服务器上部署了一个 Java 后端程序,作为数据的接入节点,有数个客户端通过 Socket 的方式连接到这个节点上,每个客户端会实时将数据传输到节点上,节点收到数据后做基本的结构化后将数据写入 Redis 队列,有定时任务会去读取 Redis 队列的数据,将数据批量写入到 MongoDB 。
各个客户端上是安装的 5G 流量卡。
业务场景是通过点阵笔设备提取学生的实时书写笔迹,每个客户端平均会连接 40 支笔,每支笔在完整书写一页的情况下传输的数据量在 27000 条左右,根据不同的试卷和学生进行分表。
当前数据服务器节点:12 核(vCPU) 24 GiB ,公网带宽 5M 。
数据库:Mongodb V8.0.6 ,部署在另外的服务器上,各节点相互之间通过内网连接。
偶尔发生,从日志观察有明显延迟情况,传输的数据中有记录数据的产生时间,这边收到数据做结构化的时候也会设置一个写入时间,两者相差有时候能达到 1 小时以上。
在客户端断开的情况下,数据节点还是会不停的输出收到数据。
从 Redis 的队列观察来看,数据的写入并不慢,数据基本上刚进入 Redis 就会被读取并写入库,不存在数据的积压情况。
从服务器 top 命令来看,这个数据采集的 Java 服务的 CPU 占用经常在 50-60 之间,还有另外一个做成绩识别的服务会占用到 40-140 之间。
load average: 1.33, 1.39, 1.56
Tasks: 213 total, 1 running, 212 sleeping, 0 stopped, 0 zombie
%Cpu(s): 7.6 us, 0.9 sy, 0.0 ni, 90.9 id, 0.0 wa, 0.0 hi, 0.6 si, 0.0 st
MiB Mem : 22870.4 total, 3022.4 free, 8054.5 used, 11793.5 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 14421.1 avail Mem
核心诉求是课堂中的笔迹数据能够实时提取,
请各位大佬帮小弟分析下问题在哪里,个人业务开发做的比较多,这方面的知识相对浅薄。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.