Nic nenalezeno

Záložní server

Záložní server je druhá adresa, na které běží tatáž API. Používá se, když se požadavek na portal.bulkgate.com vůbec nedostane k cíli — záložní host požadavek přijme a přepošle dál přes jinou trasu.

Jak je služba postavená

BulkGate běží na několika serverech ve třech geografických lokalitách. Vypadne-li některý z nich, provoz se automaticky přebere zbývajícími — z pohledu integrace se nemění nic a portal.bulkgate.com odpovídá dál. O tenhle případ se starat nemusíte. Celé uspořádání popisuje Infrastruktura.

Co tím pokryté není, je cesta k nám. Výpadek na trase mezi vaším serverem a naším — u operátora, poskytovatele připojení nebo kdekoli mezi tím — neovlivníme, a požadavek se k nám v takovém případě vůbec nedostane. Právě pro něj je záložní host.

Aktuální stav služby najdete na bulkgate.status.online.

Adresa

https://backup1.bulkgate.com

Host je zaměnitelný jedna ku jedné — cesty, parametry, přihlašovací údaje i odpovědi jsou shodné s portal.bulkgate.com. Stačí tedy v adrese vyměnit doménu:

https://portal.bulkgate.com/api/2.0/advanced/transactional https://backup1.bulkgate.com/api/2.0/advanced/transactional

Pracuje se stejným účtem, stejným tokenem i stejným kreditem. Nemusíte nic zakládat ani nikde přepínat.

Pozor

Nepoužívejte záložní host jako hlavní adresu. Kvůli údržbě může být kdykoli a bez předchozího upozornění odstavený — počítá se s tím, že přes něj jede provoz jen po dobu výpadku. portal.bulkgate.com musí v pořadí zůstat první.

Kdy se na něj přepnout

Důležité

Záložní host řeší výpadek spojení, ne chybu požadavku. Na požadavek, který API odmítlo, odpoví úplně stejně.

Přepněte, když požadavek nedojde k odpovědi:

situace přepnout?
Timeout spojení nebo čtení Ano
DNS se nepodařilo přeložit Ano
Spojení odmítnuto, síť nedostupná Ano
HTTP 5xx bez těla Ano
Odpověď s typem chyby (4xx) Ne
429 Too Many Requests (limity Ne

U posledních dvou API odpovědělo — požadavek dorazil a byl vyhodnocen. Zopakovat ho na záložním hostu vrátí tutéž chybu a jen spotřebuje další pokus z limitu.

Jak si failover zabudovat do integrace

Pořadí adres si držte v poli a zkoušejte je po sobě. Selže-li spojení, jde se na další; odpověděla-li API, výsledek se vrací tak jak je.

$hosts = ['portal.bulkgate.com', 'backup1.bulkgate.com']; foreach ($hosts as $host) { $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => "https://$host/api/2.0/advanced/transactional", CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 30, CURLOPT_HTTPHEADER => ['Content-Type: application/json'], CURLOPT_POSTFIELDS => json_encode([ 'application_id' => 451, 'application_token' => 'NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj', 'number' => ['420777777777'], 'text' => 'Your order 4517 has been shipped.', // Pojistka proti dvojímu odeslání, když první pokus vypršel, // ale zpráva se přesto odeslala — viz Na co si dát pozor. 'duplicates_check' => 'on', ], JSON_THROW_ON_ERROR), ]); $body = curl_exec($curl); $error = curl_error($curl); curl_close($curl); // Spojení selhalo — zkusit další adresu v pořadí. if ($body === false) { continue; } // API odpověděla, ať už úspěchem nebo chybou. Dál se nepřepíná. print_r(json_decode($body, true, flags: JSON_THROW_ON_ERROR)); break; } # pip install requests import requests hosts = ['portal.bulkgate.com', 'backup1.bulkgate.com'] for host in hosts: try: response = requests.post(f'https://{host}/api/2.0/advanced/transactional', json={ 'application_id': 451, 'application_token': 'NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj', 'number': ['420777777777'], 'text': 'Your order 4517 has been shipped.', 'duplicates_check': 'on', }, timeout=30) except requests.RequestException: continue # spojení selhalo, zkusit další adresu print(response.json()) break const hosts = ['portal.bulkgate.com', 'backup1.bulkgate.com']; for (const host of hosts) { let response; try { response = await fetch(`https://${host}/api/2.0/advanced/transactional`, { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ application_id: 451, application_token: 'NKN02TWE6NfBkfl-your-secret-token-Wf05GaqLIWLW4aBj', number: ['420777777777'], text: 'Your order 4517 has been shipped.', duplicates_check: 'on', }), }); } catch { continue; // spojení selhalo, zkusit další adresu } console.log(await response.json()); break; }

Na co si dát pozor

Upozornění

Timeout neznamená, že se zpráva neodeslala. Požadavek mohl dorazit a odpověď se cestou zpět ztratit — opakování na záložním hostu by pak zprávu odeslalo podruhé.

Proto u transakčních endpointů posílejte duplicates_check zapnutý. Zpráva se stejným textem na stejné číslo se v okně 5 minut zahodí, takže opakovaný pokus nic nezdvojí.

Důležité

U promočních endpointů duplicates_check proti opakování nepomůže — odstraňuje duplicity jen v rámci jedné dávky, ne napříč požadavky. Opakovaný požadavek je pro něj nová dávka a odejde celý znovu. U hromadných rozesílek proto raději opakujte až po ověření, jestli první pokus prošel.

Nastavte si rozumný timeout. Bez něj klient čeká na odpověď, která nepřijde, a k záložnímu hostu se vůbec nedostane.

Poznámka

Připravujeme idempotenci API — opakovaný požadavek půjde označit tak, aby ho API poznalo a vrátilo výsledek toho původního místo nového odeslání. Tím odpadne rozdíl mezi transakčními a promočními endpointy popsaný výš. Jakmile bude k dispozici, doplníme sem postup.

Byla tato stránka užitečná?