Uplonic Logo

Duplikált posztok elkerülése közösségi média API-ban 2026-ban: idempotencia és retry

Az elveszett HTTP-válasz nem jelenti azt, hogy a poszt nem jött létre. Megmutatjuk, miért okoz duplikált posztot a naiv HTTP-retry, és hogyan védi ki az Uplonic az Idempotency-Key fejléccel, a csatornánkénti task-kényszerrel, a pre-commit hibabesorolással és az unknownOutcome kapuval.

Duplikált posztok elkerülése közösségi média API-ban 2026-ban: idempotencia és retryAI
Ebben a cikkben

A duplikált közösségi média posztok elkerüléséhez két különböző hibahatárt kell külön kezelned: a kliens és az API közötti beküldési újrapróbálásokat (amelyeket az Idempotency-Key fejléc és az adatbázis unique indexei védenek), valamint a worker és a célplatform közötti publikálási újrapróbálásokat (ahol csak a tartalom létrehozása előtti, úgynevezett pre-commit lépéseket szabad automatikusan megismételni). Ha a hálózati kapcsolat a végső közzétételi hívás közben szakad meg az Instagram, a TikTok, a Facebook vagy a LinkedIn felé, a kimenetel ismeretlen — az automatikus újrapróbálás pedig kétszer teheti ki ugyanazt a videót.

Ha most állítod össze a többplatformos közzétételi folyamatodat YouTube-ra, TikTokra és Instagramra, vagy a TikTok Content Posting API útmutatónkat (angolul) követed, ez a cikk azt az adatbázis-, sor- és retry-architektúrát mutatja be, amely megakadályozza, hogy egy hálózati hiba duplikált posztot okozzon.

Miért posztol kétszer a naiv HTTP-újrapróbálás?

Ahogy az RFC 9110 9.2.2-es szakasza rögzíti, a POST nem idempotens HTTP-metódus: egy POST kérés megismétlése kapcsolatbomlás vagy gateway timeout után nem garantálja, hogy a szerver csak egyszer hajtja végre a műveletet. A közösségi média publikálásban egyetlen poszt két hálózati szakaszon halad át:

  1. A saját alkalmazásod és a publikáló API között: Az n8n-folyamatod, a háttérfolyamatod vagy a szervered meghívja a POST /uploads/start vagy a POST /videos/import végpontot. Ha egy proxy 502 Bad Gateway hibát ad, vagy a kliens időtúllépést érzékel, miután a szerver már elmentette a tranzakciót, a vakon újrapróbálkozó kliens második publikálási kérést hoz létre.

  2. A publikáló worker és a közösségi platform között: Az Uplonic workere feltölti a videóbájtokat, majd elküldi a végső közzétételi kérést a TikTok, az Instagram, a Facebook, a YouTube vagy a LinkedIn felé. Ha az Instagram media_publish vagy a Facebook reel_finish hívásának válasza közben ECONNRESET vagy ETIMEDOUT történik, a platform ettől még közzétehette a posztot.

Az a kérdés, hogy „átmeneti-e a hiba”, szükséges, de nem elégséges feltétel az automatikus újrapróbáláshoz. Ahogy az Uplonic retry-szabályzata kimondja, a valódi kérdés így szól: bizonyítható-e, hogy a platformon nem jött létre tartalom?

1. védelmi vonal: Kliensszintű idempotencia az importnál és a publikálásnál

Az első hálózati szakaszon úgy állítható meg a duplikáció, ha a szerver felismeri az ismételt logikai kérést, és — még két egyidejű kérés versenyhelyzetében is — az eredeti rekordot adja vissza. Az Uplonic ezt mind a videóimportnál, mind a publikálási sornál adatbázis-szinten kényszeríti ki:

Végpont / Szolgáltatás

Idempotencia-bemenet

Adatbázis-kényszer és versenykezelés

Válasz ismételt híváskor

POST /uploads/start

Idempotency-Key vagy X-Idempotency-Key HTTP-fejléc (1–255 karakter).

Unique index az (appId, idempotencyKey) páron a PublishRequest táblán; előzetes lekérdezés + Prisma P2002 unique-ütközés elkapása párhuzamos hívásoknál.

HTTP 202 a meglévő publishRequestId-val, idempotent: true jelzéssel, újabb worker-ébresztés nélkül.

POST /videos/import és MCP import_videos

Tételenkénti idempotencyKey mező (8–200 karakter), belsőleg a hívó előtagjával (api:... vagy mcp:<grantId>:...) kiegészítve.

Unique index az (appId, idempotencyKey) páron a VideoImport táblán; azonos kötegen belüli duplikáció szűrése + P2002 kezelés.

A meglévő importsort adja vissza deduplicated: true értékkel, a forrás-URL újbóli letöltése nélkül.

Csatornánkénti taskok

A feloldott PlatformCredential.id célcsatornánként.

Unique kényszer a (publishRequestId, platformCredentialId) páron a PublishTask táblán, valamint SELECT ... FOR UPDATE sorzárolás az ütemezések szerkesztésekor.

Egy publikálási kérésen belül egy bekötött fiókra legfeljebb egyetlen task jöhet létre.

Amikor Idempotency-Key fejléccel küldesz kérést, a createPublishRequest egyetlen tranzakcióban menti el a PublishRequest és az összes PublishTask sort a HTTP 202 válasz előtt. Ha két párhuzamos újrapróbálás ugyanabban az ezredmásodpercben ér célba, az adatbázis unique indexe P2002 kóddal megállítja a másodikat, a hibakezelő ág pedig azonnal visszaadja a nyertes kérést deduplicated: true jelzéssel.

2. védelmi vonal: Pre-commit és commit műveletek szétválasztása a workerben

Miután a worker felvette a PublishTask feladatot, a kliens által küldött idempotenciakulcs már nem védi meg a külső platformhívást, mivel a legtöbb közösségi hálózat API-ja nem fogad idempotenciakulcsot posztlétrehozáskor. Ezért a decideRetry függvény azt vizsgálja, hogy a többlépéses feltöltés melyik műveleténél keletkezett a hiba.

Műveleti szakasz

Ellenőrzött műveletnevek

Miért biztonságos (vagy veszélyes) az automatikus retry?

Worker-döntés átmeneti hiba esetén

Platformhívás előtti előkészítés

beforePlatformCall: true (S3-letöltés, ffprobe, lokális előkészítés)

A közösségi platform még egyetlen kérést sem kapott.

decision: "retry" (automatikus backoff)

Pre-commit metaadat és munkamenet-nyitás

creator_info, upload_init, video_init, image_init, media_init, container_create, reel_init

A feltöltési munkamenet vagy konténer megnyitása önmagában, médiaátadás és lezáró hívás nélkül nem hoz létre posztot.

decision: "retry"

Pre-commit adatátvitel (chunkok)

chunk_upload*, video_chunk_upload, media_add, upload_transfer, reel_transfer

Befejezetlen fájlból a külön finish/publish lépés előtt nem lesz nyilvános poszt.

decision: "retry"

Határozott 429-es elutasítás elfogadás előtt

errorClass === "rate_limit" (HTTP 429), ha platformAccepted === false

A platform kifejezetten elutasította a kérést, mielőtt többlépéses művelet indult volna.

decision: "retry"

Egylépéses URL-publikálás vagy végső commit

pull_url_init (TikTok URL-lehúzás), upload_via_url (Facebook), reel_finish, video_post_create, Instagram/Threads media_publish

A hívás önmagában elindítja a közzétételt. Ha a válasz útközben elvész, a poszt már megjelenhetett.

decision: "fail" és unknownOutcome: true

Figyeld meg, miért hiányzik szándékosan a pull_url_init (a TikTok PULL_FROM_URL módja) és a Facebook upload_via_url művelete a PRE_COMMIT_OPERATION_PREFIXES listából. A darabolt fájlfeltöltéssel szemben ezek egyetlen hívással utasítják a platformot a videó letöltésére és közzétételére: ha a kapcsolat a válasz megérkezése előtt szakad meg, a megismételt hívás második posztot indítana el.

Hasonló védelem működik az Instagram és a Threads konténeres publikálásánál is: az Uplonic státuszlekérdezője a media_publish meghívása előtt ellenőrzi a konténer állapotát. Kizárólag FINISHED állapotú konténert publikál, a mutáló hívás előtt feltételes leaseOwner frissítéssel (extendPollClaim) hosszabbítja meg a foglalást, a már PUBLISHED állapotban lévő konténert pedig újabb media_publish hívás nélkül sikeresként zárja le.

3. védelmi vonal: Az unknownOutcome kezelése és a taskonkénti kézi újraindítás

Amikor egy task a commit határon túl, bizonytalan kimenetellel szakad meg, az Uplonic unknownOutcome = true jelzéssel állítja le az automatikus újrapróbálást. Amikor később a POST /uploads/requests/:id/retry végpontot hívod (retryPublishTasks), három szabály védi a fiókot:

  • Taskonkénti izoláció: Ha egy kérés YouTube-ra, TikTokra és Instagramra ment, és csak az Instagram bukott el, az újrapróbálás kizárólag az elbukott PublishTask sort teszi vissza a sorba — a sikeres csatornákhoz nem nyúl.

  • Megerősítési kapu ismeretlen kimenetelnél: Alapértelmezés szerint (confirmUnknownOutcome: false) a retryPublishTasks kihagyja az unknownOutcome: true taskokat, és a skipped[] tömbben adja vissza őket code: "unknown_outcome" és needsConfirmation: true jelzéssel. Csak akkor küldd el a confirmUnknownOutcome: true paramétert, ha ellenőrizted a célfiókot, és a poszt valóban nem jelent meg.

  • Előzetes állapotellenőrzés: Újraindítás előtt a retryPublishTasks azt is ellenőrzi, hogy a csatornakapcsolat aktív-e (platform_disconnected), és a médiafájl nem törlődött-e a megőrzési idő lejártával (media_deleted).

Ahhoz, hogy a végső kimeneteleket folyamatos lekérdezés (polling) nélkül kövesd, egészítsd ki az idempotens beküldést aláírt eseményértesítésekkel — erről szól a közösségi média publikálási webhookokat bemutató cikkünk és az API-integrációs szolgáltatásunk.

Források és módszertan

Módszertan: az RFC 9110 szabvány és a TikTok Direct Post dokumentációjának elsődleges forrásellenőrzése, valamint az Uplonic publikálási sorának, retry-szabályzatának, státuszlekérdezőjének, feltöltési végpontjainak és videóimport-szolgáltatásának forráskód-vizsgálata 2026. október 25-én.

MegosztásXLinkedInFacebook

A következő útmutató e-mailben

Útmutatók alkotóknak, kereseti adatok és azok a platform-változások, amik az elérésedet érintik. Legfeljebb havi két levél, bármikor leiratkozhatsz.

A videóid minden platformon, automatikusan.

Köss be minden fiókot, tervezz AI asszisztenssel, automatizálj Claude vagy Codex-el, és kövesd a posztokat egyetlen felületről.

Kezdés ingyen

TikTok
TikTok ütemezve18:00 · TikTok
Instagram
Instagram feltöltve3 feltöltés ma
Facebook
Ütemezés aktívKövetkező feltöltés: 18:00 · TikTok
Kéz egy okostelefonnal, rajta az Uplonic dashboard
Az Uplonic mobilon, a videó-ütemező felülettel