记一次目标驱动导致的bug

本文探讨了目标驱动架构模式在项目中的应用,重点分析了由于目标下发不准确导致的线上bug,深入讨论了目标驱动架构的好处及其实现过程中的问题,并提出了改进措施。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

最近做的一个项目中,用到了目标驱动架构模式,但由于目标下发的不准确,导致出现了线上bug。

目标驱动

目标驱动是通过不同的轮询目标的状态,决策出需要达到的目标,使得状态能到达到最终的目标;

简单点的意思就是不断循环着四种状态:轮询—>决策—>发送目标—>达到目标

目标驱动有什么好处的?

  • 解耦

系统a可以专注数据的收集,系统b可以进行目标驱动,使得系统c最终可以达成目标

假如没有目标驱动,系统a即要数据的收集,数据的目标决策,数据的最终状态下发管理,通知系统c

  • 减少工作量
  1. 系统b可以一次处理多份数据,产生一个最终目标下发给系统c
  2. 数据的目标决策过程可能是非常复杂的,数据的变更依赖系统的变更等也可能导致需要下发的目标改变,这样目标驱动可以统一判断这些数据的变更和系统的依赖;如果不是目标驱动,是不是数据变更的时候需要下发目标,依赖系统变更的时候,也需要下发目标,导致链路分散
bug分析

项目中的代码逻辑demo如下:

    private Mapper dataMapper;

    public void poolStatus() throws Exception {
        // 不断循环决策数据的目标
        while(true) {
            // 从数据库读取数据
            List<Data> dataList = dataMapper.listAll();
            // 决策需要下发的目标
            List<Data> toSynDataList = dataList.stream()
                .filter(d -> validate(d))
                .collect(Collectors.toList());
            // 下发最终目标
            synDataToSys(toSynDataList);
            Thread.sleep(1000L);
        }
    }

    private boolean validate(Data data) {
        try {
            // 判断data是否有效,有可能结合第三方系统进行判断
            return true;
        } catch (Exception e) {
          	// 思考一下这里会有什么问题?
            return false;
        }
    }

    private void synDataToSys(List<Data> validataDataList) {
        // 把有效的dataList同步到其他系统
    }

从代码可以看出轮询、决策和下发目标的过程,那导致目标下发不正确的地方到底在哪里呢?

聪明的同学可以看到是在validate函数的思考那里了

原因是这样的

validata函数是对data进行决策的过程,但是validata是需要通过第三方系统等进行决策的

假如第三方系统抛出异常的时候,把异常catch住了,并且返回的是false

那就是说validata函数过滤掉了这data

便导致下发的目标没有data了

正确的处理

应该是异常catch的时候,log日志后,应该直接抛出异常

这样决策的过程便会停止,不会导致错误的目标进行下发

后续改进
  • 配置下发应该用同步模式

目标驱动应该是应对比较复杂的目标决策与下发的,但项目中的使用到的目标驱动用于配置的下发,配置是一个很关键的设置,比如系统a设置了什么,就进行修改配置

  • 决策出现异常应该停止

不能因为第三方系统的错误,而决策出错误的状态,这是一个很致命的操作

  • 故障测试需要充分

如果决策是一个很复杂的过程,需要进行故障的测试,保证决策的状态正确

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值