场景
线上广告系统需要对广告进行排序,这一块其实蛮复杂的,涉及流量规划,点击反馈。不过为了快速上线,这些先不考虑,使用官方库 sort 进行排序,只要实现 Less Swap Len 三个涵数就可以,非常简单。
问题
对于不同类型广告,正式,预上线,运营卡片,严格遵守排序的,但是同一类型的要随机一个位置 ,这样用户匹配时从数组超始位置匹配即可。升级go1.6后,不定期的会发生 sort panic
我们的 Swap 函数实现大致如下:
对于同等地位的广告做随机排序,使用 rand ,压测稳定复现panic。后来把 rand 逻辑扔到了外面,在广告生成时,随机给一个权重,不使用rand排序,压测后就不会复现。
最后
这是个已知问题,在官方 issue 里面提到过,并且已经 fix了。涉及到底层快序排序算法,作者为了优化性能引入了一个bug,作者已经修复了,但是当前还没有 go binary release,再等等吧,暂时用新版 sort 规避掉。
这里 有测试程序,感兴趣的可以看看。
有疑问加站长微信联系(非本文作者)