0Pricing
AI Agents · บทเรียน

เวิร์กโฟลว์แบบไม่พร้อมกันและงานเบื้องหลัง

เอเจนต์ที่ทำงานยาวนานต้องใช้คิว เช่น Celery, RQ และ Temporal ให้ส่งคืนรหัสงานแล้วตรวจสอบสถานะเป็นระยะ

เวิร์กโฟลว์แบบไม่พร้อมกันและงานเบื้องหลัง เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Agents และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

บางส่วนของบทเรียนนี้ยังไม่ได้รับการแปล และแสดงเป็นภาษาอังกฤษ

เมื่อรอบคำขอช้าเกินไป

งานของเอเจนต์บางอย่างใช้เวลา 30 วินาที, 5 นาที หรือหลายชั่วโมง คุณไม่สามารถเปิดการเชื่อมต่อ HTTP ค้างไว้ได้ โปรดย้ายงานเหล่านี้ไปทำเป็นงานเบื้องหลังแบบอะซิงโครนัส

รูปแบบการทำงาน

  1. ไคลเอนต์ส่งคำขอ POST สำหรับงาน -> เซิร์ฟเวอร์สร้างงานและส่งคืน job_id
  2. Worker รับงานจากคิว
  3. ไคลเอนต์เรียก GET /jobs/{id} เพื่อตรวจสอบสถานะเป็นระยะ
  4. เมื่อเสร็จแล้ว เซิร์ฟเวอร์จะส่งคืนผลลัพธ์

Submit Endpoint

from uuid import uuid4

@app.post('/jobs')
def submit(req: AgentRequest):
    job_id = str(uuid4())
    redis.hset(f'job:{job_id}', mapping={'status': 'queued', 'user_id': req.user_id})
    queue.enqueue('run_agent_job', job_id, req.query)
    return {'job_id': job_id, 'status': 'queued'}

Status Endpoint

@app.get('/jobs/{job_id}')
def status(job_id: str):
    data = redis.hgetall(f'job:{job_id}')
    if not data:
        raise HTTPException(404)
    return {
        'status': data['status'],
        'result': data.get('result'),
        'error': data.get('error')
    }

Worker

กระบวนการแยกต่างหากจะดึงงานจากคิว:

def run_agent_job(job_id, query):
    redis.hset(f'job:{job_id}', 'status', 'running')
    try:
        result = run_agent(query)
        redis.hset(f'job:{job_id}', mapping={'status': 'done', 'result': result})
    except Exception as e:
        redis.hset(f'job:{job_id}', mapping={'status': 'failed', 'error': str(e)})

ตัวเลือกคิว

  • RQ (Redis Queue) — Python แบบเรียบง่าย
  • Celery — เครื่องมือ Python แบบดั้งเดิมที่มีคุณสมบัติมากมาย
  • Temporal — เวิร์กโฟลว์ที่ทนทาน การลองใหม่ และการตรวจสอบการทำงาน
  • Dramatiq — ทางเลือกแทน Celery
  • Cloud-native — Cloud Tasks, SQS, Pub/Sub

Temporal สำหรับเวิร์กโฟลว์ที่ทนทาน

เวิร์กโฟลว์ของเอเจนต์มีสถานะ Temporal เหมาะอย่างยิ่งกับรูปแบบการประมวลผลที่ทนทาน:

import temporalio

@temporalio.workflow.defn
class AgentWorkflow:
    @temporalio.workflow.run
    async def run(self, query: str) -> str:
        plan = await workflow.execute_activity(plan_step, query, schedule_to_close_timeout=timedelta(minutes=2))
        results = await workflow.execute_activity(execute_step, plan, schedule_to_close_timeout=timedelta(minutes=10))
        return await workflow.execute_activity(synthesise_step, results)

การอัปเดตบางส่วนแบบสตรีม

งานที่ใช้เวลานานจะได้ประโยชน์จากการอัปเดตความคืบหน้า โปรดใช้เหตุการณ์ที่ส่งจากเซิร์ฟเวอร์หรือ WebSockets:

@app.get('/jobs/{job_id}/stream')
def stream_progress(job_id):
    def gen():
        while True:
            update = redis.brpop(f'updates:{job_id}', timeout=30)
            if not update:
                yield 'data: {"status": "timeout"}\n\n'
                break
            yield f'data: {update[1].decode()}\n\n'
            if 'done' in update[1].decode():
                break
    return StreamingResponse(gen(), media_type='text/event-stream')

อายุการใช้งานของงาน

อย่าเก็บระเบียนงานไว้ตลอดไป:

redis.expire(f'job:{job_id}', 86400)   # 1 day

การลองใหม่

ความล้มเหลวชั่วคราวจะถูกลองใหม่โดยอัตโนมัติ ส่วนความล้มเหลวถาวรจะถูกส่งไปยัง DLQ เพื่อให้มนุษย์ตรวจสอบ:

import time

def retry(retries=3, retry_backoff=True):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for attempt in range(1, retries + 1):
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    print(f'attempt {attempt} failed: {e}')
                    if attempt == retries:
                        raise
            return None
        return wrapper
    return decorator

attempts = {'n': 0}

@retry(retries=3, retry_backoff=True)
def run_agent_job(job_id):
    attempts['n'] += 1
    if attempts['n'] < 3:
        raise RuntimeError('transient error')
    return f'job {job_id} done'

print(run_agent_job('job-1'))

ขีดจำกัดการทำงานพร้อมกัน

เพื่อควบคุมค่าใช้จ่ายของ GPU/API โปรดจำกัดจำนวน Worker ที่ทำงานพร้อมกัน:

rq worker --burst --max-jobs 1000 --queue agent

# Or per-queue concurrency in Temporal worker config.

โควตาต่อผู้ใช้

ติดตามจำนวนงานที่กำลังดำเนินการของผู้ใช้แต่ละราย:

key = f'inflight:{user_id}'
if redis.scard(key) >= 5:
    raise HTTPException(429, 'Too many in-flight jobs')
redis.sadd(key, job_id)

การตรวจสอบการทำงาน

ติดตามงานแต่ละงานตั้งแต่ต้นจนจบ กำกับช่วงการทำงานด้วย job_id และ user_id งานที่ล้มเหลวควรเปิดตั๋วหรือส่งการแจ้งเตือนโดยอัตโนมัติ

รูปแบบการตรวจสอบสถานะเป็นระยะ

เหตุใดจึงใช้รูปแบบส่งงานและตรวจสอบสถานะเป็นระยะสำหรับเอเจนต์ที่ทำงานนาน

สรุปทบทวน

ส่งงานด้วย POST ส่งคืน id แล้วให้ Worker ประมวลผลจากคิว จากนั้นไคลเอนต์ตรวจสอบสถานะเป็นระยะ ใช้ RQ/Celery สำหรับเวิร์กโฟลว์ง่าย ๆ และใช้ Temporal สำหรับเวิร์กโฟลว์ที่มีสถานะ พร้อมกำหนดอายุการใช้งาน การลองใหม่ โควตา และการติดตามร่องรอย

คำถามที่พบบ่อย

บทเรียน “เวิร์กโฟลว์แบบไม่พร้อมกันและงานเบื้องหลัง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “เวิร์กโฟลว์แบบไม่พร้อมกันและงานเบื้องหลัง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Agents ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “เวิร์กโฟลว์แบบไม่พร้อมกันและงานเบื้องหลัง”

เอเจนต์ที่ทำงานยาวนานต้องใช้คิว เช่น Celery, RQ และ Temporal ให้ส่งคืนรหัสงานแล้วตรวจสอบสถานะเป็นระยะ คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Agents หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Agents บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “เวิร์กโฟลว์แบบไม่พร้อมกันและงานเบื้องหลัง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน AI Agents นี้ได้ไหม

ได้ บทเรียน AI Agents ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การให้บริการเอเจนต์ผ่าน API
  2. เวิร์กโฟลว์แบบไม่พร้อมกันและงานเบื้องหลัง
  3. การจำกัดอัตราและการจัดการโควตา
  4. การนำเอเจนต์ขึ้นระบบแบบบลู-กรีนและคานารี
← กลับไปที่ AI Agents