一个id分组请求导致的bug

2023-08-29  本文已影响0人  鸿雁长飞光不度

今天突然接到业务反馈,下载的一个excel表格的数据不对,表格显示的消费金额竟然比商家收到的总金额还多,明显有问题。

  1. 首先打开日志,我擦,竟然没有日志,也没有链路,后来仔细查看发现因为日志系统里面打印的单条日志太多,导致单条日志截断了,链路以及完整的日志信息自然是采集不到了,只留下一些无用的片段。
  2. sandbox复现一下吧,我擦,构造了一下使用场景发现结果正常着呢。
  3. 这个地方用的是从数据库,会不会主从同步出问题了,好像也不会,本着怀疑的态度还是查看了一下没有发现问题。
  4. 没有办法只能把batchNum该小点,让日志可以完整打印,然后上线,发现每次请求都是一样的, 发现少了一个i++
// 拆分查询
    batchNum := 2000
    length := len(ids)
    chunks := int(math.Ceil(float64(length) / float64(batchNum)))
    result := []*pb.ID{}

    for i, end := 0, 0; chunks > 0; chunks-- {
        end = (i + 1) * batchNum
        if end > length {
            end = length
        }
                // ids[i*batchNum : end] 做业务请求
        // i++
    }

其实上面写法不好,尤其是业务处理逻辑和索引变量容易混在一块,业务处理逻辑长的时候不直观,可以采用类似下面的实现会更好。

func Chunk[T any](slice []T, chunkSize int) [][]T {
    var result [][]T
    for i := 0; i < len(slice); i += chunkSize {
        end := i + chunkSize
        if end > len(slice) {
            end = len(slice)
        }
        result = append(result, slice[i:end])
    }
    return result
}

func main() {

    var t = []int{1, 2, 3, 4, 5, 6}
    for _, v := range Chunk(t, 10) {
        fmt.Println(v)
    }
}

上一篇 下一篇

猜你喜欢

热点阅读