Job queue rollback
Tags: redis, tasktiger
Published: 2018-02-10 22:38:26

---
title: "Job queue rollback"
published: true
tags: redis,tasktiger
canonical_url: 
---

## èƒŒæ™¯

æˆ‘ä»¬çš„å¼‚æ­¥é˜Ÿåˆ—æ˜¯[Tasktiger](https://github.com/closeio/tasktiger)ï¼Œä¸€ä¸ªèƒŒåŽæœ‰å•†ä¸šå…¬å¸æ”¯æŒçš„å¼€æºé¡¹ç›®ã€‚

ä¹‹å‰æ˜¯[Pyres](https://github.com/binarydud/pyres)ï¼Œä¸€ä¸ª[Resque](https://github.com/resque/resque)çš„Pythonå®žçŽ°ï¼Œå› ä¸º[Github](https://github.com)åœ¨ä½¿ç”¨[Resque](https://github.com/resque/resque)ï¼Œ[Instagram](https://www.instagram.com/)åœ¨ä½¿ç”¨[Pyres](https://github.com/binarydud/pyres)ï¼Œæˆ‘ä»¬åº”è¯¥å¯ä»¥ç”¨ä¸€æ®µæ—¶é—´ã€‚

åŽæ¥[Pyres](https://github.com/binarydud/pyres)é•¿ä¹…ä¸å†ç»´æŠ¤ï¼Œç§¯ç´¯äº†ä¸€äº›bugä»¥åŠæ€§èƒ½é—®é¢˜è®©æˆ‘ä»¬ä¸å¾—ä¸é€‰æ‹©æ›´æ¢ä¸€ä¸ªå¼‚æ­¥é˜Ÿåˆ—ç³»ç»Ÿï¼ŒæœŸåˆè€ƒè™‘è¿‡[Celery](http://www.celeryproject.org/)ï¼Œé‚£æ˜¯ä¸€ä¸ªå¾ˆæˆç†Ÿå¾ˆå¼ºå¤§çš„é˜Ÿåˆ—ç³»ç»Ÿï¼Œä»¥è‡³äºŽæˆ‘å¾ˆéš¾ä¸€ä¸‹å­æžæ¸…å®ƒã€‚

## é—®é¢˜

åœ¨ä½¿ç”¨`Tasktiger`åŽæœ‰æ—¶ä¼šé‡åˆ°å·²ç»å¤„ç†å®Œæ¯•çš„taskåˆé‡æ–°è¢«enqueueçš„æƒ…å†µï¼Œå¦‚æžœæ‰€æœ‰taskéƒ½æ˜¯å¹‚ç­‰çš„ï¼ˆIdempotentï¼‰ï¼Œé‚£è¿™ä¹Ÿä¸æ˜¯é—®é¢˜ï¼Œç¬¬äºŒæ¬¡æ‰§è¡Œtaskä¼šå› ä¸ºä¹‹å‰å¤„ç†è¿‡è€Œä¸è‡³äºŽå†åšä¸€æ¬¡ã€‚ç„¶è€Œå¹¶ä¸æ˜¯æ‰€æœ‰taskéƒ½å®Œæˆäº†å¹‚ç­‰æ”¹é€ ï¼Œæ‰€ä»¥è¿™å¯¹äºŽæˆ‘ä»¬æ¥è¯´æ˜¯ä¸ªä¸¥é‡é—®é¢˜ï¼Œä½†å½“æ—¶å¹¶ä¸èƒ½ç¨³å®šé‡çŽ°ã€‚

## æŽ¢ç´¢

æ€€ç–‘è¿‡è®¸å¤šåœ°æ–¹ï¼ŒåŽæ¥å‘çŽ°åœ¨queue redisä¸Šæ‰§è¡Œ`BGREWRITEAOF`å°±èƒ½é¿å…è¿™ä¸ªé—®é¢˜ï¼ŒäºŽæ˜¯æŠŠåŽŸå…ˆä¸€ä¸ªæœˆæ‰§è¡Œä¸€æ¬¡çš„`AOF`é‡å†™æ“ä½œå˜æˆäº†æ¯å¤©æ‰§è¡Œä¸€æ¬¡ï¼Œå¤§æ¦‚åœ¨å¤‡ä»½æ•°æ®ä¹‹å‰ï¼Œå› ä¸ºå¤‡ä»½éœ€è¦åœæœºï¼Œå¦‚æžœä¸åœ¨è¿™ä¹‹å‰åšï¼Œå¯èƒ½å¤‡ä»½å¯¼è‡´é‡å¯æœåŠ¡å°±ä¼šè®©å¾ˆå¤šå·²ç»å¤„ç†è¿‡çš„taské‡å¤å¤„ç†ï¼Œä¾‹å¦‚å¯èƒ½ä¼šç»™ä¼šå‘˜å‘å¤šæ¡çŸ­ä¿¡å’Œå¾®ä¿¡æé†’ã€‚

* * *

å°±åœ¨æ˜¨å¤©ï¼Œå› ä¸ºé‡å¯queue rediså¯¼è‡´å¾ˆå¤štaské‡å¤å¤„ç†ï¼Œè¿™ä¸ªé—®é¢˜ç»ˆç©¶æ²¡æœ‰è¢«è§£å†³ï¼ŒäºŽæ˜¯èŠ±äº†å¤§çº¦2å¤©æ—¶é—´ï¼Œæ‰¾åˆ°äº†å¯¼è‡´é—®é¢˜çš„æ ¹æºã€‚

ä¹‹å‰çŒœæµ‹æ˜¯ä¸æ˜¯`Tasktiger`å“ªé‡Œæ²¡å†™å¥½å¯¼è‡´ï¼Œæ¯•ç«Ÿè¿™ä¸ªé¡¹ç›®åœ¨Githubä¸Šåªæœ‰ä¸åˆ°500ä¸ªstarï¼Œè€Œredisæœ‰å‡ ä¸‡ï¼Œå¹¿å¤§ç”¨æˆ·åŸºç¡€æ›´å®¹æ˜“å‘çŽ°å¥‡æ€ªbugï¼Œè€Œåœ¨`Tasktiger`ä¸Šé‡åˆ°æŸä¸ªbugï¼Œä¹Ÿè®¸ä½ å°±æ˜¯ä¸–ç•Œä¸Šç¬¬ä¸€ä¸ªé‡åˆ°çš„ã€‚åŸºäºŽè¿™ä¸ªå‡è®¾æˆ‘çœ‹äº†å¾ˆå¤šæºä»£ç ï¼Œæ²¡æœ‰æ‰¾åˆ°å¯é è¯æ®ï¼Œè€Œä¸”åŸºäºŽä¸€ä¸ªç®€å•äº‹å®žï¼šä¸€ä¸ªtaskä»Žæœ€å¼€å§‹ä¸å­˜åœ¨ï¼Œåˆ°å‡ºçŽ°åœ¨Tasktigerä¸­ï¼Œåˆ°å¤„ç†å®Œè¢«åˆ é™¤ï¼Œå¦‚æžœæ˜¯`Tasktiger`çš„é—®é¢˜ï¼Œé‚£å®ƒä»Žå“ªé‡Œå¾—åˆ°æ•°æ®æž„é€ å‡ºä¸€ä¸ªtaskå‘¢ï¼Ÿéš¾é“æ˜¯redisçš„é—®é¢˜å—ï¼Ÿ

queue redisä¸€èˆ¬éƒ½ä¼šå¯ç”¨`AOF`ï¼Œæ‰€æœ‰ä¿®æ”¹æ•°æ®çš„å‘½ä»¤å’Œå€¼è¢«è®°å½•åˆ°`AOF`ä¸­ï¼Œç­‰redisé‡å¯æ—¶ï¼Œä¼šæ‰§è¡Œ`AOF`æ–‡ä»¶ä¸­çš„å‘½ä»¤ï¼Œè¿™æ ·rediså°±æœ‰äº†å’Œé‡å¯å‰ä¸€æ¨¡ä¸€æ ·çš„æ•°æ®ã€‚åœ¨`AOF`ä¸­è®°å½•ç€æŸä¸ªtaskä»Žå‡ºçŽ°åˆ°æ¶ˆå¤±çš„å…¨è¿‡ç¨‹ï¼Œéš¾é“æ˜¯redisæ²¡å®Œæˆloadå°±æŽ¥å—æœåŠ¡äº†ï¼Ÿä»Žæ—¥å¿—ä¸Šçœ‹å¹¶ä¸æ˜¯è¿™æ ·ï¼Œåœ¨æ²¡loadå®Œæ‰§è¡Œæ“ä½œä¼šå¾—åˆ°å¼‚å¸¸ã€‚

çœ‹äº†ä¸‹ç”Ÿäº§çŽ¯å¢ƒçš„queueçŠ¶æ€ï¼ŒåŸºæœ¬æ²¡æœ‰æ­£åœ¨å¤„ç†çš„taskï¼ŒåœæŽ‰queue redisï¼Œä¸‹è½½`AOF`æ–‡ä»¶ï¼Œåœ¨æœ¬åœ°è®©rediså¯åŠ¨å¹¶loadè¿™ä»½`AOF`ï¼Œä¸å¯åŠ¨`Tasktiger`çš„workerï¼Œåªé™é™åœ°çœ‹queueçš„çŠ¶æ€ï¼Œå‘çŽ°loadå®ŒåŽæœ‰å¾ˆå¤štaskè¢«é‡æ–°æ”¾å›žäº†queueï¼Œæ­¤æ—¶å¦‚æžœæœ‰workerï¼Œä¸€å®šä¼šé‡å¤æ‰§è¡Œã€‚

åˆ°è¿™é‡Œéš¾é“èƒ½ç¡®å®šæ˜¯redisçš„é—®é¢˜å—ï¼Ÿredisçš„`AOF`å¹¶ä¸èƒ½è®©rediså›žåˆ°ä¹‹å‰çš„çŠ¶æ€ï¼Ÿå¦‚æžœæ˜¯è¿™æ ·çš„è¯redisæ€Žä¹ˆä¼šè¢«å¹¿æ³›åº”ç”¨ï¼Ÿ

äºŽæ˜¯æ‰¾äº†ä¸€ä¸ªtaskï¼Œä»Ž`AOF`ä¸­çœ‹çœ‹`Tasktiger`æ˜¯å¦‚ä½•å¤„ç†å®ƒçš„ã€‚

å¤„ç†è¿‡ç¨‹æ²¡å‘çŽ°å¼‚å¸¸ï¼Œåªæ˜¯`Tasktiger`ç”¨äº†å¾ˆå¤š`lua`è„šæœ¬æ“ä½œæ•°æ®ï¼Œä¾‹å¦‚æœ‰ä¸ªè„šæœ¬æ˜¯ï¼šå½“ä¸€ä¸ªkeyä¸åœ¨ç»™å®šçš„æŸå‡ ä¸ªzsetä¸­æ—¶åˆ é™¤è¿™ä¸ªkeyã€‚è¿™ä¸ªæ“ä½œä¸å¤æ‚ï¼Œä½†ä½ æ— æ³•åªç”¨rediså®Œæˆï¼Œå› ä¸ºredisåªæ˜¯ä¸€ä¸ªæ•°æ®å­˜å‚¨ï¼Œæ— æ³•å¤„ç†å¤æ‚é€»è¾‘ï¼Œæ‰€ä»¥åªèƒ½ä½¿ç”¨`lua`å®Œæˆï¼Œå½“ç„¶å¾ˆå¤šè¯­éƒ½å¯ä»¥å®Œæˆè¿™ä¸ªé€»è¾‘ï¼Œåªä¸è¿‡redisæ”¯æŒæ‰§è¡Œ`lua`è„šæœ¬ï¼Œç®—ä½œæ˜¯å¯¹redisæ“ä½œçš„è¡¥å……ã€‚

å› ä¸ºæœ‰äº†ä¸€ä¸ªå…·ä½“taskï¼ŒæŸ¥çœ‹å’Œå®ƒç›¸å…³çš„æ‰€æœ‰æ“ä½œåŽï¼Œå‘çŽ°é™¤éžæ˜¯åœ¨æŸä¸€æ­¥`lua`è„šæœ¬æœªæ‰§è¡Œæ—¶æ‰ä¼šå¯¼è‡´è¿™ä¸ªtaskè¢«æ”¾åœ¨active queueä¸­è€Œä¸æ˜¯è¢«ç§»é™¤ã€‚

äºŽæ˜¯æˆ‘æž„é€ äº†ä¸€ä»½`AOF`ï¼Œæœ€å¼€å§‹çš„éƒ¨åˆ†æ˜¯ä¸€å †`SCRIPT LOAD`æŒ‡ä»¤ï¼ŒæŠŠ`Tasktiger`éœ€è¦çš„è„šæœ¬éƒ½loadåˆ°redisä¸­ï¼Œè¿™æ ·åŽç»­æ“ä½œæ‰å¯ä»¥ä½¿ç”¨`EVALSHA`ï¼Œè¿™ä»½æž„é€ å¥½çš„`AOF`ä¹Ÿé€šè¿‡äº†`redis-check-aof`æ£€æŸ¥ï¼Œè¢«loadåŽå†æ¬¡æŸ¥çœ‹queueçŠ¶æ€ï¼Œç«Ÿç„¶æ­£å¸¸äº†ï¼Œå’Œåœredisä¹‹å‰ä¸€è‡´ï¼çœ‹æ¥é—®é¢˜å‡ºåœ¨æ‰§è¡Œè¿™äº›è„šæœ¬çš„åœ°æ–¹ã€‚

åœ¨redisä¸­æ‰§è¡Œ`lua`è„šæœ¬æœ‰ä¸¤ç§åšæ³•ï¼Œç¬¬ä¸€ç§æ˜¯ä½¿ç”¨`EVAL`ï¼Œè¿™ç§åšæ³•æ˜¯æŠŠè„šæœ¬å†…å®¹ä¸€å¹¶è´´ä¸Šï¼Œæ¯æ¬¡æ‰§è¡Œéƒ½éœ€è¦è¿™æ ·ï¼Œå¦‚æžœæ€»æ˜¯é‡å¤æ‰§è¡ŒæŸä¸ªç‰¹å®šè„šæœ¬å°±ä¼šå› ä¸ºä¼ è¾“äº†å¤§é‡è„šæœ¬å†…å®¹è€Œä½¿å¾—æ•ˆçŽ‡ä¸å¤Ÿé«˜ï¼ŒäºŽæ˜¯æœ‰äº†ç¬¬äºŒç§æ‰§è¡Œæ–¹æ³•––`EVALSHA`ï¼Œä½¿ç”¨è¿™ç§éœ€è¦è„šæœ¬çš„`SHA1`ï¼Œå½“æ‰§è¡Œ`SCRIPT LOAD`åŽï¼Œredisè¿”å›žçš„å†…å®¹å°±æ˜¯è„šæœ¬çš„`SHA1`ï¼Œloadè¿‡çš„è„šæœ¬åœ¨æ‰‹å·¥flushå‰æˆ–è€…redisé‡å¯å‰éƒ½æ˜¯æœ‰æ•ˆçš„ã€‚`SCRIPT LOAD`åœ¨`BGREWRITEAOF`åŽå¹¶ä¸ä¼šå­˜åœ¨ï¼Œè™½ç„¶ä½ è¿˜æ˜¯å¯ä»¥é€šè¿‡`EVALSHA`è°ƒç”¨è„šæœ¬ã€‚

é‚£ä¹ˆè¿™ä¸¤ç§æ‰§è¡Œæ–¹æ³•å¯¹äºŽ`AOF`æ–‡ä»¶è®°å½•å†…å®¹æœ‰å·®åˆ«å—ï¼Ÿæ²¡æœ‰ï¼Œæ‰§è¡Œ`EVALSHA`ä¹Ÿä¼šè¢«è®°å½•æˆ`EVAL`ï¼Œå¦‚æžœä½ åœ¨`AOF`ä¸­å‘çŽ°æœ‰`EVALSHA`é‚£å°±å¥‡æ€ªäº†ã€‚åœ¨ç”Ÿäº§çŽ¯å¢ƒä¸‹è½½çš„`AOF`ä¸­ï¼Œæœ‰ä¸å°‘`EVALSHA`ï¼Œä¸ºä½•æ²¡æœ‰è¢«è®°å½•æˆ`EVAL`ï¼Ÿå› ä¸ºè¿™äº›`EVALSHA`å¹¶ä¸æ˜¯redisæ‰§è¡Œçš„ï¼Œè€Œæ˜¯`Tasktiger`çš„`pipeline`

**å¯¼è‡´å‡ºçŽ°å›žæ»šé—®é¢˜çš„åŽŸå› æ˜¯ï¼šBGREWRITEAOFåŽï¼Œç”±äºŽSCRIPT LOADè¢«åŽ»æŽ‰ï¼Œredisé‡å¯åŽå¦‚æžœæœ‰ä½¿ç”¨EVALSHAè°ƒç”¨è„šæœ¬çš„åœ°æ–¹ä¼šå‡ºé”™ï¼Œå› ä¸ºé‚£ä¸ªè„šæœ¬å¹¶æ²¡æœ‰è¢«redis load**

ä¸æ˜¯è¯´`EVALSHA`ä¼šè¢«ç¿»è¯‘æˆ`EVAL`æ”¾åœ¨`AOF`ä¸­å—ï¼Ÿæ˜¯çš„ï¼Œä¸è¿‡`Tasktiger`è‡ªå·±å®žçŽ°äº†ä¸€ä¸ªredis `pipeline`ï¼Œè¿™ä¹Ÿæ˜¯ä¸ª`lua`è„šæœ¬ï¼Œåœ¨è¿™ä¸ª`lua`è„šæœ¬ä¸­æ˜¯éœ€è¦è°ƒç”¨å…¶ä»–`lua`è„šæœ¬çš„ã€‚è°ƒç”¨æ–¹æ³•åŒ…å«ä¸¤ç§ï¼Œå¤§å¤šæ•°éƒ½æ˜¯`EVALSHA`ï¼Œ **ç”±äºŽredisç¦æ­¢åœ¨luaä¸­ä½¿ç”¨redis.callæ‰§è¡ŒEVALSHAè°ƒç”¨å¦ä¸€ä¸ªè„šæœ¬ï¼ˆå¹¶ä¸æ˜¯æ‰€æœ‰rediså‘½ä»¤éƒ½å¯ä»¥åœ¨redis.callä½¿ç”¨ï¼‰** ï¼ŒTasktigerä½¿ç”¨äº†å…¶ä»–æ–¹æ³•æ¥è°ƒç”¨ï¼Œç®—æ˜¯ä¸€ç§hackã€‚

ç”±äºŽredisçš„é™åˆ¶åŠ ä¸Š`Tasktiger`çš„hackï¼Œå¯¼è‡´ **åœ¨BGREWRITEAOFåŽï¼Œå¦‚æžœæœ‰pipelineè„šæœ¬çš„è°ƒç”¨å‘ç”Ÿï¼Œä¸‹æ¬¡é‡å¯redisä¼šä½¿å¾—ä¹‹å‰åšè¿‡çš„taskè¢«é‡æ–°æ”¾å›žqueueï¼Œå› ä¸ºç§»é™¤æ“ä½œçš„è„šæœ¬è¿˜æ²¡æœ‰loadï¼Œæ‰€ä»¥ç§»é™¤å¤±è´¥äº†ï¼Œçœ‹èµ·æ¥å°±åƒæ˜¯taskè¢«é‡æ–°æ”¾å›žqueue**

**ç›®å‰æˆ‘ä»¬é’ˆå¯¹è¿™ä¸ªé—®é¢˜çš„è§£å†³æ–¹æ³•æ˜¯ï¼šå‹¤å¿«ç‚¹BGREWRITEAOFï¼Œæ¯å°æ—¶ä¸€æ¬¡ï¼Œé‡å¯redisä¹‹å‰å†åšä¸€æ¬¡**