Անավարտ պատկերներ պրոքսիի միջով. ստուգեք Netty-ի գրառման ավարտը
Երբ պատկերները պրոքսիի միջով գալիս են անավարտ, ստուգեք՝ արդյոք սկզբնաղբյուրը փակում է իր Netty ալիքը մինչև ասինխրոն պատասխանի գրառման ավարտը։
Պատկերը աշխատում է արագ ուղղակի կապով, բայց ավելի դանդաղ forward պրոքսիի միջով անավարտ է գալիս։ Հնարավոր պատճառներից մեկն այն է, որ սկզբնաղբյուրը փակում է կապը, մինչ պատասխանը դեռ գրվում է։
Netty-ի I/O-ն ասինխրոն է։ writeAndFlush-ից վերադառնալը չի նշանակում, որ այդ գործողությունն ավարտված է։ Ուստի այս հաջորդականությունը անվտանգ չէ այն պատասխանի համար, որում դեռ հերթում բայթեր կան.
ctx.writeAndFlush(response);
ctx.close();
Երբ HTTP փոխանակումը դիտավորյալ փակվում է իր վերջին պատասխան հաղորդագրությունից հետո, փակումը կցեք այդ գրառման future-ին.
ctx.writeAndFlush(finalResponseMessage)
.addListener(ChannelFutureListener.CLOSE);
Հատվածը ենթադրում է, որ պատասխանն արդեն ճիշտ կառուցված և շրջանակված է։ Հոսքային մարմնի համար օգտագործեք նրա վերջին հաղորդագրության ավարտը, ոչ թե վերնագրերի գրառումը։ Մշտական HTTP կապի համար մի ավելացրեք փակում միայն այն պատճառով, որ պատասխանն ավարտվել է։
Ուսումնասիրեք future-ի ձախողումը որպես հավելվածի սովորական սխալների մշակման մաս։ Ավարտը ներառում է ձախողում և չեղարկում, ուստի ավարտը ինքնին դիտարկիչից առաքման անդորրագիր չէ։
Օգտակար համեմատությունը յուրաքանչյուր ուղու վրա պատասխանի ամբողջ երկարությունն ու գրառման արդյունքն է։ Պրոքսին կարող է այնքան փոխել ժամանակավորումը, որ բացահայտի առկա կյանքի ցիկլի սխալ; դրա առկայությունը չի ապացուցում, որ նրա սեղմիչը կամ քեշը դեն նետել է բայթերը։