AiHummer
ქართული
შესვლა
v1.0.x
{ }Swagger

მიწოდება, outbox და აღდგენა

v1.0.x · განახლდა 2026-06-26

როდესაც ბრუნვა მთავრდება, პასუხს მაინც უნდა მიაღწიოს იმ არხამდე, საიდანაც ის მოვიდა — საიმედოდ, და ზუსტად ერთხელ. AiHummer ამას ამუშავებს ტრანზაქციული outbox-ით, იდემპოტენტური გვერდითი ეფექტებითა და ბრუნვის აღდგენით გადატვირთვის შემდეგ. არჩევით NATS bus-ს შეუძლია მიწოდების ტარება უფრო დიდი დანერგვებისთვის.

გარანტირებული მიწოდება

პასუხი არ იგზავნება ჩაშენებულად ბრუნვის ბოლოს. ამის ნაცვლად ის დგება outbox-ში რიგში იმავე სამუშაოს ფარგლებში, რომელმაც ის წარმოშვა, და მიწოდების worker იღებს მას და უგზავნის წარმომქმნელ არხს. იმის გამო, რომ პასუხი მდგრადად ჩაიწერება სანამ ის გავა, ავარია “პასუხი წარმოიქმნა”-სა და “პასუხი გაიგზავნა”-ს შორის ვერ დაკარგავს მას — გადატვირთვაზე outbox-ის ჩანაწერი ისევ იქ არის და მიწოდება განახლდება.

turn produces reply
   └─▶ enqueue in outbox (durable)
         └─▶ delivery worker ─▶ originating channel
               └─ acknowledged ─▶ marked delivered

მიწოდება დაწყვილებულია იდემპოტენტურობასთან ისე, რომ ეს სულ-მცირე-ერთხელ worker გამოიღებს ზუსტად-ერთხელ გარე ქცევას: აღდგენა-სტაბილური ledger გასაღები და გვერდითი-ეფექტის ბარიერი უზრუნველყოფს, რომ ხელახლა მიწოდებული ან განმეორებული პასუხი არხს მხოლოდ ერთხელ გაეგზავნოს (იხ. მრავალმოიჯარეობა და იდემპოტენტურობა).

[!NOTE] “ზუსტად-ერთხელ” აქ აღწერს გარეგნულად ხილულ შედეგს: მომხმარებელი იღებს პასუხს ერთხელ. შიგნით worker-მა შესაძლოა მიწოდება ერთზე მეტჯერ სცადოს; იდემპოტენტურობის ფენა ამ მცდელობებს ერთ ხილულ გაგზავნად ანგრევს.

ბრუნვის აღდგენა გადატვირთვის შემდეგ

თუ gateway გადაიტვირთება ბრუნვის შუა გზაზე — დანერგვა, ავარია, ჰოსტის გადატვირთვა — სამუშაო არ მიტოვდება. ბრუნვის აღდგენა ხელახლა გაუშვებს შეწყვეტილ ბრუნვას ისე, რომ მან დაასრულოს. ეს მხოლოდ უსაფრთხოა იმიტომ, რომ გვერდითი ეფექტები იდემპოტენტურია: ნებისმიერი ფოსტა ან არხის-გაგზავნა, რომელიც უკვე მოხდა გადატვირთვამდე, ამოიცნობა მისი ledger გასაღებით და გამოტოვდება, ხოლო ის ნაწილები, რომლებიც არ მომხდარა, ბოლომდე გაიშვება. მომხმარებელი ხედავს ერთ, სრულ პასუხს, ვიდრე ნახევრად-დასრულებულს ან დუბლიკატს.

არჩევითი NATS bus

ნაგულისხმევად მიწოდება მუშაობს მთლიანად PostgreSQL-ის გავლით, რაც ინარჩუნებს მინიმალურ დანერგვას ერთ gateway-ად პლუს ერთ მონაცემთა ბაზად. უფრო დიდი ან მრავალ-gateway კონფიგურაციებისთვის შეგიძლიათ მიწოდება NATS bus-ზე გადაიტანოთ მისი URL-ის კონფიგურირებით:

# gateway.env
AIHUMMER_NATS_URL=nats://127.0.0.1:4222

bus ნამდვილად არჩევითია — დატოვეთ AIHUMMER_NATS_URL დაუყენებლად და outbox მის გარეშე იმუშავებს. როდესაც არსებობს, NATS ხდება ტრანსპორტი, რომლის გავლითაც მიწოდების სამუშაო მიედინება, რაც შეესაბამება ჰორიზონტალურად მასშტაბირებად gateway-ებს proxy-ს უკან.

[!TIP] ნულ-დაბრკოლების განახლებები უშვებენ ორ ან მეტ gateway-ს reverse proxy-ს უკან. განრიგი რჩება ერთ-ლიდერად Postgres-ის advisory lock-ის გავლით, და იდემპოტენტური მიწოდება ნიშნავს, რომ დამატებით gateway-ებს შეუძლიათ დატვირთვის გაზიარება ორჯერ არაფრის გაგზავნის გარეშე.

რას უნდა ადევნოთ თვალი

მიწოდება არის ის, სადაც საიმედოობის პრობლემები პირველად ჩნდება, ამიტომ ის არის ის, რასაც უნდა ადევნოთ თვალი. AiHummer აგზავნის ტელემეტრიას OTLP-ის გავლით (AIHUMMER_OTEL_ENDPOINT) და აქვეყნებს Grafana დაფებს; არ არსებობს Prometheus /metrics endpoint scrape-ისთვის.

  • მიწოდების განწყობები — თითოეული მიწოდების მცდელობის შედეგი. წარუმატებლობების მზარდი მაჩვენებელი მიუთითებს არხის ან downstream პრობლემაზე.
  • Outbox სიღრმე — რამდენი პასუხი ელოდება მიწოდებას. მუდმივი ზრდა ნიშნავს, რომ მიწოდება ჩამორჩება.
  • DLQ სიღრმე — ჩანაწერები, რომლებმაც ამოწურეს თავიანთი ხელახალი მცდელობები და მოხვდნენ dead-letter რიგში. ნებისმიერი DLQ ზრდა იმსახურებს გამოძიებას.

[!WARNING] ადევნეთ თვალი ამათ ბრუნვის ლატენტურობასა და შეცდომის მაჩვენებელთან ერთად. მზარდი outbox ან DLQ არის ადრეული გაფრთხილება, რომ downstream არხები დეგრადირებულია მაშინაც კი, როცა ბრუნვები თავად ისევ წარმატებულია.

სად შემდეგ