Hindenbug tam məlumat itkisinə, xidmətin dayanmasına və ya sistemin geri dönməz zədələnməsinə səbəb olan fəlakətli miqyaslı proqram xətasıdır. Adı 1937-ci ildə "Hindenburq" dirijablının fəlakətinə istinad edir — həmin yanğın kimi, bu səhv də yolundakı hər şeyi məhv edir. Vikipediyaya (2026) görə, Hindenbug ən təhlükəli defektlər sinfidir və illərlə işin nəticələrini saniyələr ərzində məhv edə bilər.
Əsas məqamlar
Hindenbug geri dönməz nəticələrə səbəb olan fəlakətli xarakterli proqram xətasıdır: istifadəçi məlumatlarının tam itkisi, verilənlər bazasının dağıdılması, kritik xidmətin dayanması və ya şirkətin maliyyə çöküşü.
Termin rəsmi elmi təsnifat deyil, lakin peşəkar proqramçı jarqonunda möhkəm yer tutmuşdur. Hindenbug texniki cəhətdən mürəkkəb olmaya bilər — bəzən müəyyən şəraitdə məlumatları məhv edən tək bir kod sətiridir. Digər səhvlərdən əsas fərqi — nəticələrin miqyasıdır.
Hər bir Hindenbug adi bir səhv kimi başlayır — Bohrbug, Mandelbug və ya Heisenbug. Onu fəlakətli edən qoruyucu mexanizmlərin olmamasıdır: ehtiyat nüsxələrin, əməliyyat limitlərinin, dəyişiklik izolyasiyasının. Sistemdə soft-delete və çoxsəviyyəli təsdiqləmə yoxdursa, SQL sorğusundakı bir səhv bütün istifadəçi cədvəlini silə bilər.
Hindenbug adı 6 may 1937-ci ildə ABŞ-da qəzaya uğrayan LZ 129 "Hindenburq" Alman dirijablının fəlakətinə istinad edir. Göyərtəsindəki 97 nəfərdən 35-i öldü, dirijablın özü isə 34 saniyəyə yandı.
Proqram xətası ilə bənzətmə aydındır: "Hindenburq"dakı yanğın nəhəng uçuş aparatını dərhal məhv etdiyi kimi, Hindenbug da saniyələr və ya dəqiqələr ərzində aylarla və ya illərlə işin nəticələrini — verilənlər bazalarını, fayl anbarlarını, server konfiqurasiyalarını məhv edir.
Bohrbug kimi "sakit" səhvlərdən fərqli olaraq, Hindenbug adətən səs-küylü nəticələrlə müşayiət olunur: şirkət səhmlərinin düşməsi, top-menecerlərin işdən çıxarılması, məhkəmə iddiaları. Məhz buna görə belə dramatik ad almışdır — o, texniki mürəkkəbliyi deyil, nəticənin fəlakətli olduğunu əks etdirir.
Hindenbug digər proqram səhvlərindən fərqləndirən bir sıra xarakterik xüsusiyyətlərə malikdir.
Hindenbug-un əsas xüsusiyyəti — zərərin geri dönməz olmasıdır. Bohrbug-u düzəldib unutmaq olarsa, Mandelbug-u düzəldib yoxlamaq olarsa, Hindenbug "yanmış torpaq" qoyur: silinmiş məlumatlar ehtiyat nüsxələr olmadan bərpa olunmur, dağıdılmış verilənlər bazaları uzun müddətli bərpa tələb edir.
Bir Hindenbug zəncirvari sıradançıxmalara səbəb olur. Məsələn, autentifikasiya xidmətindəki səhv API-ə girişi bloklayır, bu da frontendi, ödəniş şlüzunu, şəxsi kabineti və dəstək xidmətini iflic edir. Kaskad dəqiqələr ərzində onlarla xidmətə təsir edə bilər.
Müasir paylanmış sistemlər Hindenbug-u şəbəkə sürəti ilə yayır. Bir serverdəki səhv SQL sorğusu bütün replikalara replikasiya olunur. CI/CD vasitəsilə səhv konfiqurasiya eyni anda bütün prodakşn serverlərinə düşür.
Proqram mühəndisliyi tarixi klassik Hindenbug kimi dərsliklərə daxil olan bir neçə fəlakətli səhv tanıyır.
Yüksək tezlikli ticarət alqoritmindəki səhv 45 dəqiqə ərzində 7 milyard dollarlıq əməliyyatların aparılmasına səbəb oldu, zərər isə 460 milyon dollar təşkil etdi. Səbəb — koddakı unudulmuş flag, köhnə, istifadə olunmayan ticarət modulunu aktivləşdirdi. Şirkət bir neçə gün ərzində satıldı.
S3 hesablaşma sisteminin sazlanması zamanı səhv Amazon serverlərinin US-EAST-1 regionunda kütləvi söndürülməsinə səbəb oldu. Buna görə Slack, Trello, Quora və çoxlu startaplar da daxil olmaqla minlərlə sayt və xidmət saatlarla işləmədi. Səbəb — çox sayda serveri silən bir səhv əmr.
GitLab mühəndisi replikasiya işləri apararkən təsadüfən prodakşn verilənlər bazası olan qovluğu sildi. 24 saatlıq məlumatdan yalnız 6 saatı bərpa edildi. Hadisə təhlükəli əmrin icrasından əvvəl yoxlamanın olmaması və kifayət qədər ehtiyat nüsxələnməməsi səbəbindən baş verdi.
Hindenbug-un qarşısının alınması texniki deyil, təşkilati məsələdir. Aşağıda əsas qorunma təcrübələri verilmişdir.
Müntəzəm ehtiyat nüsxələr Hindenbug-dan sonra bərpanın yeganə zəmanətidir. Ehtiyat nüsxələr avtomatik olmalı, müxtəlif fiziki yerlərdə saxlanmalı və mütəmadi olaraq bərpa üçün sınaqdan keçirilməlidir. İşləyən ehtiyat nüsxə olmadan Hindenbug biznes fəlakətinə çevrilir.
Kütləvi silmə və ya dəyişdirmə əməliyyatları çoxsəviyyəli təsdiqləmə tələb etməlidir. SQL-də WHERE olmadan DELETE prodakşnda mümkün olmamalıdır. MySQL üçün `pt-archiver` kimi alətlər məlumatları fasilələrlə partiyalarla silməyə imkan verir.
Circuit Breaker nümunəsi səhvlərin sayı həddi aşarsa əməliyyatı avtomatik dayandırır. Bir əməliyyatda silinə bilən və ya dəyişdirilə bilən yazıların sayına limitlər fəlakətli ssenarilərin qarşısını alır.
public class SafeDeleteStrategy {
private static final int MAX_DELETE_BATCH = 1000;
public void deleteRecords(final String condition) {
int deleted = 0;
while (true) {
int batch = deleteBatch(condition, MAX_DELETE_BATCH);
if (batch == 0) break;
deleted += batch;
pause(100); // partiyalar arasında fasilə
}
}
}
Bu kod Hindenbug-un qarşısını alır, bir dəfəyə silinən yazıların sayını məhdudlaşdırır və əməliyyatlar arasında fasilə əlavə edir. Şərt təsadüfən çox geniş olarsa, sistem milyon əvəzinə yalnız 1000 yazını siləcək.
Əgər Hindenbug artıq baş veribsə, reaksiyanın sürəti və düzgünlüyü kritik əhəmiyyət daşıyır. Hər dəqiqə gecikmə zərəri dərinləşdirir.
Hindenbug aşkar edildikdə ilk hərəkət — bütün yazma əməliyyatlarını dayandırmaqdır. Verilənlər bazasına yazmanı bloklamaq, işçiləri dayandırmaq, CI/CD-ni söndürmək. İşi davam etdirmək vəziyyəti daha da pisləşdirir və bərpanı çətinləşdirir.
Hansı məlumatların itirildiyini, hansıların isə yalnız zədələndiyini müəyyən etmək lazımdır. Tam itki və zədələnmə arasındakı fərq bərpa strategiyasını müəyyən edir. Təhlil məlumatların surətində aparılmalıdır, prodakşnda yox.
Əgər ehtiyat nüsxələr varsa — bərpa prosesi bərpa nöqtəsinin (RPO) və bərpa vaxtının (RTO) seçilməsinə düşür. Ehtiyat nüsxə nə qədər təzədirsə, məlumat itkisi o qədər azdır, lakin ehtiyat nüsxənin də qüsurlu məlumatlar ehtiva etmə ehtimalı bir o qədər yüksəkdir.
Klassik Hindenbug-u nəzərdən keçirək — yoxlama olmadan miqrasiyada məlumatları silən SQL sorğusu.
-- Migration should delete only inactive sessions
DELETE FROM user_sessions
WHERE expired_at < NOW();
-- But the author forgot the WHERE clause and ran:
DELETE FROM user_sessions; -- all sessions were deleted
Real layihədə belə bir sorğu bütün istifadəçiləri dərhal sistemdən çıxaracaq. Əgər sessiyalar yeganə autentifikasiya mexanizmi idisə — bütün istifadəçilər sistemə girişini itirəcək. Əgər bu serverdə ehtiyat nüsxə yoxdursa — nəticələr geri dönməz olacaq. Bu Hindenbug istifadəçilərin etibarını və şirkətin nüfuzunu saniyələr ərzində məhv edir.
Tez-tez verilən suallar
Nəticələrin miqyası ilə. Adi kritik səhv (P1) funksionallığın bir hissəsini əlçatmaz edir, lakin məlumatlar toxunulmaz qalır. Hindenbug tam məlumat itkisi, geri dönməz zərər və ya milyonlarla ölçülən fəlakətli maliyyə itkiləri ilə P0 insidentidir.
Müasir sistemlərin əksəriyyəti qoruyucu mexanizmlərə malikdir: ehtiyat nüsxələr, replikasiya, əməliyyat izolyasiyası. Hindenbug yalnız bir neçə müdafiə səviyyəsi eyni anda sıradan çıxdıqda yaranır — nadir, lakin fəlakətli hallar toplusudur.
Bəli, məşhur Hindenbug-ların əksəriyyəti insan səhvinin nəticəsidir: konsolda səhv əmr, yanlış SQL sorğusu, admin paneldə səhv düyməyə basmaq. Məhz buna görə müdafiə işçi intizamına deyil, avtomatik yoxlamalara əsaslanır.
Bərpa sürəti yalnız ehtiyat nüsxələrin keyfiyyətindən və Disaster Recovery prosedurundan asılıdır. Təzə ehtiyat nüsxələr və işlənmiş bərpa planı olduqda bərpa 30 dəqiqədən bir neçə saata qədər çəkə bilər. Ehtiyat nüsxələr olmadan — bərpa mümkün deyil.
Əsas alətlər: ehtiyat nüsxə sistemləri (Bacula, Veeam, pg_dump), Circuit Breaker (Hystrix, Resilience4j), sorğu məhdudlaşdırıcılar (RateLimiter), kod yoxlamaları (SQL linter, təsdiqləmə ilə təhlükəli əməliyyatlar) və təhlükəsiz yerləşdirmə üçün feature toggles.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun