鏈汉3y锛孧arkdown绋嬪簭鍛橈紝涓€骞碈RUD缁忛獙锛屽崄骞寸粡楠岎煈煆烩€嶐煉诲父骞磋瑾変负涓撲笟鍒绘澘鐜╁鍓嶆鏃堕棿锛屾湁鏈嬪弸鏉ユ壘鎴戯紝闂垜锛岃涓嶈瀹炵幇寤惰繜鍙戦€侊紝瀹冩槸鍩轰簬鍋氫粈涔堛€傜湅鍒拌繖涓棶棰樺悗锛岀◢寰兂浜嗕竴涓嬶紝瑙夊緱纭疄鏄疉ustin骞冲彴闇€瑕佸疄鐜扮殑鍔熻兘銆傚浜庡墠绔紝鍙涓氬姟鏂瑰湪鍒涘缓妯℃澘鏃跺~鍐欏睆钄界被鍨嬶紝鍚庣鏍规嵁杩欎釜瀛楁娣诲姞涓€鐐圭粏鑺傦紝杩欎釜闇€姹傚氨瀹屾垚浜嗭紝绠€鍗曪紒濡備綍寤惰繜娑堟伅锛熷欢杩熸秷鎭殑瀛楅潰鎰忔€濇槸锛氭敹鍒版秷鎭悗锛屾垜闇€瑕佽繃涓€娈垫椂闂村啀澶勭悊锛堢浉瀵逛簬绔嬪嵆澶勭悊锛岄渶瑕佷竴娈垫椂闂达紝鎵€浠ョО涓哄欢杩熸秷鎭級銆傚湪鍘熺敓Java涓紝鏈塂elayQueue鍙互渚涙垜浠娇鐢ㄣ€傚湪浣跨敤鐨勬椂鍊欙紝鎴戜滑娣诲姞鐨勯槦鍒楃殑鍏冪礌闇€瑕佸疄鐜癉elayed鎺ュ彛锛堝悓鏃惰繖涓帴鍙g户鎵夸簡Comparable鎺ュ彛锛屾墍浠ユ垜浠殑DelayQueue鏄湁搴忕殑锛塸ublicinterfaceDelayedextendsComparable{longgetDelay(TimeUnitunit);}浠巔oll鐨勬簮鐮佸彲浠ユ竻妤氱殑鍙戠幇锛屽叾瀹炶川灏辨槸鍦ㄥ彇鏁扮殑鏃跺€欏垽鏂椂闂淬€傞暱寤惰繜=first.getDelay(NANOSECONDS);if(delay<=0)returnq.poll();鏈変汉鍙嶉┏锛氳繖涓嶆槸搴熻瘽鍚楋紵浣犲繀椤诲垽鏂椂闂淬€傚鏋滀綘涓嶅垽鏂椂闂达紝浣犳€庝箞鐭ラ亾鎴戣寤惰繜鐨勬秷鎭粈涔堟椂鍊欐墽琛屻€備簡瑙d簡杩欎竴鐐逛箣鍚庯紝鎴戜滑鍐嶆潵涓€涓柟妗堛€傚洜涓虹敓浜х幆澧冧笉澶彲鑳界敤鍒癑DK鍘熺敓鐨勫欢杩熼槦鍒楋紝鎵€浠ヤ笉鎸佷箙鍖栵紝閲嶅惎浼氬鑷存暟鎹涪澶便€侫ustin椤圭洰浣跨敤鍐呭瓨闃熷垪瑙h€︽暟鎹鐞嗭紝鏈変汉鎻愬嚭閲嶅惎鏈嶅姟鍣ㄦ€庝箞鍔烇紵鎴戠殑瑙e喅鏂规鏄紭闆呭湴鍏抽棴鏈嶅姟鍣紝灏藉彲鑳介伩鍏嶆暟鎹涪澶便€傚欢杩熼槦鍒楁棤娉曞仛鍒拌繖涓€鐐癸紝鎴戜滑涓嶈兘绛夐偅涔堜箙銆傛兂涓€鎯筹紝杩樻湁浠€涔堝瓨鍌ㄩ€傚悎鍋氶槦鍒楋紝鏈夋寔涔呭寲鏈哄埗鍛紵绛旀寰堟槑鏄撅細Redis鍜屾秷鎭槦鍒楋紙Kafka/RocketMQ/RabbmitMQ绛夛級鍏堟潵鐪婻edis鎻愪緵鐨勬暟鎹粨鏋剒set锛屽畠鏄竴涓彲鎺掑簭鐨勯泦鍚堬紝Redis鍘熺敓鏀寔鎸佷箙鍖栥€傛湁璧炵殑寤惰繜闃熷垪鏄熀浜巣set璁捐鍜屽瓨鍌ㄧ殑銆傛暣浣撴灦鏋勫涓嬪浘鎵€绀猴細杩欏紶鍥剧畝鍗曠悊瑙d负锛氬皢闇€瑕佸欢鏃剁殑娑堟伅鏀剧疆鍦≧edis涓紝閫氳繃Timer杞鑾峰彇鍙墽琛屾秷鎭紝灏嗗彲鎵ц娑堟伅鏀剧疆鍦ㄤ笉鍚岀殑topic涓紝渚涗笟鍔℃柟鑷娑堣垂.鏇村璁捐鎬濊矾鍙互鍙傝€冩湁璧炴妧鏈師鏂囷紝杩欓噷涓嶅啀璧樿堪锛歨ttps://tech.youzan.com/queuing_delay/閫氳繃瀹氭椂鍣ㄨ疆璇set鏄惁鏈夋槸涓€绉嶆€濊矾閮芥槸鍙墽琛岀殑娑堟伅锛岃繕鏈変汉涔熷彲浠ラ€氳繃Redis杩囨湡鍥炶皟鐨勫Э鍔垮疄鐜版秷鎭欢鏃剁殑鏁堟灉锛堟秷鎭墽琛屾椂闂村畾涔変负key杩囨湡鏃堕棿锛屽綋key瑙﹀彂杩囨湡鍥炶皟鏃讹紝琛ㄧず娑堟伅鍙互琚墽琛岋級銆傝瀹孯edis锛屾垜浠啀鏉ョ湅鐪嬫秷鎭槦鍒椼€侫ustin椤圭洰涓婁娇鐢ㄧ殑娑堟伅闃熷垪鏄疜afka锛孠afka瀹樻柟骞舵病鏈夋彁渚涘欢杩熼槦鍒楁満鍒躲€備絾鏄疪abbmitMQ鍜孯ocketMQ閮芥湁鐩稿簲鐨勬満鍒躲€傛垜浠彲浠ョ畝鍗曠殑鐪嬩竴涓嬩粬浠殑瀹炵幇鎬濊矾銆俁abbmitMQ鐨勫欢杩熼槦鍒楁満鍒舵湰璐ㄤ笂鏄€氳繃TTL锛圱imeToLive娑堟伅鐢熷瓨鏃堕棿锛夋潵瀹炵幇鐨勩€傚綋闃熷垪涓殑鍏冪礌瑙﹀彂杩囨湡鏃讹紝瀹冧細琚彂閫佸埌DeadLetterExchanges锛堝湪姝讳俊闃熷垪涓級銆傛垜浠彲浠ュ皢姝讳俊闃熷垪鐨勫厓绱犲啀娆¤浆鍙戝苟娑堣垂锛屼粠鑰岃揪鍒板欢杩熼槦鍒楃殑鏁堟灉銆俁abbmitMQ姣曠珶鏄笓闂ㄥ仛娑堟伅闃熷垪鐨勶紝鎵€浠ュ浜庢秷鎭殑鍙潬鎬т細姣擱edis楂橈紙娑堟伅浼犻€掔殑鍙潬鎬э紝鑷冲皯涓€绉嶅鐞嗙殑娑堣垂璇箟锛夈€俁ocketMQ鏀寔鍦ㄦ垜浠紶閫掓秷鎭椂璁剧疆寤惰繜绾у埆銆侻essagemessage=newMessage("TestTopic",("Helloscheduledmessage"+i).getBytes());//杩欐潯娑堟伅灏嗗湪10绉掑悗浼犻€掔粰娑堣垂鑰呫€俶essage.setDelayTimeLevel(3);//鍙戦€佹秷鎭敓浜ц€呫€傚彂淇℃伅锛?榛樿鏀寔18绉嶅欢杩熺骇鍒紝鍒嗗埆鏄細messageDelayLevel=1s5s10s30s1m2m3m4m5m6m7m8m9m10m20m30m1h2h褰撴垜浠缃秷鎭欢杩熺骇鍒椂锛孯ocketMQ涓嶄細鐩存帴灏嗘秷鎭姇閫掑埌瀵瑰簲鐨則opic琚浆鍙戝埌寤惰繜绾у埆瀵瑰簲鐨勯槦鍒椾腑銆傚湪Broker鍐呴儴锛屼細涓烘瘡涓欢杩熼槦鍒楄缃竴涓猅imerTask鏉ュ垽鏂秷鎭槸鍚﹀埌杈俱€係cheduleMessageService#startfor(Map.Entryentry:this.delayLevelTable.entrySet()){this.deliverExecutorService.schedule(newDeliverDelayedMessageTimerTask(level,offset),FIRST_DELAY_TIME,TimeUnit.MILLISECONDS);}濡傛灉杩囨湡锛屽垯閲嶆柊-灏嗘秷鎭瓨鍌ㄥ埌CommitLog锛岃浆鍙戝埌鐪熷疄鐩爣鐨則opic銆傚鏋滃RocketMQ寤惰繜闃熷垪鎰熷叴瓒o紝鎺ㄨ崘闃呰杩欑瘒鏂囩珷锛歨ttps://cloud.tencent.com/developer/article/1581368瀹炵幇闇€姹備笂闈㈡湁鎻愬埌鎴戜滑鍙互浣跨敤JDK鍘熺敓鐨勫欢杩熼槦鍒楋紝鎴栬€匯edis鐨剒set鏁版嵁缁撴瀯鎴栬€呭畠鐨勮繃鏈熸椂闂存満鍒讹紝鎴栬€匯abbitMQ浣跨敤TTL+姝讳俊闃熷垪鏈哄埗锛屾垨鑰匯ocketMQ鐨勫欢杩熺骇闃熷垪鏈哄埗鏉ュ疄鐜版垜浠殑闇€姹傦紙Delayqueue锛夊浜庤繖涓渶姹傦紝鎴戞病鏈変娇鐢ㄤ笂闈㈡彁鍒扮殑寤惰繜闃熷垪...austin椤圭洰寮曞叆浜咾afka锛屽紩鍏ョ浜屼釜娑堟伅闃熷垪鐨勫彲鑳芥€т笉澶э紙RabbitMQ鍦ㄧ綉涓婂簲璇ユ槸姣旇緝灏戠敤鐨勶紝RocketMQ闇€瑕佹洿鏀归厤缃枃浠剁殑寤惰繜绾у埆鏉ユ敮鎸佹洿涓板瘜鐨勫欢杩熼渶姹傦級銆傚鏋滃熀浜嶬afka鎴栬€匯edis浜屾寮€鍙戝欢杩熼槦鍒楋紝寮€鍙戞垚鏈繕鏄尯澶氱殑锛岃€屼笖鍦℅itHub涓婅繕娌℃湁鎵惧埌鎴戞兂瑕佺殑杞瓙銆備簬鏄紝鎴戞崲浜嗕竴涓В鍐虫柟妗堬細鎵€鏈夌殑涓滆タ閮芥壂鎻忚繖涓渶姹傦紙鏅氫笂鍙戠殑娑堟伅锛岀浜屽ぉ鏃╀笂鍙戠殑锛夛紝涓嶉渶瑕佸啀鍘诲欢杩熼槦鍒椾簡锛屽洜涓篴ustin宸茬粡鎺ュ叆浜嗗垎甯冨紡瀹氭椂浠诲姟妗嗘灦锛堢殑瀵瑰簲鐨勫疄鐜版槸xxl-job锛夊氨鎶婃櫄涓婃敹鍒扮殑娑堟伅涓㈠埌Redis鍒楄〃涓紝鐒跺悗鍚姩涓€涓畾鏃朵换鍔★紙姣忓ぉ鏃╀笂9:00锛夎疆璇㈠垪琛ㄦ槸鍚︽湁鏁版嵁锛屽鏋滄湁鍒欓噸鏂板鐞嗕綘灏卞畬鎴愪簡銆傛€荤粨杩欑瘒鏂囩珷涓昏璁茬殑鏄鏋滄垜浠浣跨敤寤惰繜闃熷垪锛屾垜浠€嬧€嬪彲浠ユ湁鍝簺瑙e喅鏂规锛屼互鍙婂畠浠殑璁捐鏄€庢牱鐨勩€備粠闇€姹傜鏉ョ湅锛岃繖涓渶姹傛槸鈥滃欢杩熼槦鍒椻€濈殑鍦烘櫙锛屼絾鏄熀浜庣洰鍓嶇殑绯荤粺鏋舵瀯鍜屽紑鍙戞垚鏈殑鑰冭檻锛屾垜浠彲浠ヤ娇鐢ㄥ彟涓€绉嶆柟寮忥紙鍒嗗竷寮忓畾鏃朵换鍔℃鏋讹級鏉ュ疄鐜拌繖涓渶姹傘€傚緢澶氭椂鍊欙紝鎴戜滑鐪嬪埌涓嶅ソ鐨勭郴缁燂紝涓嶅ソ鐨勬妧鏈爤锛屽彂鐜板緢澶氬満鏅病鏈夌敤鍒版渶浣冲疄璺碉紝灏辫寰楀緢鎭肩伀銆傚勾杞荤殑鏃跺€欙紝鎴戜滑鎯抽噸鏋勩€備絾鍏跺疄姣忓紩鍏ヤ竴涓腑闂翠欢閮芥槸鏈夋垚鏈殑锛岀矖绯欏害涔熸湁绮楃硻搴︾殑濂藉銆傚彧瑕佽兘澶熷畬缇庣殑鏀拺涓氬姟锛屽氨鏄緢濂界殑瑙e喅鏂规銆傚鏋滀綘鎯冲紑鍙戜綘鎯宠鐨勬妧鏈紝閭e氨寮€婧愬惂銆傚鏋滄湁涓€澶╂垜瑙夊緱鍒嗗竷寮忓畾鏃朵换鍔′笉椤虹溂锛屾垜浼氳姳鏃堕棿閲嶆瀯鏉ユ憜鑴卞畠銆傜幇鍦ㄨ鎴戜滑瀹炴柦瀹冿紙//TODOs锛夈€傚鏋滀綘鐪熺殑瑙夊緱瀹冪湅璧锋潵涓嶅ソ锛屾杩庢彁浜や竴涓猵ullrequest锛岃繖鏍锋垜灏卞緱鎶婅繖涓疄鐜版潃浜嗭紙鎴戜細璋ㄦ厧灏忓績鎴戞彁鍑虹殑pullrequest锛夈€傜湅鍒拌繖閲屼簡锛岀偣杩欓噷濂借瘎涓嶈繃鍒嗗惂锛熸垜3宀佷簡锛屼笅娆¤銆侫ustin椤圭洰婧愮爜Gitee閾炬帴锛歡itee.com/austinaustin椤圭洰婧愮爜GitHub閾炬帴锛歡ithub.com/austin