前言:最近做關(guān)于優(yōu)惠券的開發(fā),但是發(fā)現(xiàn)優(yōu)惠券量大了之后,性能完全跟不上,庫中存200萬條優(yōu)惠券,發(fā)一張券竟然需要5分鐘之久,然后我就著手優(yōu)化,最終到發(fā)一張券只需要15毫秒左右,現(xiàn)在把整個思路以及代碼貼出來,供大家一起討論和學(xué)習(xí)。
簡介
主要實現(xiàn)優(yōu)惠券促銷活動,首先創(chuàng)建活動,然后創(chuàng)建券組,采用預(yù)處理的方式提前進(jìn)行制券,在第一版本主要實現(xiàn),功能的基本業(yè)務(wù)。然后在分支實現(xiàn),大數(shù)量和高并發(fā)問題。
分支1.1
1:解決優(yōu)惠券編碼重復(fù)問題,原先采用的是獲取數(shù)據(jù)庫所有的券,然后去比對是否重復(fù),如果庫數(shù)據(jù)量達(dá)百萬的時候就會出現(xiàn)非常緩慢,而且會 出現(xiàn)經(jīng)常制券失敗等,所以此版本舍棄原先采用隨機數(shù)的模式,通過推特的雪花算法來避免唯一,但是依然保留優(yōu)惠券前綴和后綴。
2:由原來的異步采用線程修改為線程池,以為高并發(fā)時候存在大量的線程占內(nèi)存空間。
3:由原來制券采用for循環(huán)模式修改為批量制券,而且采用分配插入優(yōu)惠券,一批次目前定為5000.
4:加入消息隊列(采用rabbitMQ)對于某一批次添加失敗,把失敗的放入對列中,通過隊列進(jìn)行補救,已到達(dá)高可用。避免大批量優(yōu)惠券來回重新導(dǎo)入 消息隊列對于異常信息拒絕解決并重返消息隊列中,配置2個消費者以避免其中一個服務(wù)異常,消息處理出現(xiàn)死循環(huán)
分支1.2
1:加入操作日志
目的:跟蹤熱點數(shù)據(jù),查詢?nèi)罩究焖俑檻?yīng)用程序中的慢查詢或慢操作,為后面的優(yōu)化奠定基礎(chǔ)
2:加入異常日志
目的:快速的獲取線程的異常問題,通過日志中的數(shù)據(jù)能快速修改
3:采用技術(shù) 通過aop和rabbitmq中間件來做,這樣減少由于日志問題給程序帶來的效率問題