当开源工具不支持私有协议时,你会如何评估自研 vs 二次改造的成本

解读

面试官想验证三件事:

  1. 对“私有协议”技术复杂度的拆解能力——能否把协议栈、编解码、加密、状态机、长连接保活等隐性工作量算清楚;
  2. 成本模型是否贴合国内研发环境——是否把人力、时间、合规、后期维护、知识沉淀、人员流失风险全部量化;
  3. 决策逻辑是否可落地——有没有一套可复用的打分或 ROI 公式,能在 1~2 周内给出结论,而不是“拍脑袋”。

知识点

  1. 私有协议四要素:语法(消息格式)、语义(字段含义)、时序(状态机)、传输(TCP/UDP/QUIC/自定义);
  2. 开源工具扩展点:JMeter 的 JavaSampler、Groovy 脚本、TCP Sampler + BeanShell 预处理;Locust 的 gevent + 自定义 socket;k6 的 Go extension;
  3. 国内研发成本基线:中级开发 2.5~3.5 万/人月,测试开发 2~3 万/人月,五险一金 + 管理公摊 1.35 系数;
  4. 隐性成本:安全合规(国密、等保)、后续版本升级 merge 冲突、核心员工离职造成 bus factor、性能调优所需硬件(万兆网卡、TLS 加速卡);
  5. 决策模型:加权评分法(技术难度 30%、工期 20%、预算 20%、可维护性 15%、风险 15%),ROI=(节省的商用工具费 + 提前上市收益)/ 总投入;
  6. 快速验证手段:用 Python + Scapy/struct 在 3 天内打出 1000 QPS 原型,验证编解码正确性与内存占用,作为“可行性 spike”。

答案

我采用“四步法”在 10 个工作日内给出量化结论,过程如下:

  1. 协议逆向与工作量拆解
    a. 用 Wireshark 抓包 + 公司现有 SDK 日志,输出《私有协议规格说明书》v0.1,包含消息头、加密算法、心跳机制、断线重连状态机;
    b. 把工作量拆成“编解码库、长连接池、异步回调、断言与监控、报表插件”五大任务,每个任务再拆到 1~3 人日粒度;
    c. 评估技术难度系数:若涉及国密 SM4/SM2、双向证书、二进制位域、零拷贝,难度系数上调 1.4 倍。

  2. 开源工具改造点评估
    以 JMeter 为例:

    • 新增 sampler 需实现 AbstractJavaSamplerClient,重写 runTest(),约 300 行;
    • 若协议头部有 4 字节变长字段,需用 ByteBuf 手动拆包,存在半包粘包风险,要引入 Netty 解码器,额外 2 人日;
    • 结果写入 .jtl 需继承 SampleResult,保证累加器线程安全;
    • 升级风险:JMeter 6.x 改为 SPI 加载机制,原有 jar 需重新打包,升级成本 0.5 人月。
  3. 成本模型
    自研:

    • 开发 2 人 * 1.5 月 = 3 人月,成本 3 * 3 万 * 1.35 = 12.2 万;
    • 后期维护每年 0.5 人月,折现 3 年,合计 4.1 万;
    • 若国密算法需过商密认证,外部测评费 8 万;
      总成本 ≈ 24.3 万。

    二次改造:

    • 开发 1 人 * 0.8 月 = 0.8 人月,成本 0.8 * 3 万 * 1.35 = 3.2 万;
    • 升级兼容每年 0.2 人月,3 年 2.4 万;
    • 开源协议 GPL 风险,需法律评审 0.3 万;
      总成本 ≈ 5.9 万。
  4. 决策与落地
    用加权评分卡:

    • 技术难度 30%:自研 80 分,改造 60 分;
    • 工期 20%:自研 50 分,改造 90 分;
    • 预算 20%:自研 40 分,改造 90 分;
    • 可维护性 15%:自研 70 分,改造 50 分;
    • 风险 15%:自研 30 分(国密、人员),改造 70 分(开源协议可控);
      综合得分:自研 59,改造 74。
      结论:优先二次改造;若半年后协议升级到 QUIC+国密,再评估是否切自研。

    交付物:

    • 《协议逆向说明书》
    • 《工作量与成本 Excel》
    • 《加权评分卡》
    • 3 天快速原型(Python 脚本打 1000 QPS,误差<2%)

拓展思考

  1. 如果公司后续要把压测平台 SaaS 化,二次改造部分需以“插件”形式隔离,避免 GPL 传染,可考虑把私有协议编解码编译为独立 so 文件,通过 JNI 调用;
  2. 当协议栈跑在 ARM 国产芯片 + 麒麟 OS 时,要评估 JDK 是否有 ARM 优化版本,Netty 是否开启 aarch64 的 CRC32 硬件加速,否则吞吐量可能下降 18%,导致成本模型重新失衡;
  3. 若私有协议包含“流式加密 + 双向证书 + 动态令牌”,改造难度指数级上升,可引入“流量回放网关”方案:在客户端同机部署 sidecar,把明文流量 mirror 到 Kafka,再用 JMeter 消费 Kafka 进行回放,既避开加密细节,又能保持 95% 真实负载特征,此时二次改造成本可再降 40%。