The Challenges and Problems I Encountered
Order Settlement System
- 如何分析、定位和解决duplicate billing item带来的问题
- 问题:在系统里发现了大量重复的bililng item id,有可能会导致打款资损问题。
- 如何做出来一个safefile文件生成的系统
- 问题:过去的生成范式经常失败,下游多次反馈有打款issue,导致业务、产品和技术经常加班。
- 如何短时间内解决payout生成时间过长的问题
- 问题:系统通过cronjob每周一需要生成千万级订单的结算payout实体,而运营需要STS系统在12个小时内完成所有的生成。
- 如何解决upload file处理时间过长的问题
- 问题:在从TIDB迁移到MySQL后,运营发现系统上传离线billing item文件(百万级),kafka消息的处理速度远不如前,以前只需要几个小时,现在需要几天。
- 更糟糕的是,在系统设计中,这个kafka topic被多个任务共享,导致运营在文件处理期间无法做任何批处理操作(如生成report、更新user rule等)
- 而如果中间kafka消费者遇到失误,需要从头开始,运营等待几天却没有任何结果。
- 问题:在从TIDB迁移到MySQL后,运营发现系统上传离线billing item文件(百万级),kafka消息的处理速度远不如前,以前只需要几个小时,现在需要几天。
Duplicate Billing Item ID Problem caused by ID Generator
- Situation
- Problem statement
- 我负责的系统是订单的结算系统,负责汇总所有region,每个卖家所有订单的结算金额,最后触发打款流程,公司把钱从银行划给卖家。
- 某天,我收到运营的issue report,说在系统里发现了大量重复的bililng item id,有可能会导致打款资损问题
- role
- 我作为这个项目的PIC,在收到Ops的报告后,
- 需要确保这个issue不会造成打款问题、资损,需要给运营和老板一个交代。
- 需要排查出root-cuase,避免同样问题 再次发生。
- 我刚刚take over这个业务才一个多月,我们也正在进行从TIDB到MySQL的迁移,这加大了排查的困难性。
- 我作为这个项目的PIC,在收到Ops的报告后,
- Problem statement
- Challenge/complexity
- 主要遇到的难点如下,时间紧任务重
- 需要先了解这些重复id对系统的影响,会不会造成严重的打款问题、资损。
- 在了解了影响后,需要在短期内排查出root-cause,避免相同的issue再次出现造成payment出问题。
- 主要遇到的难点如下,时间紧任务重
- Actions
- how to resolve the problems metioned above
- 对于第一个问题
- 我先从头梳理了我们结算系统从触发结算到最后打款的全流程。
- 每个order是在什么情况下创建billing item
- 如何对每个卖家的billing item进行汇总、结算
- 系统主要有两种billing item。
- 一种是自动结算的订单,在计算每个卖家结算金额时会使用shop user id来进行汇总,由于我们数据对于shop_user_id和billing_item_id有做unique key,所以可以确保同一个shop不会存在重复的billing item id。所以可以确保这个情况不会发生问题。
- 一种是运营上传billing item id进行手动结算的订单,而运营一般倾向于只上传billing item id,如果只上传id,有可能导致系统操作错订单。
- 而就在最近,我们支持了上传user id,所以我要求ops对于这一批biling item,操作时都需要同时上传shop user id避免系统误打款。
- 同时我也紧急重新生成了这批billing item的id并更新到数据库中,避免运营操作失误没有上传shop user id。
- 通过与支付运营同事讨论了解他们何时触发打款操作,打款周期如何
- 明白自动结算的订单是每周一次,所以不是问题。
- 而手动 结算的订单是一个月导出执行一次,所以只要在下一个月前修复即可。
- 我先从头梳理了我们结算系统从触发结算到最后打款的全流程。
- 对于第二个问题
- 我分析当前系统ID生成的范式,排查root-cause
- 我们系统的ID generator使用的是snowflake算法,有一位system id是instance index,如果只部署在一个data center是没有问题的。去年公司开始推动系统容灾方案,某天把我们系统在第二个data center也scale了几个服务,而新data center的instance index也是从零开始的,导致同一秒请求生成billing item时,有同样instance index的instance会生成一样的billing item id。
- 在得知root-cause后,当即停掉了新data center的instances。
- 需要了解是否与正在进行的DB migration有关
- 梳理现在DB migration的进度,已经从TIDB单写单读,变成了(TIDB、MYSQL)双写和MYSQL单读。所以推测重复id生成与DB migration无关。在数据中心对比两个DB近一个月数据,确保数据一致。同时修改两个DB避免数据出现遗漏。
- 我分析当前系统ID生成的范式,排查root-cause
- 对于第一个问题
- how to resolve the problems metioned above
- Result
- metrics
- 花了一天和运营、产品经理对业务进行了梳理,确保了系统没有任何资损。
- 修复了在五个region的数十万条重复billing item id。
- 确保正在进行的DB mirgation不受影响。
- metrics
- future (long-term plan)
- 为了避免同样的问题再次出现,与容灾项目PIC沟通让他们把我们系统的容灾feature toggle先关掉,等我们系统改造后再解决了。
- 我们后来部署了独立的id generator服务,使得我们的服务可以同时在多个data center部署而不会重复的id,解决了问题。
AI Code Review
在今年一月份想到这个idea,自下而上发起这个项目,就像在公司内的小型创业。
从开始到现在的这半年时间里,最大的问题就是让这个项目活下来。
metrics
截止25年7月15日
- Online code review
- 30+ teams
- 1387 developers
- 1263 repos
- 10k+ review comments
- MCP Code Review
- Number of Reviews: 181
- 80 developers
- 97 repos
主要features
- Online Code Review
- MCP Code Review
- Can be used in Cursor/Winsurf/Copilot/Claude/Gemini
- AI Review Center
- review task display/search
- review stats
- review configs
- IM integration
- Config Review
- Code review with TD requirement
- Evaluation Pipeline
遇到的挑战和问题
-
资源不足
- 人力紧缺
- 从一开始我自己一个人做,到了中期有其他6、7个同事parttime参与,再到回归到我自己一个人做。
- 时间紧张
- 老板需要看到效果,我们需要快速迭代需求、搭建平台、数据飞轮。
- llm资源紧缺
- 老板认为这个项目没有看到好的metric,没有澄清切实value(尽管我们已经可以看到线上有上千个好的review comment case)。所以只批准了每个月100刀的API budget。
- 为了解决这个问题,我们pivot到了mcp code review,因为公司给大家都买了cursor,所以每个reviewer都可以使用自己cursor的budget来
- 老板认为这个项目没有看到好的metric,没有澄清切实value(尽管我们已经可以看到线上有上千个好的review comment case)。所以只批准了每个月100刀的API budget。
- 人力紧缺
-
公司内竞争
- 很多team都在做同样的事情,需要尽可能的做出原型
- 要快速迭代功能,确保基本功能有效
- 易用性,容易集成
- 需要做好marketing
- 写好User Guide,要让大家看得到。
- 让这个服务成为公司内的事实标准。
- 很多team都在做同样的事情,需要尽可能的做出原型
-
说服老板采纳
- 要采集指标,要有好看的metrics,CTO才会同意在全公司推行。
- 要优化指标
- 允许用户自定义prompt
- 参考字节25年2月最新论文的实现,实现了checker和filter,BitsAI-CR: Automated Code Review via LLM in Practice
- 搭建了平台供用户
- 查询code review结果
- 自定义prompt
- 查看数据指标
-
技术问题
- should we build it from scratch?
- 年初,在查阅了网上已有的开源项目后,我决定自己从头开始做,主要考虑到
- 内部gitlab版本legacy
- 从零开始,易于掌控,不需要受制于开源项目的框架。当时开源项目做的比较好的只有 PR Agent,是python codebase,项目已经很大,需要花很多时间去熟悉,去做调整。
- 年初,在查阅了网上已有的开源项目后,我决定自己从头开始做,主要考虑到
- llm api
- local deployment
- API Provider
- prompt/context enginering
- biz domain knowlegde
- code context
- code diff的构造有多种方案
- 只传原始code diff
- pros:易于实现,token少
- cons:无上下文,review结果很差
- 带上full existing file content
- pros:易于实现,整个文件的内容包括了一个一个code diff绝大多数上下文,review相对好。
- cons:token消耗大,没有包含跨文件的context
- 只带上相关的代码上下文
- pros:token消耗相对于full existing file content少,review结果也相对好。
- cons:实现有难度,可以继承Tree-sitter
- codebase index
-
pros:能够得到有所有的context,review结果最好。
-
cons:需要考虑对每个repo构建codebase index,有code data security和计算资源问题。
-
实现:我们通过mcp code review,可以利用到cursor等Coding Assistant自带的codebase indexing。
-
- 只传原始code diff
- code diff的构造有多种方案
- should we build it from scratch?