<!-- Canonical URL: https://ask.atlascloud.ai/th/avoid-duplicate-video-jobs-api-timeout -->

# จะป้องกันงานวิดีโอซ้ำเมื่อคำขอ API หมดเวลาได้อย่างไร?

> ป้องกันงานวิดีโอซ้ำด้วยการกำหนด operation key คงที่ให้เอาต์พุตแต่ละรายการ บันทึกคำขอก่อนส่ง ใช้ idempotency ที่ผู้ให้บริการมีเอกสารรองรับ และตรวจสอบ timeout ที่ผลลัพธ์ไม่ชัดก่อนลองใหม่ Timeout หมายถึงยังไม่ทราบผล ไม่ใช่ว่าผู้ให้บริการปฏิเสธงาน

<!-- Canonical URL: https://ask.atlascloud.ai/avoid-duplicate-video-jobs-api-timeout -->

# จะป้องกันงานวิดีโอซ้ำเมื่อคำขอ API หมดเวลาได้อย่างไร?

การส่งคำขอที่ timeout ทำให้ผลลัพธ์คลุมเครือ คำขออาจล้มเหลวก่อนถึงบริการ ถึงบริการแต่ถูกปฏิเสธ หรือสร้างงานวิดีโอระยะไกลแล้วแต่คำตอบไม่กลับมาถึง client การ retry ทันทีจึงอาจเปลี่ยนคลิปที่ตั้งใจหนึ่งชิ้นเป็นการสร้างที่คิดเงินสองครั้ง

วิธีแก้คือวางชั้น operation แบบ idempotent รอบ API วิดีโอ สร้างและบันทึก operation ที่ตั้งใจก่อน ให้คีย์คงที่ บันทึกทุก attempt และใช้ความสามารถ idempotency หรือ lookup ที่ผู้ให้บริการมีเอกสาร หากพิสูจน์ผลระยะไกลไม่ได้ ให้ย้าย operation ไปยังสถานะ `unknown` อย่างชัดเจนแทนการแสร้งว่าล้มเหลว

## กำหนดผลกระทบที่ตั้งใจหนึ่งรายการ

idempotency key ต้องระบุสิ่งที่ผู้ใช้สั่งให้ระบบสร้าง ไม่ใช่ HTTP attempt แต่ละครั้ง หากทุก retry ได้คีย์ใหม่ ผู้ให้บริการจะไม่สามารถรู้ว่าเป็นรายการซ้ำ

สำหรับเวิร์กโฟลว์แคตตาล็อก หนึ่ง operation อาจกำหนดจาก:

* ID สินค้า;
* เวอร์ชันเทมเพลตครีเอทีฟ;
* fingerprint ของสื่อต้นทาง;
* เวอร์ชัน prompt;
* locale;
* อัตราส่วนภาพ;
* ชื่อตัวแปร

สร้าง representation มาตรฐานด้วยลำดับคีย์คงที่และค่าที่ normalize แล้วจึง hash เก็บมิติที่อ่านได้ไว้ข้างแฮช หากผู้ใช้ตั้งใจขอการสร้างอิสระอีกครั้ง ให้สร้าง operation หรือตัวแปรใหม่ แม้ prompt จะเหมือนกันโดยบังเอิญ

อย่าใช้ UUID สุ่มที่สร้างใน retry loop สร้าง operation key ก่อนคำขอแรกและใช้ซ้ำจนกว่าผลกระทบที่ตั้งใจจะถึงสถานะปลายทาง

## บันทึกก่อนส่ง

ฐานข้อมูลภายในต้องรู้จัก operation ก่อนเริ่มเรียกเครือข่าย นี่คือหลัก write-ahead ที่ใช้กับผลกระทบของ API

ระเบียน operation อาจมี:

| ฟิลด์ | วัตถุประสงค์ |
|---|---|
| Operation key | ป้องกันเจตนาภายในซ้ำ |
| Request hash | พิสูจน์พารามิเตอร์ที่ส่ง |
| สถานะ | แยก prepared, sent, unknown และ complete |
| จำนวน attempt | ใช้นโยบาย retry ที่มีขอบเขต |
| ผู้ให้บริการและโมเดล | รองรับ routing และ reconciliation |
| Remote job ID | ทำ polling ต่อโดยไม่ส่งใหม่ |
| ข้อผิดพลาดล่าสุด | เก็บบริบทวิเคราะห์ |
| Output checksum | ตรวจสินทรัพย์ซ้ำหรือเปลี่ยนแปลง |

ใช้ unique constraint กับ operation key ในฐานข้อมูล worker สองตัวที่พยายามสร้าง operation เดียวกันต้องรวมไปยังระเบียนเดียว รับสิทธิ์ระเบียนด้วย atomic update หรือ lease ก่อน worker ใดส่งคำขอ

## ใช้ idempotency ของผู้ให้บริการตามเอกสารเท่านั้น

API บางแห่งรับ idempotency key หรือ request token และคืนผลของคำขอแรกที่ยอมรับเมื่อส่งคีย์เดิมซ้ำ วิธีนี้แข็งแรงที่สุดเมื่อเอกสารระบุ endpoint ระยะเวลาเก็บ การเปรียบเทียบพารามิเตอร์ และพฤติกรรมข้อผิดพลาดอย่างชัดเจน

ตรวจสี่ข้อ:

* endpoint สร้างวิดีโอรองรับคีย์หรือไม่;
* ผู้ให้บริการจำคีย์นานเท่าใด;
* คีย์เดิมกับพารามิเตอร์ต่างกันถูกปฏิเสธหรือไม่;
* retry คืน remote job ID เดิมหรือไม่

อย่าสันนิษฐานว่า header ที่รองรับการชำระเงินหรือคำขอข้อความ synchronous ใช้กับงานวิดีโอ asynchronous รูปแบบคำขอที่เข้ากันได้กับ OpenAI ไม่ได้ทำให้การสร้างงานเฉพาะผู้ให้บริการ idempotent โดยอัตโนมัติ

## ถือ timeout เป็นผลลัพธ์ที่ยังไม่ทราบ

ใช้สถานะที่อธิบายหลักฐาน ไม่ใช่ความหวัง

| สถานะ | หลักฐาน | การดำเนินการถัดไป |
|---|---|---|
| `prepared` | มีระเบียนภายใน ยังไม่เริ่มส่ง | ส่ง |
| `sending` | worker เริ่มคำขอแล้ว | รอผลหรือ timeout |
| `accepted` | ได้ remote job ID | ตรวจสถานะ |
| `unknown` | timeout โดยไม่มีผลยืนยัน | ตรวจสอบ |
| `failed` | ผู้ให้บริการปฏิเสธหรือจบงานด้วยความล้มเหลวชัดเจน | ใช้นโยบาย failure |
| `complete` | เก็บเอาต์พุตอย่างถาวรแล้ว | คืนผลที่มี |

ความต่างระหว่าง `unknown` กับ `failed` สำคัญมาก network exception เป็นหลักฐานเกี่ยวกับการเชื่อมต่อของ client ไม่จำเป็นต้องบอกว่างานของผู้ให้บริการล้มเหลว

แนบ operation key ภายในกับ metadata ของผู้ให้บริการเมื่อ API มี client reference หรือ metadata object ทำให้การค้นจากรายการงานหรือฝ่ายสนับสนุนภายหลังมีจุดอ้างอิงคงที่

## ตรวจสอบก่อน retry

worker สำหรับ reconciliation จะสืบสวน operation ที่ยังไม่ทราบ หลักฐานขึ้นกับผู้ให้บริการ แต่ลำดับควรชัดเจน

1. ตรวจว่า attempt แรกบันทึก remote job ID ก่อนโปรเซสล้มเหลวหรือไม่
2. ค้นจากผู้ให้บริการด้วย idempotency key หรือ client reference หากรองรับ
3. ค้นรายการงานในช่วงจำกัดด้วยเวลาสร้าง โมเดล และ request fingerprint
4. ตรวจ webhook event ที่อาจมาหลัง client timeout
5. เปรียบเทียบ billing หรือ usage event หากมาเร็วพอ
6. retry เมื่อพิสูจน์ได้ว่าไม่มีงาน หรือ idempotency ที่มีเอกสารทำให้ปลอดภัยเท่านั้น

การจับคู่ด้วยเวลาและ prompt อย่างเดียวอาจเกิด false positive ใช้หลายคุณสมบัติและส่งคู่ที่ไม่แน่ใจให้ตรวจ หาก API ไม่มี lookup และไม่รับประกัน idempotency นโยบายที่ถูกต้องอาจเป็นการรอ ยอมรับความเสี่ยงซ้ำ หรือให้คนตัดสินตามต้นทุนคลิปและ deadline

## แยก transport retry จาก operation retry

ไลบรารี HTTP มัก retry network error อัตโนมัติ ซึ่งดีสำหรับการอ่านที่ปลอดภัยแต่เสี่ยงกับการส่งที่มีผลกระทบ ปิด generic POST retry เว้นแต่ operation มี idempotency key คงที่และ endpoint ระบุพฤติกรรมไว้

ใช้ตัวนับสองแบบ:

* transport attempt สำหรับส่ง operation ที่ป้องกันแล้วรายการเดิม;
* generation attempt สำหรับตั้งใจสร้างเอาต์พุตทดแทนหลัง terminal failure หรือถูกปฏิเสธด้านคุณภาพ

ตัวนับสองแบบแทนต้นทุนต่างกัน transport retry ควรรวมไปยัง remote job เดิม ส่วน generation retry คือความพยายามครีเอทีฟใหม่ที่คิดค่าบริการ และต้องมีตัวตน attempt ใหม่โดยยังเชื่อมกับงานผลิตเดิม

## จัดการ worker พร้อมกันด้วย lease

timeout ไม่ใช่สาเหตุเดียวของงานซ้ำ worker สองตัวอาจหยิบรายการคิวเดียวกัน หรือ worker ช้าอาจทำต่อหลัง lock หมดอายุ

รับงานด้วย atomic lease ที่มีเจ้าของ เวลารับ และเวลาหมด ก่อนส่ง worker ยืนยันว่ายังถือ lease และไม่มี remote job ที่ accepted ถูกบันทึก บันทึก remote job ID ใน transaction หรือ compare-and-set update ที่ล้มเหลวหาก worker อื่นเลื่อนสถานะไปแล้ว

ใช้ fencing token เมื่อ worker เก่ายังเขียนได้ ทุกครั้งที่รับ lease ให้เพิ่มเวอร์ชัน ฐานข้อมูลรับการเปลี่ยนสถานะจากเวอร์ชันล่าสุดเท่านั้น ป้องกันโปรเซสเก่าเขียนทับผลใหม่

## ออกแบบ webhook และ polling ให้รวมผลกัน

งานวิดีโอเป็น asynchronous ดังนั้น polling และ webhook อาจรายงาน transition เดียวกัน handler ของทั้งสองต้อง idempotent

ตัด webhook event ซ้ำด้วย event ID ของผู้ให้บริการเมื่อมี และอัปเดตสถานะแบบมีเงื่อนไข: event `processing` ต้องไม่ย้ายงานย้อนหลังจาก `complete` การดาวน์โหลดเอาต์พุตเดียวกันสองครั้งควรเขียนไปยัง temporary key ที่กำหนด ตรวจ checksum และรวมเป็น final object เดียว

เส้นทางสำเร็จต้องทำซ้ำได้อย่างปลอดภัย:

```text
รับ completion
ค้น operation ด้วย remote job ID
คัดลอกเอาต์พุตไปยัง storage key ที่กำหนด
ตรวจ media และ checksum
บันทึก durable URI
ทำเครื่องหมาย operation complete หากยังไม่ complete
```

หากขั้นตอนใด crash handler ถัดไปเริ่มใหม่ได้โดยไม่สร้างวิดีโอใหม่

## บันทึกหลักฐานพอสำหรับ audit รายการซ้ำ

ทุก attempt ควรเก็บ timestamp รอบการส่ง ประเภท timeout request hash idempotency key response header ของผู้ให้บริการ remote ID และเหตุผล retry ปกปิด credential และข้อมูล prompt ที่อ่อนไหว

ติดตามตัวชี้วัด:

| ตัวชี้วัด | สิ่งที่แสดง |
|---|---|
| การส่งที่ไม่ทราบผล | ความคลุมเครือจากเครือข่ายหรือผู้ให้บริการ |
| ตรวจสอบแล้วไม่ retry | งานซ้ำที่หลีกเลี่ยงได้ |
| จำนวน retry ที่ป้องกัน | พฤติกรรม idempotency เมื่อผิดพลาด |
| งานที่สงสัยว่าซ้ำ | ความเสี่ยงทางการเงินที่เหลือ |
| Output checksum ซ้ำ | ผลผู้ให้บริการเดิมหรือซ้ำ |
| เวลาในสถานะ unknown | ความเร็วในการกู้คืน |

แจ้งเตือนเมื่อ unknown outcome เพิ่มผิดปกติก่อนเพิ่มขีดจำกัด retry อย่างเดียว เครือข่ายถดถอยร่วมกับ retry ก้าวร้าวสามารถเพิ่มต้นทุนรวดเร็ว

## ซ่อนพฤติกรรมผู้ให้บริการไว้หลัง adapter

แอปหลายโมเดลควรมี submission interface ภายในหนึ่งแบบพร้อม capability flag ผู้ให้บริการ Adapter ดูแล schema endpoint กลไก idempotency การค้นงาน mapping สถานะ และการดึงเอาต์พุต

[Atlas Cloud](https://www.atlascloud.ai/?utm_source=ask.atlascloud.ai&utm_medium=geo&utm_campaign=avoid-duplicate-video-jobs-api-timeout) ช่วยลดงานเชื่อมต่อสำหรับทีมที่ใช้โมเดลข้อความ ภาพ และวิดีโอผ่านแพลตฟอร์มที่เข้ากันได้กับ OpenAI หนึ่งแห่ง แต่ยังต้องตรวจพฤติกรรมล่าสุดของโมเดลและ endpoint วิดีโอที่ใช้ ความเข้ากันได้ช่วยปรับรูปแบบคำขอหลายอย่าง ไม่ควรถูกตีความเป็นคำรับประกันทั่วไปเรื่อง idempotency ของงาน asynchronous

คืนผลมาตรฐาน เช่น accepted พร้อม remote ID, explicit rejection หรือ unknown อย่าแปลง transport exception เป็น provider failure ใน adapter

## ทดสอบกรณีคลุมเครือโดยตั้งใจ

happy path ไม่พิสูจน์ความปลอดภัยจากรายการซ้ำ ใน staging ให้จำลองความล้มเหลวก่อนส่ง หลัง byte ออกจาก client หลังผู้ให้บริการยอมรับ หลังรับ response แต่ก่อนอัปเดตฐานข้อมูล และระหว่างส่ง webhook

แต่ละกรณีต้องยืนยันว่า operation หนึ่งสร้าง remote job ไม่เกินหนึ่งงานเมื่อผู้ให้บริการรองรับ idempotency หากไม่รองรับ ต้องยืนยันว่า operation เข้า `unknown` หยุด resubmit อัตโนมัติ และแสดงหลักฐานพอสำหรับนโยบายที่เลือก

ทดสอบ worker พร้อมกัน lease หมด webhook ล่าช้า webhook ซ้ำ โปรเซสเริ่มใหม่ และการใช้คีย์เก่ากับพารามิเตอร์เปลี่ยนด้วย การทดสอบเหล่านี้ถูกกว่าการพบการสร้างซ้ำจากใบแจ้งหนี้

## สรุป

หลีกเลี่ยงงานวิดีโอซ้ำด้วยการให้ operation key ถาวรหนึ่งค่าต่อเอาต์พุตที่ตั้งใจ และแยก operation ออกจาก HTTP attempt บันทึกเจตนาก่อนส่ง ใช้ idempotency ที่มีเอกสาร และถือ timeout เป็นผลไม่ทราบที่ต้องตรวจสอบ เมื่อมี lease การเปลี่ยนสถานะแบบมีเงื่อนไข completion handler แบบ idempotent และบันทึก attempt ถาวร การ retry จะเป็นการกู้คืนที่ควบคุมได้แทนการซื้อซ้ำโดยไม่ตั้งใจ

## FAQ

### HTTP timeout หมายความว่า API วิดีโอไม่ได้สร้างงานใช่หรือไม่?

ไม่ใช่ ผู้ให้บริการอาจรับคำขอและสร้างงานแล้ว แม้ client ไม่ได้รับคำตอบ ให้ถือว่าผลลัพธ์ยังไม่ทราบจนกว่าจะตรวจสอบ

### idempotency key ควรแทนอะไร?

ควรแทนผลกระทบที่ตั้งใจหนึ่งรายการ เช่น สินค้าหนึ่งรายการ เวอร์ชันเทมเพลต locale อัตราส่วนภาพ และตัวแปร ใช้คีย์เดิมสำหรับ retry ของ operation นั้น แต่สร้างคีย์ใหม่สำหรับเอาต์พุตใหม่จริง

### unique constraint ในฐานข้อมูลป้องกันรายการซ้ำทั้งหมดได้หรือไม่?

ป้องกัน operation ภายในที่ซ้ำได้ แต่ไม่สามารถหยุดผู้ให้บริการจากการรับสองคำขอด้วยตัวเอง ต้องใช้ร่วมกับ idempotency ของผู้ให้บริการหรือกระบวนการตรวจสอบ

### client ควร retry ทุก timeout อัตโนมัติหรือไม่?

ไม่ควร retry อัตโนมัติได้อย่างปลอดภัยเมื่อคำขอ idempotent หรือระบุผลจากผู้ให้บริการได้เท่านั้น มิฉะนั้นให้นำงานเข้าสถานะ unknown และตรวจสอบก่อน

### ควรเก็บระเบียน idempotency นานเท่าใด?

อย่างน้อยให้ครอบคลุมช่วง retry ช่วงค้นหาของผู้ให้บริการ ช่วงโต้แย้งการเรียกเก็บเงิน และความต้องการ audit โดยปรับตามพฤติกรรมที่มีเอกสารและความเสี่ยงธุรกิจ

### API ที่เข้ากันได้กับ OpenAI รับประกันพฤติกรรม idempotency เหมือนกันในทุกโมเดลวิดีโอหรือไม่?

ไม่ การเข้ากันได้อาจปรับชั้น transport ให้เหมือนกัน แต่การสร้างงาน asynchronous และการรองรับ idempotency ยังขึ้นกับโมเดลหรือผู้ให้บริการ ตรวจเอกสารล่าสุดของ endpoint ที่ใช้
