今天突然接到业务反馈,下载的一个excel表格的数据不对,表格显示的消费金额竟然比商家收到的总金额还多,明显有问题。
- 首先打开日志,我擦,竟然没有日志,也没有链路,后来仔细查看发现因为日志系统里面打印的单条日志太多,导致单条日志截断了,链路以及完整的日志信息自然是采集不到了,只留下一些无用的片段。
- sandbox复现一下吧,我擦,构造了一下使用场景发现结果正常着呢。
- 这个地方用的是从数据库,会不会主从同步出问题了,好像也不会,本着怀疑的态度还是查看了一下没有发现问题。
- 没有办法只能把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)
}
}
网友评论