場(chǎng)景
線上廣告系統(tǒng)需要對(duì)廣告進(jìn)行排序踱讨,這一塊其實(shí)蠻復(fù)雜的,涉及流量規(guī)劃,點(diǎn)擊反饋驼卖。不過(guò)為了快速上線氨肌,這些先不考慮,使用官方庫(kù) sort 進(jìn)行排序酌畜,只要實(shí)現(xiàn) Less Swap Len 三個(gè)涵數(shù)就可以怎囚,非常簡(jiǎn)單。
問(wèn)題
對(duì)于不同類(lèi)型廣告桥胞,正式恳守,預(yù)上線,運(yùn)營(yíng)卡片贩虾,嚴(yán)格遵守排序的催烘,但是同一類(lèi)型的要隨機(jī)一個(gè)位置 ,這樣用戶(hù)匹配時(shí)從數(shù)組超始位置匹配即可缎罢。升級(jí)go1.6后伊群,不定期的會(huì)發(fā)生 sort panic
我們的 Swap 函數(shù)實(shí)現(xiàn)大致如下:
對(duì)于同等地位的廣告做隨機(jī)排序,使用 rand 策精,壓測(cè)穩(wěn)定復(fù)現(xiàn)panic舰始。后來(lái)把 rand 邏輯扔到了外面,在廣告生成時(shí)咽袜,隨機(jī)給一個(gè)權(quán)重丸卷,不使用rand排序,壓測(cè)后就不會(huì)復(fù)現(xiàn)询刹。
最后
這是個(gè)已知問(wèn)題谜嫉,在官方 issue 里面提到過(guò),并且已經(jīng) fix了范抓。涉及到底層快序排序算法骄恶,作者為了優(yōu)化性能引入了一個(gè)bug,作者已經(jīng)修復(fù)了匕垫,但是當(dāng)前還沒(méi)有 go binary release僧鲁,再等等吧,暫時(shí)用新版 sort 規(guī)避掉象泵。
這里 有測(cè)試程序寞秃,感興趣的可以看看。