æ¶æ¯éå弿¥è§£è¦æ¨¡å¼ | AIçæåç¿»è¯
é®é¢ï¼ å¨åå¸å¼ç³»ç»ä¸ï¼æ¶æ¯éåçæ ¸å¿ä½¿ç¨æ¨¡å¼æ¯ä»ä¹ââç¹å«æ¯ä»»å¡ç产è å¯ä»¥åéåä¸ç®¡ï¼ç¨ååè½®è¯¢ç¶æ/ç»æï¼ä»è䏿¸¸è°ç¨æ¹ä¸ä¼é»å¡ï¼
åçï¼
æ¯çï¼å®å ¨æ£ç¡®ãè¿å°±æ¯å ¶åºæ¬ä»·å¼ä¸»å¼ ã让æè¯¦ç»è¯´æè¿äºæ¨¡å¼ã
æ ¸å¿æ¨¡å¼ï¼å¼æ¥è§£è¦
æ éåï¼åæ¥ï¼ï¼
ç产è
â [çå¾
...........] â æ¶è´¹è
宿 â ç产è
è·åç»æ
æéåï¼å¼æ¥ï¼ï¼
ç产è
â å
¥é(ä»»å¡) â ç«å³è·å task_id â 离å¼
â
æ¶è´¹è
ååºå¹¶å¤ç
â
ç»æåå¨å¨æä¸ªä½ç½®ï¼æ°æ®åºãRedis çï¼
ç¨åï¼
ç产è
â 轮询(task_id) â è·åç»æ
ç产è ä»ä¸é»å¡çå¾ æ¶è´¹è ã
ä¸ç§å模å¼
1. åéåä¸ç®¡ï¼æ éç»æï¼
queue.publish("send_email", {"to": "user@x.com", "body": "..."})
# 宿ï¼ä¸å
³å¿ç»æ
ç¨äºï¼éç¥ãæ¥å¿ãåæäºä»¶ãWebhooksã
2. å¸¦ç¶æè½®è¯¢ç弿¥
task_id = queue.publish("video_transcode", {"file": "input.mp4"})
# ç«å³å° task_id è¿åç»æç»ç¨æ·
# ç¨æ·ç¨å轮询
GET /tasks/{task_id}/status
â {"status": "processing", "progress": 42}
â {"status": "done", "result_url": "s3://..."}
è¿å°±æ¯ Celery + Redis çåæ³ãä»»å¡å æ°æ®ä»¥ task_id 为é®åå¨å¨ Redis ä¸ã
# Celery 示ä¾
result = transcode_video.delay("input.mp4") # ç«å³è¿å AsyncResult
task_id = result.id # å卿¤å¼
# ç¨å
result = AsyncResult(task_id)
result.state # PENDING / STARTED / SUCCESS / FAILURE
result.result # 宿åçè¿åå¼
3. åè° / Webhookï¼æ¨æ¨¡å¼èé轮询ï¼
queue.publish("ml_inference", {
"input": data,
"callback_url": "https://myservice/done"
})
# æ¶è´¹è
宿æ¶è°ç¨ callback_url
å®å ¨é¿å 轮询ãç¨äºæ¯ä»å¤çå¨ãStripe Webhooks çåºæ¯ã
为ä½è¿å¯¹åå¸å¼ç³»ç»å¾éè¦
éååæ¶è§£å³äºå¤ä¸ªé®é¢ï¼
确认æºå¶ï¼å ³é®ç»èï¼
ç产è å¯ä»¥å®å ¨â离å¼âçåå ï¼
1. æ¶è´¹è
ä»éåæåæ¶æ¯
2. éåæ è®°ä¸º"å¤çä¸"ï¼æä¸å é¤ï¼
3. æ¶è´¹è
å¤ç
4. æ¶è´¹è
åé ACK â éåå 餿¶æ¯
æè
æ¶è´¹è
å´©æº â éåè¶
æ¶ â æ¶æ¯éæ°å
¥é
è¿æä¾äºè³å°ä¸æ¬¡æéï¼ä¸çäº§è æ éä¿æåæ´»ã
å®é ææ¯æ 示ä¾
ç产è
ï¼API å¤çå¨ï¼
â
â¼
RabbitMQ / Kafka / SQS
â
â¼
工使± ï¼Celery workersãGo routines çï¼
â
â¼
ç»æå端ï¼Redis / Postgresï¼
â
â²
客æ·ç«¯éè¿ task_id 轮询
å¨ä½ çé¶è¡ AI å·¥ç¨åºæ¯ä¸ââè¿æ£æ¯ LLM æ¨çä»»å¡ãæ¥åçæãæ¹éè¯åæµæ°´çº¿ç工使¹å¼ãç¨æ·æäº¤ â è·å job_id â 轮询ãLLM è°ç¨ï¼ææ¶ 30-60 ç§ï¼æ°¸è¿ä¸ä¼é»å¡ HTTP å±ã
