排查问题实践

背景:从 索引文件 读取信息然后写入到 grpc proto 序列化的 C++ 结构中,然后构建dnf 定向过滤需要 每个unit_id 对应的定向信息,构建 unit_id 对应 roaring::Roaring 位图,后续用作定向匹配

遇到问题:

发现从索引读取出来以后,写入定向信息的时候发现读不到数据信息

排查和定位思路:

  1. 查看是否字段对应上,发现rpc 接口字段添加的地方不符合预期,加上 rpc 字段信息

  2. 字段信息加上还是不行,这个时候 梳理链路 思考它的原理以及范围

  3. 最后定位到是因为索引中的字段信息是下划线格式的如 mz_gender,但是读取文件信息解析对象的时候, 有一个option

    struct Json2PbOptions {
    Json2PbOptions() : toCamel(true) {
    }

    bool toCamel;
    };

默认 toCamel 是true,继续看,发现 会这样处理, 也就是 在配置为true 的时候会用驼峰去转换,后续用驼峰去获取对应的值,但是索引文件我写成了 mz_gender,预期是mzGender 导致一直解析不成功

复制代码
 if (options.toCamel) {
            name_in_json.push_back(std::toupper(orig_name[name_i]));
}

看到了 Json2PbOptions 联想到 Golang 的 Functional Options 以函数式编程的方式 去配置配置文件,很方便扩展和维护,当时想到我们学习知识是要学会举一反三,灵活应用,而不是死搬硬套

既然排查到dnf 定向那就总结下广告中 定向过滤的玩法:

参考文章:
Go 编程模式:Functional Options