åŽå°è¿›ç¨‹å’ŒåŽå°ä»»åŠ¡ #################### 概述 ======= 在构建一个高性能å¯ä¼¸ç¼©çš„ Web åº”ç”¨çš„æ—¶å€™ï¼Œä½ å¯ä»¥ä½¿ç”¨åŽå°ä»»åŠ¡å°†ä¸€äº›è€—æ—¶çš„æ“作从 HTTP 请求的处ç†ä¸åˆ†è§£å‡ºæ¥ï¼Œæ”¾åˆ°åŽå°è¿›ç¨‹ä¸åŽ»å¼‚æ¥æ‰§è¡Œã€‚大部分的 Web 请求应该在 500ms 内完æˆï¼Œå¦‚æžœä½ å‘çŽ°ä½ çš„åº”ç”¨æœ‰å¤§äºŽè¿™ä¸ªç”šè‡³æœ‰èŠ±è´¹ä¸€ä¸¤ç§’æ‰èƒ½å®Œæˆçš„è¯·æ±‚ï¼Œé‚£ä¹ˆè¿™ä¸ªæ—¶å€™ä½ åº”è¯¥è€ƒè™‘ä½¿ç”¨ä½¿ç”¨åŽå°ä»»åŠ¡ï¼Œå°†è¿™äº›è€—æ—¶çš„è¯·æ±‚æ”¾åˆ°åŽå°è¿›ç¨‹ä¸åŽ»æ‰§è¡Œã€‚ 比如:å‘é€é‚®ä»¶ã€è¯»å–比较慢的 API 接å£ã€ä¸Šä¼ æ•°æ®åˆ°äº‘å˜å‚¨ä¸ï¼Œè¿™äº›ä»»åŠ¡éƒ½åº”è¯¥æ”¾åˆ°åŽå°ä»»åŠ¡ä¸åŽ»æ‰§è¡Œï¼Œå‰ç«¯çš„ Web è¿›ç¨‹åº”è¯¥æ·»åŠ å®ŒåŽå°ä»»åŠ¡åŽç«‹åˆ»å›žå¤å®¢æˆ·ç«¯ï¼Œç„¶åŽå®¢æˆ·ç«¯å¯ä»¥è½®è¯¢æ£€æŸ¥æ›´æ–°æ¥ç¡®è®¤ä»»åŠ¡æ˜¯å¦å·²ç»å®Œæˆäº†ã€‚ 我们以一个 Web RSS é˜…è¯»å™¨ä¸ºä¾‹ï¼Œè¿™ç±»åº”ç”¨éƒ½ä¼šæœ‰ä¸€ä¸ªè®©ç”¨æˆ·æ·»åŠ æ–°çš„ Feed URL çš„åŠŸèƒ½ï¼Œæ·»åŠ å®ŒæˆåŽç”¨æˆ·ä¼šè¢«è½¬åˆ°ä¸€ä¸ªæ˜¾ç¤ºè¿™ä¸ªæ–° Feed 内容的页é¢ã€‚实现以上功能最简å•的方法,是在 HTTP 请求ä¸çš„处ç†è¿›ç¨‹ä¸ç›´æŽ¥è¯»å–第三方的 Feed å¹¶è¿”å›žã€‚ä½†æ˜¯ï¼Œè¯»å– RSS Feed 的内容是个很耗时的æ“作,å–决于这个 Feed çš„å“应速度,慢的è¯å‡ 秒,如果æä¾› Feed çš„æœåŠ¡æœ‰é—®é¢˜ï¼Œç”šè‡³å¯èƒ½å¯¼è‡´å‡ å秒(å–决于设置的超时时间)。这些会导致应用的页é¢å¡æ»æˆ–者请求超过 Web è¿›ç¨‹çš„å¤„ç†æ—¶é—´ä¸Šé™è€Œè¢«æ€æ»ä»Žè€Œå¯¼è‡´è¯·æ±‚失败,用户体验会éžå¸¸å·®ã€‚ .. image:: /images/fetch-rss-simple.png :scale: 50 % :align: center 解决方法就是使用åŽå°ä»»åŠ¡ï¼Œå°†åŽå°ä»»åŠ¡æ”¾åˆ°åŽå°è¿›ç¨‹ä¸åŽ»æ‰§è¡Œï¼ŒWeb è¿›ç¨‹æ·»åŠ å®Œä»»åŠ¡åŽç«‹åˆ»è¿”回。åŽå°è¿›ç¨‹ä¸å¤„ç† HTTP è¯·æ±‚ï¼Œåªæ˜¯ä¸åœçš„从任务队列里å–ä»»åŠ¡å¹¶æ‰§è¡Œã€‚ä¸‹é¢æ˜¯æ”¹è¿›åŽçš„ Feed æ·»åŠ æµç¨‹ã€‚ .. image:: /images/fetch-rss-jobqueue.png :scale: 50 % :align: center .. include:: background-process.rst 如何实现åŽå°ä»»åŠ¡ =================== åœ¨æ–°æµªäº‘ä¸Šä½ å¯ä»¥é€šè¿‡ ``Redis/ æ•°æ®åº“+åŽå°è¿›ç¨‹ï¼‹ç¬¬ä¸‰æ–¹ä»»åŠ¡é˜Ÿåˆ—åº“`` è½»æ¾å®žçްåŽå°ä»»åŠ¡ã€‚ä¸‹è¡¨ä¸ä¸ºä¸€äº›å¸¸è§çš„实现。 .. list-table:: :header-rows: 1 - * è¯è¨€ * 实现方案 - * PHP * :doc:`../php/background-jobs-with-resque` - * Python * :doc:`../python/background-jobs-with-rq`