ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

售货柜识别实战:从RTSP拉流抽帧到YOLO部署的完整指南

售货柜识别实战:从RTSP拉流抽帧到YOLO部署的完整指南 前阵子帮朋友调一套售货柜识别系统遇到一个蛮典型的问题柜门都关上了订单却迟迟不出。排查了一圈问题不在YOLO模型精度也不在服务器性能而是卡在最不起眼的RTSP拉流和抽帧逻辑上。从IPC拉流到抽帧再到YOLO识别这条流水线说起来就是“摄像头推流、程序取帧、模型识别”三步可真要在项目里稳定跑起来每一步都有很多文档里不会写的细节。这篇文章就把这条完整流水线拆开讲清楚。我按实际项目里的处理顺序来先解释售货柜场景为什么要走IPC拉流这条路再分别讲RTSP拉流、抽帧策略、YOLO落地细节、整链路性能优化和排错经验。适合正在做售货柜、智能货柜、边缘AI识别这类项目的人参考不管你是刚入门、在搭原型还是已经入了生产环境的坑都应该有能直接抄作业的部分。1. 售货柜识别为什么要走IPC拉流这条路1.1 售货柜要识别的不是“有人经过”而是“拿了什么”售货柜视觉识别和常见的安防监控识别目标差异非常大。安防场景里识别的是人、车、烟火这类大目标往往一个目标占画面很大一块。而售货柜里摄像头装在柜内隔板顶部俯拍层板上的商品目标是饮料罐、零食袋、盒饭这类小商品一罐可乐可能只占画面的一小块区域还经常被其他商品挡掉一半。业务上售货柜要回答的问题不是“画面里有没有人”而是“顾客从这层柜子里拿走了哪件商品”或者“放回了哪件商品”。识别结果直接对接订单结算错了就要赔钱或者引起客诉。所以模型必须精确到SKU级别百事可乐和可口可乐不能混相同外包装但不同规格的商品也得区分开。实际项目里售货柜通常有几个层板每层一路或两路摄像头。摄像头离商品很近广角又大画面边缘变形严重再加上柜内灯光不均匀、玻璃门反光、顾客手部遮挡这些因素叠加起来对识别链路的要求跟普通监控完全不是一个级别。这也是为什么很多人从安防检测切到售货柜后会翻车拿一套COCO预训练权重跑人车检测没问题但让它识别一罐具体的饮料SKU基本不可用。后者需要自己采数据、标数据、训练然后嵌入一条完整的数据管道。1.2 为什么放着SDK不用非要折腾RTSP做项目第一步通常会问摄像头供货商不给SDK吗直接调用SDK开发不是更省事答案是SDK确实能用但售货柜这种项目往往不能依赖SDK原因有几个第一摄像头品牌太杂。海康、大华、宇视、雄迈还有各种小厂方案各家的SDK接口完全不同切换硬件就等于重写一遍接入层。售货柜硬件供应商今天给你装A品牌摄像头明天可能换成B品牌算法侧不可能跟着一起改。第二很多售货柜的部件供应商只提供RTSP地址连SDK都不给或者给了也要特定授权集成周期变得不可控。第三RTSP是一个事实上的标准协议不管是Linux还是WindowsARM还是x86都能用FFmpeg这类成熟库拉流。把采集层做成标准RTSP后算法和相机硬件完全解耦后期换摄像头、加一路模拟推流都很方便。开发阶段我甚至会直接用IPC模拟器比如hiksimulator或者FFmpeg推本地视频来模拟摄像头流后端逻辑可以先跑起来不用等真实柜子到位。这一步对项目并行推进帮助很大。1.3 整条流水线的逻辑框架整条链路用文字串起来就是IPC摄像头RTSP流→ 拉流解码 → 抽帧 → 预处理letterbox/归一化→ YOLO推理 → 后处理置信度过滤/NMS→ 目标清单 → 前后帧比对/业务逻辑 → 订单结算从工程架构角度看可以分成三层数据供给层负责RTSP拉流、解码、抽帧。这一层要保证稳定、低延迟、不断流。感知层YOLO模型推理输出每个商品检测框、类别、置信度。决策层把两帧或多个摄像头的检测结果做关联判断“拿走”或“放回”再生成订单。每一层之间一定要用队列解耦。数据供给层不能因为推理慢就阻塞拉流否则摄像头端的网络缓冲会堆积延迟越拉越大。这是我反复强调的一个点后面专门有一节讲这个坑。2. RTSP拉流的协议细节与选型决策2.1 RTSP、RTP、SDP各管什么事很多新手直接拿OpenCV的VideoCapture拉流跑通了也不知道底层发生了什么。到排查问题时如果不懂协议只能瞎试。RTSPReal Time Streaming Protocol本身并不传输视频数据它是个控制协议负责建立会话、协商参数、控制播放/暂停/停止。真正装视频数据的是RTPReal-time Transport Protocol承载H.264/H.265编码后的码流。RTP可以走UDP也可以封装进TCP。SDPSession Description Protocol则是描述会话信息的“菜单”包含编码格式、分辨率、帧率等参数客户端先拿到SDP才知道怎么解码。实际拉流时有一个很关键的选型TCP还是UDP。UDP延迟低但在弱网或者Wi-Fi下容易丢包视频画面会出现花屏、马赛克。TCP延迟稍高但可靠性好不会因为偶尔丢包导致一帧花掉。售货柜的摄像头通常走柜内Wi-Fi或者网线网络质量参差不齐。我在项目里大部分时间用TCP尤其在Wi-Fi环境下TCP的稳定性收益远大于那几毫秒的延迟损失。如果是有线局域网、摄像头码率又低可以用UDP换更低的延迟。调试时可以先用ffprobe看一眼流的实际信息ffprobe -rtsp_transport tcp -show_streams rtsp://192.168.1.64:554/Streaming/Channels/101重点关注编码格式是H.264还是H.265分辨率多少实际帧率多少。有些老IPC只支持H.264有些默认推H.265而你的NPU或者硬解模块可能不支持H.265需要在拉流侧协商或者转码。2.2 FFmpeg、OpenCV、GStreamer怎么选拉流工具选型我见过不少争吵。列个表直接给结论方案开发速度资源占用可控性适合场景FFmpeg libavcodec库调用中等低高生产环境、嵌入式FFmpeg命令行极快高低快速验证、一次性的测试OpenCV VideoCapture极快低低原型验证、DemoGStreamer管道中等中等中等已有GStreamer基础做复杂媒体管道原型阶段用OpenCV的VideoCapture最省事几行代码就能拉到帧。但生产环境我强烈建议走FFmpeg的libavformat/libavcodec库调用原因有两个第一命令行方式本质上是一个独立进程售货柜往往有4到8路摄像头每路fork一个ffmpeg进程内存和CPU翻倍进程之间相互独立不好统一管理崩了也不容易自动恢复。第二OpenCV的VideoCapture封装太“黑盒”缓存策略、丢帧逻辑、硬解开关都不好精细控制。出了问题可能只能看到“读不到帧”或者“画面越来越卡”完全不知道中间哪一步出问题。GStreamer也是好方案特别是你已经在用DeepStream做硬件解码和推理时整条管道本身就是GStreamer插件式架构可以和YOLO的nvinfer/nvdsinfer衔接。但GStreamer的学习曲线更陡如果项目里没有其他人会用维护成本会一直压在一个人身上。2.3 多路拉流的并发模型与断线重连售货柜通常不止一路摄像头4到8路很常见。并发拉流不能简单地为每一路开一个while循环需要合理设计。我的标准做法是一个摄像头对应一个独立线程线程内部做拉流和解码解码出完整帧后放进一个带最大长度的队列。推理侧有一个或多个工作线程从队列里取帧做预处理、YOLO推理、后处理。线程间用有界队列解耦好处是一路摄像头断流或者网络抖动最多让它的播放队列空掉不会拖垮其他摄像头的识别线程。如果队列有界当推理速度跟不上时拉流线程不能无限堆积帧否则内存会涨延迟也会越来越大。断线重连是另一个必须做的点。IPC在弱网下经常出现RTSP会话中断如果代码里不处理程序跑几个小时就变成瞎子了。我的重连逻辑比较简单每次拉流读取失败或超时失败计数加1。连续失败超过3次主动关闭当前RTSP句柄释放所有AVFormatContext资源。sleep 2到5秒避免死循环重连打爆网络重新建立连接。重连时有一个容易忽略的细节旧连接不释放干净会导致内存泄漏。FFmpeg里AVPacket没有unref、AVFormatContext没有avformat_close_input多路多次重连之后内存会缓慢增长最终把嵌入式设备拖死。这条后面会再强调一次。2.4 拉流环节最容易踩的实时性坑这里重点说一个我用OpenCV时被坑惨了的点VideoCapture内部是有缓存队列的。当推理速度跟不上拉流速度时每帧读到的其实是“很久之前”的帧画面看起来一直能出图但延迟已经涨到了几百毫秒甚至几秒。而且这个延迟是隐性的Log里基本看不出来只有拿实际柜门动作对比画面时才意识到晚了。解决方法是设置缓冲区长度或者在读取后主动清空缓存cap cv2.VideoCapture(rtsp_url, cv2.CAP_FFMPEG) cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)但这并不能完全解决问题最好还是在拉流侧设置FFmpeg低延迟参数。ffmpeg -rtsp_transport tcp -fflags nobuffer -flags low_delay \ -analyzeduration 0 -probesize 32 \ -i rtsp://192.168.1.64:554/Streaming/Channels/101 \ -f rawvideo -pix_fmt bgr24 -关键参数就三个-fflags nobuffer关闭缓冲区-flags low_delay开启低延迟模式-analyzeduration 0 -probesize 32减少初始化时分析流信息的数据量。这些能有效降低RTSP的启动延迟和实时性损失。如果是直接用libavformat做二次开发对应的做法是设置AVFormatContext的probesize和max_delay然后从AVPacket队列里主动读取不要依赖内部缓冲。3. 抽帧策略怎么定频率怎么不丢关键动作3.1 固定间隔抽帧和事件触发抽帧怎么配合摄像头推流是30fps但YOLO推理不可能每帧都做尤其边缘设备上每帧推理的算力开销太大。所以必须抽帧。最基础的做法是固定间隔抽帧比如每15帧取1帧也就是每秒2帧。这个逻辑简单但有个问题顾客开门拿货到关门可能只有两三秒固定间隔抽帧很容易漏掉某个快速拿取动作的中间状态。更好的做法是“事件触发 固定间隔兜底”双模式柜门开关由硬件检测通过串口或者IO给到算法板。门被打开瞬间触发一次立即抽帧并送入识别。门开期间按0.5秒间隔低频抽帧保持对货架状态的持续感知。门关上瞬间再触发一次立即抽帧做最终状态判断。固定间隔兜底的作用是应对那些“门开着但顾客半天不拿”的异常场景。纯事件触发也有风险万一硬件触发信号丢了整个识别都会失效所以低频兜底不能省。有人问抽帧间隔应该设多少。这个要结合顾客动作速度来看。人从货架上拿起一件商品整个动作大概0.3到0.5秒0.5秒抽一帧能捕捉到动作的中间状态。如果手速特别快或者需要识别“拿起又放回”的细节可以缩短到0.3秒但推理负载也会跟着上涨需要自己权衡。3.2 从30fps原始流里稳定拿到可识别的帧这里有个工程上的认知误区抽帧是“从已经解码好的帧里挑选”而不是“程序里sleep后再去读流”。如果程序里写一个sleep(0.5)然后才去读一帧理论上也能跑但中间0.5秒的帧会被相机端的缓冲堆积住等你读下一帧时拿到的是0.5秒前那批帧里最旧的一帧实时性完全不可控。正确做法是拉流解码线程每帧都解但是只保留最近一帧或最近几帧带PTS时间戳放到缓存里。业务逻辑需要抽帧时直接从缓存里取最新的完整帧。为什么一定要带PTSPresentation Time Stamp因为多路摄像头各自有自己的时间基准你不能拿“系统到达时间”当帧的真实时间。两路摄像机对比同一个柜门事件时如果各路用各自的时间前后帧比对会错位。PTS才是相机编码时打在帧上的时间标记虽然它和墙钟时间不一定对应但它的相对顺序是可靠的后端拿事件触发时刻去匹配帧时必须基于PTS。另外柜门打开瞬间触发的抽帧拿到的应该是“触发时刻最近的一帧”而不是“触发之后才解出来的帧”所以必须提前维护好这个紧耦合的帧缓存。3.3 抽帧与解码的工程实现用FFmpeg实现时核心循环是这样一段逻辑伪代码while (av_read_frame(fmt_ctx, packet) 0) { if (packet.stream_index video_stream_index) { avcodec_send_packet(codec_ctx, packet); while (avcodec_receive_frame(codec_ctx, frame) 0) { int64_t pts frame-pts; if (pts - last_pts interval_pts) { cv::Mat bgr convert_frame_to_mat(frame); queue.push({pts, bgr}); last_pts pts; } } } av_packet_unref(packet); // 这句不能省 }interval_pts根据相机的timescale换算比如目标0.5秒一帧相机time_base如果是1/90000那么interval_pts就是45000。这里有一个解码侧细节H.264流里I帧和P帧的pts不是均匀的如果直接用“当前帧PTS - 上次送检PTS”来计算间隔要小心PTS翻转和B帧重排序的问题。稳妥的做法是先把帧解码出来缓存最近一帧再去做时间判断。不要在packet层跳帧那样会漏掉需要参考的参考帧。如果相机推的是H.265边缘设备上软解1080p是相当大的CPU开销建议用硬解模块或者NPU自带的解码器。这一步优化好CPU占用能从70%降到15%以内。4. YOLO识别在售货柜场景的落地细节4.1 模型选型YOLOv5s、YOLOv8n还是YOLO11n抽出来的帧最终要送进YOLO识别。YOLO版本很多选型不是越新越好要结合部署平台的算力和业务复杂度。现在跑售货柜商品检测常见选择是YOLOv5s、YOLOv8n、YOLOv8s、YOLO11n这几个。我做了些粗略对比模型参数量1080p CPU推理延迟NPU/GPU推理延迟精度特点YOLOv5s7.2M150-300ms20-40ms通用性好部署资料最多YOLOv8n3.2M100-200ms15-30ms轻量适合边缘精度略低YOLOv8s11.2M250-500ms30-60ms精度更高算力要求高YOLO11n2.9M90-180ms15-25ms新架构边缘设备兼顾精度和速度如果运行在RK3588这类带NPU的板子上我一般默认选择YOLOv8n或YOLO11n转成RKNN int8后单路推理大概20到30毫秒四路也能撑住。如果是纯CPU环境考虑YOLOv8n和降低输入分辨率。但无论选哪个版本都强烈建议用你自己的售货柜数据训练不要直接拿COCO权重硬上。COCO预训练权重能检测“瓶子”这个大类但它分不清可口可乐和百事可乐也分不清不同口味的乐事薯片。对售货柜业务来说不能区分SKU的检测结果毫无价值。训练数据标注这里多说一句使用labelImg或者x-anylabeling标注导出YOLO txt格式。每个SKU不同角度、不同光线、不同遮挡程度都要覆盖到。最好在真实柜子里采数据而不是办公桌上摆拍因为柜内灯光、层板反射、玻璃反光这些特征摆拍是模拟不出来的。4.2 预处理、推理、后处理每个环节怎么抠细节YOLO前处理和后处理的细节对最终效果影响极大但却是最容易出问题的地方。前处理的letterbox几乎每个项目都要重写一遍。为什么要用letterbox而不是直接resize因为直接拉伸会把商品拉变形影响检测框的准确性。letterbox的做法是保持长宽比缩放到目标尺寸比如640×640多出来的边用灰色填充。缩放比例和填充大小要记录后处理还原检测框坐标时要用。归一化也不难但要时刻注意模型训练时的顺序。PyTorch训练和ONNX导出的通道顺序可能是RGB而opencv读到的是BGR忘记转换会导致识别率和颜色相关判断直接崩掉。后处理流程就是YOLO官方后处理三步解码预测网格、置信度过滤、NMS去重。这里有两个针对售货柜场景的调参经验置信度阈值建议设低一点0.2到0.3之间。商品检测属于小目标遮挡又多置信度普遍偏低。高于0.45的话会有大量漏检。NMS的IoU阈值可以适当放宽到0.5到0.6。商品堆叠时两个相同商品挨得很近NMS太激进会把相邻商品框并掉太宽松又会出现同一个商品多个框。需要根据实际画面反复调。另外售货柜画面往往有固定的层板区域、玻璃反光区域。可以在后处理之后加一个ROI过滤把明显不在商品区域的检测框直接扔掉能显著降低误检。后处理另一个大坑是模型输出格式不统一。YOLOv5的ONNX输出可能是1×25200×85三个尺度拼在一起YOLOv8是三个输出层分开输出。代码里如果没对齐维度直接索引就会越界或者结果错乱。我在项目里直接用官方utils里的非极大值抑制函数不要自己从零写除非你很清楚每一位的布局。4.3 识别结果到业务动作拿放判定怎么做YOLO输出一堆检测框但售货柜业务需要的不是“画面上有什么”而是“这一个柜门事件里顾客拿走了什么、放回了什么”。最简单的拿放判定算法是这样的柜门打开瞬间对画面做一次识别得到商品状态A商品清单位置。柜门关闭瞬间对画面再做一次识别得到商品状态B。用IoU或中心点距离把状态A和状态B的商品做关联匹配。状态A有、状态B没有的商品 → 判定为“拿走”。状态A没有、状态B有的商品 → 判定为“放回”。但实际项目会更复杂有几个典型问题第一手部遮挡。顾客手伸进去拿商品时手会挡住旁边几个商品把识别结果搞乱。所以不能只依赖开关门两帧中间过程帧也要参与判断。第二商品位置微移。顾客翻找商品时会把旁边商品碰歪状态A和状态B里同一个商品框位置变了IoU匹配不上就会误判为“拿了A又放了B”。第三时序窗口。如果顾客拿了商品转一圈又放回去开关门两帧的状态A和B可能看起来完全一样中间过程帧却捕捉到了变化。更稳妥的做法是维护一个状态机柜门打开后持续低频抽帧识别每一帧和上一帧做差集把所有“消失”和“新增”事件按时间顺序记录下来。柜门关闭后综合整个开门期间的记录再决定最终订单内容。哪怕顾客中途放回也能被过程帧识别到。5. 整条流水线的性能优化与排错实录5.1 端到端延迟测出来是哪个环节在拖后腿做售货柜最大的体验问题就是延迟顾客拿完东西关门Pad上订单迟迟不出来体验极差。所以要学会测端到端延迟并定位瓶颈。我的做法是在整条链路的关键节点打时间戳环节局域网内实测耗时参考RTSP拉流网络传输5-20ms解码H.264硬解3-10ms解码软解20-50ms预处理letterbox归一化1-3msYOLO推理NPU15-40msYOLO推理CPU100-200ms后处理NMS1-5ms前后帧比对业务逻辑1-2ms从表格能看出来真正拖后腿的就两个地方软解和CPU推理。如果CPU推理单帧要200ms哪怕你抽帧间隔是0.5秒推理线程也始终处于积压状态延迟会越来越高最终导致关门几秒后才出订单。优化方向很明确一是换硬件解码二是降低模型输入尺寸三是把推理放NPU或GPU上四是降低抽帧频率。按优先级排序先解决推理平台问题再调输入尺寸。5.2 五个我实际填过的坑下面这几个坑都是我在真实项目里踩过、而且花时间排查过的写出来帮你避开。第一个坑OpenCV缓存导致的隐性延迟。前面已经说过VideoCapture默认会有内部缓冲推理慢时读到的帧越来越旧。表面上看每帧都读到了实际上画面延迟已经接近秒级。这个问题最开始完全没暴露直到拿实时视频和实际动作对比才发现。处理方式就是把拉流和解码全部改成FFmpeg底层控制或者设置缓冲长度为1。第二个坑多线程共享同一帧数据被覆盖。一开始我图省事拉流线程直接向一个全局Mat变量写数据推理线程再读。结果就是推理线程读到的一半是上一帧、一半是这一帧画面像撕裂一样。后来改成生产者消费者队列每个元素是独立拷贝或者引用计数对象彻底解决。所有跨线程传帧一定不要在共享内存上直接改要用队列或加锁。第三个坑时间戳错位导致拿放判断错误。拿放判定需要对比不同时刻的商品状态如果拿“系统到达时间”来标记帧从RTSP缓存里取出来的帧可能比真实时间晚了1秒多前后帧比对出来的“变化”根本不是同一个柜门事件里的变化。这个问题很难靠肉眼发现因为看起来一切正常只是订单偶尔不对。最终定位时发现是帧时间标记不对统一改成了基于PTS的帧时间错位问题就消失了。第四个坑多路摄像头时间不一致。柜内不同层板的路数来自不同的相机PTS基准各不相同。跨摄像头联调时不能拿各自的PTS直接横向对比。我的做法是在算法板侧统一定义“柜门事件时间”事件到达时以这个时间作为逻辑基准各路相机各自取离这个事件时间最近的帧。这样各路之间就不需要严格时间同步。第五个坑模拟器和真机差异。开发阶段用hiksimulator这类IPC模拟器或者FFmpeg推流测试一切流畅上了真机就出花屏、断流、码率波动。模拟器的码流稳定且没有网络抖动真机在Wi-Fi弱信号下RTSP会话经常断开。这个问题的本质是开发环境太“理想”。后来我在代码里强制加了断线重连、TCP传输、低延迟参数再测试才慢慢稳定下来。5.3 硬件选型与资源分配售货柜的算法板选型非常关键。我见过有人拿树莓派4b跑yolov5s结果就是能跑但每帧推理要1秒以上完全没法用。跑实时的YOLO识别至少需要带GPU或NPU的平台。做售货柜我建议按这个思路选硬件低端入门RK3568带的NPU大约1TOPS能跑yolov8n但比较勉强适合商品种类少、路数少的小柜子。主流推荐RK3588NPU约6TOPS支持H.264/H.265硬解跑yolov8n单路推理约20到30ms四路到六路摄像头都能接受。预算充足Jetson Orin Nano或者Orin NXCUDA生态好直接TensorRT上FP16模型迭代方便调试工具也成熟。资源分配上我的建议是一个拉流解码线程绑定一个CPU核心NPU专跑推理别让解码和推理抢同一块计算资源。RK3588上如果用RKNN-Toolkit2转模型记得开启int8量化能显著提升推理速度。量化后精度会有轻微下降所以训练时最好用带量化感知训练的策略或者在量化后用真机数据回归验证一遍。如果说内存分配队列长度一定要有上限。假设抽帧频率0.5秒一帧YOLO推理每帧30ms队列长度给10到20就足够。设置太长会掩盖延迟问题等你发现时内存已经涨了一截。6. 踩过这些坑之后的选型建议6.1 如果你也想搭这套流水线我建议从这些配置起步如果你现在准备从零搭一套售货柜识别系统我给一个我认为最稳妥的起步配置避免你重复踩坑。第一硬件平台直接选RK3588内存8GB以上存储64GB以上。别为了省成本选RK3568商品识别多路视频后期扩展会很痛苦。第二摄像头选支持H.264硬编码的广角IPC分辨率1080p就够不需要2K/4K。分辨率越高解码和推理开销越大但对小商品识别精度的提升很有限。焦距和安装角度比分辨率更影响识别效果。第三拉流直接用FFmpeg库在C层面做不要用PythonOpenCV扛生产。Python用来做模型训练、数据标注和离线分析可以线上推理链路还是C或者至少是C封装的服务更稳。第四模型就用YOLOv8n或者YOLO11n起步自训练自标注。模型不要贪大先跑通链路再根据业务需求决定要不要提升到v8s或引入分类头。第五抽帧策略从0.5秒间隔开关门事件触发开始跑通后再按实际动作速度微调。第六业务判定先用“开关门两帧差集”等稳定了再升级成“过程帧状态机”。两帧方案代码简单容易定位问题。这套配置跑一遍下来你会对整条链路里每个环节的耗时、瓶颈、不稳定点都有直观感知后面再优化就知道往哪里使劲了。6.2 如果只让我保留一条核心经验踩完这么多坑如果只保留一条核心经验我会说这条流水线的真正门槛不在YOLO模型本身而在于拉流、抽帧、时间戳、队列这些“数据管道”的细节。模型精度不够你可以通过加数据、换模型、调阈值来迭代但时间戳错位、拉流缓冲堆积、内存泄漏这些问题是隐蔽的不定时爆发爆发一次就会让整个系统看起来完全不可用。所以如果你正在做类似项目先别急着上多模态、先别急着堆GPU把RTSP拉流稳定性、PTS时间对齐、断线重连、队列背压这几件事做扎实后面会少很多事。我在实际调试中还有一个体会售货柜这种边缘AI项目最花时间的往往不是写代码而是现场调试。条件允许的话尽量在真实柜子上做长时间跑测至少跑个72小时观察内存曲线、重连次数、订单准确率。很多问题只有长时间跑才能暴露出来。如果你也正在做类似的流水线希望这篇文章能帮你少走几个弯路。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进