English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

სტუმარი
1 / ?
უკან გაკვეთილებზე

ფორმა 1: მდგომარეობის აღდგენა. ფორმა 2: უაზრო ანგარიში.

მეტრირებული გული მუშაობს საათის მიხედვით. არა საჭიროების მიხედვით. არა ცვლილების მიხედვით. ტაიმერის მიხედვით.

ორი ფორმა, ერთი ძირეული მიზეზი: დაგეგმილი სამუშაო, რომელიც ცვლის სწორ დიზაინს.

ფორმა 1: მდგომარეობის აღდგენა

მდგომარეობის გადასვლა ვერ სრულდება ატომურად. გადასვლის გამოსწორების ნაცვლად, ფონური სამუშაო იწყება დაყოვნებით და ახდენს შერიგებას. მომხმარებლები ხედავენ დაზიანებულ მდგომარეობას შერიგების პერიოდში.

GitHub-ის მაგალითი (2026-04-08): Pull request-ის upstream რეპოზიტორია გახდა პირადი. GitHub-მა სცადა მდგომარეობის გადასვლა: PR-ის დახურვა, branch-ის სტატუსის განახლება, merge-ის სტატუსის გასუფთავება. გადასვლა არ დასრულებულა ატომურად. PR-ის სტატუსი აჩვენებდა ერთდროულად 'branch-forced-closed' და 'Merge status cannot be loaded'. Sidekiq-ის background job გაეშვა რამდენიმე წუთის შემდეგ და დაასრულა შერიგება. დამკვირვებლები ხედავდნენ გაფუჭებულ მდგომარეობას ფანჯრის მთელი ხანგრძლივობის განმავლობაში.

The Metered Heart: Sidekiq-ის job გაშვებული იყო გრაფიკის მიხედვით. ის არ გაშვებულა იმიტომ, რომ GitHub-მა აღმოაჩინა გაფუჭებული მდგომარეობა; ის გაშვებულ იქნა იმიტომ, რომ ტაიმერი გაისროლა. მომხმარებელმა, რომელიც PR-ს რეალურ დროში უყურებდა, დაინახა PR, რომელიც თავის თავს ეწინააღმდეგებოდა მომდევნო job-ის შესრულებამდე.

Form 2: Wasteful Report

ანგარიში ან აგრეგაცია ყოველთვის თავიდან გამოითვლება ფიქსირებული ინტერვალით. არ არის ქეშის შემოწმება. არ არის idempotency-ის დაცვა. არ არის ინკრემენტული განახლება. ყოველი შესრულება: სრული სკანირება.

მაგალითები: ღამის cron job, რომელიც ყოველ მომხმარებლის საერთო შესყიდვების თანხას თავიდან ითვლის ყველა შეკვეთის სკანირებით დასაწყისიდან. ყოველდღიური ანალიტიკის job, რომელიც აღადგენს დეშბორდს raw event logs-დან. ყოველკვირეული შემაჯამებელი ელფოსტა, რომელიც აქტივობის ცხრილის ყველა მწკრივს იკითხავს.

თითოეული გაშვებულია მიუხედავად იმისა, შეიცვალა თუ არა მონაცემები ბოლო შესრულების შემდეგ. თითოეული სკანირებს სრულ ისტორიას მაშინაც კი, როცა მხოლოდ ბოლო 24 საათი შეიცავს ახალ მონაცემებს. თითოეული ცვლის ინკრემენტულ დიზაინს დაგეგმილი გამეორებით.

The Shared Root

A Metered Heart ვერ ამბობს სიმართლეს საკუთარ მდგომარეობაზე. ის მხოლოდ საათს იცნობს. Form 1: მდგომარეობის შეკეთების job გაშვებულია T+5 წუთზე მიუხედავად იმისა, არის თუ არა მდგომარეობა გაფუჭებული T+0-ზე. Form 2: ანგარიშის job გაშვებულია 2 AM-ზე მიუხედავად იმისა, შეიცვალა თუ არა რაიმე მონაცემები გუშინდან.

საათი არ ატარებს ინფორმაციას იმის შესახებ, თუ რა უნდა გაკეთდეს. ამ ინფორმაციას ატარებს მოვლენა: „მდგომარეობის გადასვლა ახლახანს ჩაიშალა“, „ახალი შეკვეთები ახლახანს მოვიდა“. Metered Heart ამ ინფორმაციას გადააგდებს და ცვლის მას განრიგით.

კაპიტალის გადინება

Metered Heart აფუჭებს ცოცხალ კაპიტალს: ინჟინრები მზად არიან გატეხილი მდგომარეობის ინციდენტებისთვის. აფუჭებს სოციალურ ნდობას: მომხმარებლები ხედავენ არათანმიმდევრულ მონაცემებს და აცხადებენ დეფექტებს, რომლებიც თავისთავად წყდება. აძლიერებს სხვა MOAD-ებს: მდგომარეობის აღდგენის სამუშაო, რომელიც სკანირებს ყველა ჩანაწერს გატეხილი მდგომარეობის საპოვნელად, ხშირად შეიცავს MOAD-0001-ს (O(N²) სკანირება). ანგარიშის სამუშაო, რომელიც ხელახლა ითვლის ცივ მონაცემებს, შეიძლება გამოიწვიოს MOAD-0005 (ქეშის შტამპედი). MOAD-0009 აძლიერებს სხვა დეფექტებს.

საერთო ფესვი

ფორმა 1 და ფორმა 2 ზედაპირზე განსხვავებულად გამოიყურება: ერთი აღადგენს მდგომარეობას, მეორე ხელახლა ითვლის მონაცემებს. მათ აკავშირებს ძირეული მიზეზი.

ფორმა 1 და ფორმა 2 იზიარებენ ძირეულ მიზეზს. აღწერეთ იგი ერთ წინადადებაში. შემდეგ მოიყვანეთ თითოეული ფორმის მაგალითი პროგრამული უზრუნველყოფიდან, რომელიც გამოგიყენებიათ.

ცვლილებაზე გაშვება, არა საათზე

მოვლენებზე დაფუძნებული დიზაინი მაშინ იწყება, როდესაც რაღაც იცვლება. მდგომარეობის ცვლილება არის მოვლენა. მოვლენა არის ტრიგერი.

ფორმა 1: ატომური გადასვლა ცვლის სარემონტო სამუშაოს.

თუ მდგომარეობის გადასვლამ შეიძლება სისტემა დატოვოს გატეხილ შუალედურ მდგომარეობაში, დეფექტი მდგომარეობს გადასვლაში, არა მისი სარემონტო სამუშაოს არარსებობაში. გაასწორეთ გადასვლა, რომ დასრულდეს ატომურად (ან ტრანზაქციულად). როდესაც გადასვლა დასრულდება ატომურად, გატეხილი მდგომარეობა არასოდეს არსებობს. სარემონტო სამუშაოს არაფერი აქვს გასარემონტებელი.

# დეფექტი: არა-ატომური გადასვლა ტოვებს გატეხილ მდგომარეობას
def close_pr_on_repo_private(pr_id):
pr = PR.get(pr_id)
pr.status = 'branch-forced-closed'   # ნაბიჯი 1: ნაწილობრივი მდგომარეობა
pr.save()                             # ახლა ხილული მომხმარებლებისთვის
# ... სხვა ნაბიჯები შეიძლება ჩავარდეს ...
pr.merge_status = 'not_applicable'
pr.save()                             # ნაბიჯი 2: ახლა თანმიმდევრული
# Sidekiq job აღადგენს თუ ნაბიჯი 2 ჩავარდება
# FIX: ატომური გადასვლა; შუალედური მდგომარეობა არ ჩანს
def close_pr_on_repo_private(pr_id):
with db.transaction():
pr = PR.get(pr_id)
pr.status = 'branch-forced-closed'
pr.merge_status = 'not_applicable'
pr.save()   # ორივე ველი კომიტდება ატომურად; არასოდეს იქნება ნახევრად ჩაწერილი

ფორმა 2: ინკრემენტული განახლება ცვლის სრულ გადაანგარიშებას.

ანგარიში, რომელიც თავიდან ითვლის, იმიტომ იწყება, რომ ძველი მონაცემები + ახალი მონაცემები = ახალი შედეგი. მაგრამ ძველი შედეგი + დელტა = იგივე ახალი შედეგი, რომელიც ინკრემენტულად ითვლება. მოვლენა: ახალი მონაცემები მოვიდა. ტრიგერი: აგრეგატის განახლება მხოლოდ ახალი მონაცემებისთვის.

# დეფექტი: სრული გადაანგარიშება გრაფიკის მიხედვით
def nightly_totals_job():
for user in all_users():
total = sum(o.amount for o in user.orders)  # სკანირება მთელი დროის განმავლობაში
user.total_purchases = total
user.save()

# FIX: მოვლენებზე დაფუძნებული ინკრემენტული განახლება
def on_order_placed(order):
order.user.total_purchases += order.amount   # მხოლოდ დელტა
order.user.save()

ინკრემენტული განახლება ჩაირთვება შეკვეთის მოსვლისას და არა დილის 2 საათზე. ის განაახლებს მხოლოდ დაზარალებულ მომხმარებელს. ის კითხულობს მხოლოდ ახალ შეკვეთას და არა ყველა შეკვეთას ყველა დროიდან. ღამის სამუშაო ქრება.

რატომ ავლენს ფორმა 1 გატეხილ გადასვლას

ფორმა 1 მეტრირებული გული ავლენს, რომ მდგომარეობის გადასვლა დაუსრულებელი დარჩა. სარემონტო სამუშაო არსებობს იმიტომ, რომ ინჟინერმა შენიშნა გატეხილი მდგომარეობა და დაამატა შერიგების მექანიზმი გადასვლის გამოსწორების ნაცვლად. სარემონტო სამუშაო: პაჩი გატეხილ არქიტექტურულ გადაწყვეტილებაზე.

MOAD-0009 როგორც გამაძლიერებელი

MOAD-0009 აძლიერებს სხვა MOAD-ებს. მდგომარეობის სარემონტო სამუშაო, რომელიც სკანირებს ყველა ჩანაწერს გატეხილი მდგომარეობის მოსაძებნად: MOAD-0001 (O(N) ან O(N²) სკანირება თითოეული სამუშაოს გაშვებისას). ანგარიშის სამუშაო, რომელიც ყველაფერს ცივად ხელახლა ითვლის: MOAD-0005 (ქეშის შტამპედი როდესაც სამუშაო იწყება და თბილ აპსტრიმს ხვდება). MOAD-0009 არა მხოლოდ თავისთავად აზიანებს; ის სხვა MOAD-ებს გრაფიკით აწვდის.

დიაგნოსტიკა და რედიზაინი

გუნდი აწარმოებს ღამის კრონის სამუშაოს დილის 2 საათზე. სამუშაო სკანირებს ყველა შეკვეთას ყველა მომხმარებლისთვის და თითოეული მომხმარებლის საერთო შესყიდვის თანხას თავიდან ითვლის. სამუშაო 4 საათს მოითხოვს. დილის 6 საათისთვის დეშბორდი აჩვენებს ახალ ჯამებს. 2 საათიდან 6 საათამდე დეშბორდი აჩვენებს გუშინდელ ჯამებს.

რომელი ფორმაა MOAD-0009? რა მოვლენამ უნდა გამოიწვიოს ხელახალი გამოთვლა? რა შუალედური მონაცემთა სტრუქტურა ხდის განახლებას ინკრემენტულს?