Bir gün sifariş emal edən Lambda funksiyanız qəfildən təkrar təsdiq e-poçtları göndərməyə başlayır. Hər iyirmi sifarişdən birində bu baş verir. CloudWatch göstərir ki, dərc edilən mesajlardan daha çox invokasiya var. Kod həftələrdir dəyişməyib. Dəyişən nədir? Kimsə fırıldaqçılıq yoxlaması əlavə edib və emal vaxtı 25 saniyədən təxminən 45 saniyəyə qalxıb — amma SQS növbəniz hələ də standart 30 saniyəlik vizibiliti timeaut ilə işləyir.
Məsələ elə bu kombinasiyadır. Lambda SQS-dən mesaj çəkəndə mesaj silinmir — sadəcə vizibiliti timeaut müddəti ərzində gizlənir. Əgər funksiya hələ işləyərkən bu pəncərə bağlanarsa, SQS fərz edir ki, istehlakçı ölüb və eyni mesajı başqa bir invokasiyaya ötürür. Nəticədə iki Lambda eyni sifarişi emal edir, hər ikisi "uğurlu" olur və hər ikisi e-poçt göndərir. Heç bir xəta baş vermir, heç bir təkrar cəhd olmur. Və "bu mesaj iki dəfə çatdırıldı, çünki timeautlar səhv konfiqurasiya olunub" deyən bir log sətri yoxdur.
Bu səhv niyə görünməzdir?
Üç amil bu uyğunsuzluğu demək olar ki, görünməz edir. Birincisi, bütün testlərdən keçir. Lokal testlərdə və stecinq mühitində handler süni mesajı iki saniyədə emal edir. 30 saniyəlik vizibiliti pəncərəsi heç vaxt bitməyə yaxınlaşmır. Səhv yalnız istehsalat şəraitində — real mesaj ölçüləri, real gecikmələr və soyuq başlanğıclar yavaş asılılıqların üstünə yığılanda üzə çıxır.
İkincisi, defolt dəyərlər tələ qurur. SQS növbələri standart olaraq 30 saniyəlik vizibiliti timeaut ilə yaradılır. Lambda funksiyalarının timeautları isə böyüdükcə 60, 120, hətta 900 saniyəyə qədər artırılır. Ancaq heç kim eyni vaxtda növbənin timeautunu artırmır — çünki bu iki parametr fərqli konsollarda, fərqli IaC resurslarında və adətən fərqli pull request-lərdə yerləşir.
Üçüncüsü, uğursuzluq əlamətləri başqa yerə işarə edir. Təkrar emal proqram səhvinə bənzəyir. Siz handler'i ikiqat göndərmə üçün yoxlayır, istehsalçının iki dəfə dərc edib-etmədiyini araşdırır və DynamoDB şərti yazma sənədlərini oxuyursunuz — kimsə iki xidmət arasında iki timeaut dəyərini müqayisə etməyi düşünənə qədər.
Həll yolu: bir sətir IaC
Düzəliş mexanikidir. AWS tövsiyəsinə əsasən, vizibiliti timeaut istehlakçı Lambda timeautunun 6 qatı olmalıdır. CDK-da bu belə görünür:
const orderEvents = new sqs.Queue(this, 'OrderEvents', { visibilityTimeout: cdk.Duration.seconds(720) });Lakin uzunmüddətli problem odur ki, bu tip səhvlər daim təkrarlanır — və getdikcə daha çox süni intellekt köməkçiləri tərəfindən yenidən yaradılır. AI köməkçisindən "sifariş emalçısını tetikleyən SQS növbəsi əlavə et" istəsəniz, o, defolt parametrlərlə 120 saniyəlik funksiyaya qoşulmuş bir növbə yaradacaq. Kod sintaktik cəhətdən mükəmməldir, yerləşdirilir və məqalənin əvvəlindəki səhvi ehtiva edir.
Infrawise kimi alətlər bu problemi aşkar etmək üçün real AWS hesabınızın qrafikini qurur və qaydalara əsaslanan analizatorlar işlədir. Yalnız aktiv tetikleyici olan növbələr yoxlanılır və hər iki tərəfdən real dəyərlər müqayisə edilir. Nəticədə, yüksək ciddilik dərəcəsi ilə "'order-events' növbəsinin vizibiliti timeautu (30s) 'process-order' Lambda timeautundan (120s) kiçikdir" xəbərdarlığı verilir. Bu yanaşma, səhvi istehsalata çıxmadan əvvəl tutmağa kömək edir.


