记一次目标驱动导致的bug

背景

最近做的一个项目中,用到了目标驱动架构模式,但由于目标下发的不准确,导致出现了线上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设置了什么,就进行修改配置

  • 决策出现异常应该停止

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

  • 故障测试需要充分

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: USB转串口驱动器是一种设备,用于在计算机和串口设备之间进行数据传输。它允许计算机通过USB接口与串口设备进行通信。 在使用USB转串口驱动器时,有时候可能会出现数据偏差的情况。数据偏差是指实际传输的数据与期望传输的数据之间存在一定的差异。 导致USB转串口驱动器测出数据偏差的原因可能有以下几个方面: 1. 电缆质量不好:USB转串口驱动器需要使用USB连接电缆和串口连接电缆,如果电缆质量不好,信号传输可能会受到干扰或损失,导致数据偏差。 2. 驱动程序问题:USB转串口驱动器需要计算机使用相应的驱动程序才能正常工作。如果驱动程序存在问题,例如版本不匹配或者安装不正确,可能会导致数据传输出现偏差。 3. 系统设置问题:计算机的串口设置也可能会影响USB转串口驱动器的传输效果。例如,波特率、数据位数、校验位等设置错误可能导致数据偏差。 为了减少USB转串口驱动器测出数据偏差的可能性,我们可以采取以下措施: 1. 使用高质量的电缆:确保USB连接电缆和串口连接电缆质量良好,避免信号干扰和损失。 2. 更新驱动程序:及时更新最新版本的USB转串口驱动器的驱动程序,以修复已知的问题和提高兼容性。 3. 参考官方指南:仔细阅读USB转串口驱动器的官方指南,按照说明正确设置串口参数,确保和目标设备的通信设置一致。 总而言之,USB转串口驱动器测出数据偏差很可能是由于电缆质量、驱动程序问题或系统设置问题引起的。通过正确选择电缆、更新驱动程序和按照设备要求正确设置串口参数,可以减少数据偏差的发生。 ### 回答2: USB转串口驱动器在数据传输过程中可能出现数据偏差,主要有以下几个原因: 首先,电气特性的不匹配可能导致数据偏差。USB是一种数字接口,而串口是一种模拟接口。在进行USB转串口的数据传输时,由于两者的电气特性不同,可能会导致数据的误差。例如,串口信号的电平、波特率等参数可能与USB接口不匹配,导致数据传输过程中产生误码。 其次,软件驱动的问题也可能导致数据偏差。USB转串口驱动器在计算机上需要安装相应的驱动软件来实现数据传输。如果驱动软件有bug或者兼容性问题,可能会导致数据传输过程中出现错误或者数据偏差。 此外,还有外部干扰的因素。USB转串口驱动器通常通过集成电路来实现数据转换,而集成电路在使用时可能会受到外部干扰,例如电磁干扰、电源噪声等,这些干扰可能导致数据传输过程中的偏差。 为了解决USB转串口驱动器测出的数据偏差问题,可以采取以下几个方法: 首先,应选择合适的USB转串口驱动器。在选择USB转串口驱动器时,应根据实际需求选择合适的产品,尽量避免不匹配的情况。 其次,应确保驱动软件的正确安装和更新。安装正确的驱动软件,并及时更新最新版本的驱动程序,以提供更好的稳定性和兼容性。 此外,还应保持良好的电气环境。在使用USB转串口驱动器时,应尽量避免外部干扰,例如避免与高功率设备同时使用,以减少干扰对数据传输的影响。 总结来说,USB转串口驱动器在数据传输中可能出现数据偏差,原因主要是电气特性的不匹配、软件驱动问题和外部干扰等因素。通过选择合适的驱动器、安装正确的驱动软件和保持良好的电气环境,可以有效解决这些问题,减少数据偏差的发生。 ### 回答3: USB转串口驱动将计算机的USB接口转换为串口接口,使计算机能够与串口设备进行通信。在进行数据传输时,有时会出现数据偏差(da)。数据偏差指的是串口发送的数据与接收的数据存在偏移或误差,导致接收到的数据与发送的数据不一致。 造成USB转串口驱动测出数据偏差的原因可能有多种。首先,USB转串口驱动本身可能存在兼容性问题或者硬件故障,在数据传输过程中无法准确地将USB接口的数据转换为串口接口的数据,从而导致数据偏差的出现。其次,计算机与串口设备之间的通信环境可能存在干扰或者信号传输不稳定的问题,也会导致数据传输中的误差。此外,数据线的质量和长度也可能对数据传输产生影响,如果数据线质量差或者长度过长,就容易引起数据偏差。 解决USB转串口驱动测出数据偏差的方法有几种。首先,可以尝试更新驱动程序或者使用其他版本的驱动程序,以解决可能存在的兼容性问题。其次,可以检查USB转串口驱动的硬件状态,确保没有损坏或者松动的部件。此外,可以优化通信环境,减少干扰或者改善信号传输的稳定性,可以通过使用屏蔽数据线、增加串口设备的供电电流等方式来改进。最后,合理选择适合的数据线,确保质量符合标准并且长度适中,以保证稳定的数据传输。 综上所述,USB转串口驱动测出数据偏差可能是由于驱动程序兼容性问题、硬件故障、通信环境干扰或信号传输不稳定等原因引起的。需要通过更新驱动程序、检查硬件状态、优化通信环境以及选择适合的数据线等方式来解决数据偏差问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值