Кнопка круціцца, у закладцы паказваецца памылка, і форма, якую вы запаўнялі дзесяць хвілін, знікла. Вы не ведаеце, ці паспеў запіс да таго, як злучэнне абарвалася. Менавіта стаўленне да гэтай невядомасці як да правалу стварае дублікаты каментароў, падвойныя заказы і паўторныя звароты ў падтрымку.

Аднаўляйце ў пэўным парадку: захавайце тэкст, знайдзіце вынік і толькі пасля гэтага вырашайце, ці дазволена другая адпраўка.

Пачніце з тэксту і адзнакі часу

Скапіруйце змесціва са старонкі, перш чым чапаць што-небудзь яшчэ, уключаючы любы чарнавік, які браўзер яшчэ трымае ў полі. Запішыце час, старонку, на якой вы былі, і дзеянне, якое вы зрабілі, бо менавіта гэтыя тры падрабязнасці робяць магчымым усё астатняе расследаванне. Калі закладка яшчэ адкрыта, пакіньте яе адкрытай, пакуль не прачытаеце запіс сеткі. Захаваць тэкст нічога не каштуе, а страціць яго — значыць страціць усю задачу.

Затым аддзяліце дзве формы збою, якія вы сапраўды можаце назіраць. Злучэнне, што абарвалася пасярэдзіне запыту, і сервер, які адказаў памылкай, выглядаюць у сеткавай панэлі па-рознаму, і толькі другое гаворыць нешта пра рашэнне праграмы.

Шукайце вынік ва ўласным прадстаўленні праграмы

Перазагрузіце прадстаўленне для чытання, якое паказала б вынік: спіс каментароў, гісторыю заказаў, чаргу зваротаў або запіс, які вы рэдагавалі. Супастаўляйце па ўліковым запісе, месцы прызначэння, часе і змесціве, а не па самым новым запісе, бо нехта іншы мог напісаць пасля вас. Для фонавай задачы шукайце існуючую спасылку і яе стан замест таго, каб ствараць новую аперацыю як праверку сувязі.

Калі вынік ёсць, вы скончылі, і памылка адносіцца да шляху адказу, а не да запісу. Калі яго няма, не выключайце магчымасць, што праграма яшчэ не зафіксавала яго: задача ў чарзе, затрыманае прадстаўленне для чытання або адстаючая рэпліка могуць некаторы час хаваць паспяховы запіс.

Дайце яму вызначаны другі погляд, перш чым рабіць выснову, і запішыце час абодвух праверак. Дзве праверкі з інтэрвалам у дваццаць секунд — значна слабейшы доказ, чым дзве праверкі з інтэрвалам у дзесяць хвілін.

Вырашыце, ці бяспечная другая адпраўка

Адказ залежыць ад аперацыі, а не ад вашага цярпення. HTTP аддзяляе метады, якія можна паўтараць з тым жа меркаваным эфектам, ад тых, якія нельга, і раіць пазбягаць аўтаматычных паўтораў другога тыпу, калі толькі не вядома, што семантыка гэта дазваляе. Стварэнне каментара, размяшчэнне заказу і адпраўка плацяжу звычайна адносяцца да другой групы, таму другі клік, які выглядае паспяховым, нічога не кажа пра першы.

Калі вы падтрымліваеце кліент, выкарыстоўвайце механізм паўтору або ідэмпатэнтнасці, які апісвае API, і прывязвайце яго да той жа лагічнай аперацыі, а не стварайце новы ключ для кожнай спробы. Ідэнтыфікатар запыту, які выкарыстоўваецца для трасіроўкі, не з'яўляецца ключом падаўлення дублікатаў, калі сервер не ставіцца да яго як да такога.

curl -i -X POST https://api.example.net/v1/orders \
  -H "Idempotency-Key: 6f1c2a94-3b7e-4a10-9c22-5d0e8f7b1a63" \
  -H "Content-Type: application/json" \
  --data @order.json

Ключ дапамагае, толькі калі служба захоўвае яго разам з аперацыяй і вяртае зыходны вынік пры паўторы. Праверце гэтыя паводзіны на тэставым пункце, перш чым спадзявацца на яго ў прадукцыі.

Збірайце доказы, перш чым зноў нешта націснуць

Захоўвайце запіс сеткі, а не здымак экрана з памылкай. Метад запыту, URL, адказ або тайм-аут і час, калі гэта адбылося, — гэта тое, што адміністратар можа суаднесці з запісамі праграмы. Экспартуйце або капіруйце запіс як каманду, толькі калі потым выдаліце з копіі кукі, загалоўкі аўтарызацыі і любы прыватны змест. Пакіньте ўласную сесію цэлай і ніколі не паўтарайце перахоплены запыт з уліковымі данымі як кароткі шлях.

Спытайце ўладальніка службы адно канкрэтнае пытанне: ці ўдалася аперацыя з гэтым змесцівам у гэты час і ці ёсць для яе спасылка? На гэтае пытанне ёсць адказ, а на "ці зламаўся сайт" — няма.

Сэнс гэтага практыкавання — устанавіць, што дзеянне адбылося роўна адзін раз. Паведамленне пра памылку, якое можна закрыць, не тое ж самае, што запіс, якому можна давяраць, і менавіта другое патрэбна вам, перш чым адпраўляць што-небудзь яшчэ.

Падобныя артыкулы