GH GambleHub

გარიგების მესიჯი

გარიგების მესიჯი არის არქიტექტურული ტექნიკის ერთობლიობა, რომელიც უზრუნველყოფს კოორდინაციას ადგილობრივ სახელმწიფო ცვლილებებსა (BD/ქეში) და ბროკერის/საბურავის შეტყობინებებს შორის. მიზანი: „მდგომარეობა დაფიქსირდა. შეტყობინება არ არის დაკარგული და დუბლირებული“ წარუმატებლობის, რეაგირების, მასშტაბის და მულტფილმის ტენანტობის დროს.

1) მიწოდების სემანტიკა

At-most-once: სწრაფი და იაფი, დანაკარგები შესაძლებელია, დუბლი არ არის.
At-least-once: არ კარგავს შეტყობინებებს, შესაძლებელია დუბლირება, საჭიროა იდემპოტენტობა.
(ეფექტური) Exactly-once: არ არსებობს ზარალი და არ არსებობს ხილული დუბლები ბიზნეს ეფექტებისთვის, მიიღწევა ტექნიკის ერთობლიობით (outbox/inbox, მწარმოებლის/კონსუტერის გარიგებები, დედაპლატი).

2) რატომ არის „ორი წერილი“ საშიში

გულუბრყვილო ლოგიკა „ჯერ დავწეროთ BD- ში, შემდეგ კი საბურავში გამოგიგზავნით“ (ან პირიქით) იშლება ნაბიჯებს შორის დაცემისას: მონაცემები დაფიქსირდა და მოვლენა დაიკარგა; ან მოვლენა გაქრა, მაგრამ მონაცემები არ არის. გარიგების მესიჯი გამორიცხავს ამ უფსკრული.

3) ძირითადი ნიმუშები

3. 1 Outbox (მწარმოებელი)

ერთ ადგილობრივ გარიგებაში ჩაწერეთ ბიზნეს ცვლილება და სტრიქონი „outbox“ ცხრილში; ცალკე publisher კითხულობს outbox- ს და აქვეყნებს ბროკერს traves და backoff. ზარალი გამორიცხულია; ჩვენ მომხმარებლებს შორის idempotenture.

3. 2 Inbox/Idempotent Consumer (მომხმარებელი)

ეფექტის შესრულებამდე, კონსუტერს აკეთებს 'INSERT' inbox- ში (consumer, event _ id) 'როგორც პირველადი გასაღები. საკვანძო კონფლიქტი = მოვლენა უკვე დამუშავებულია და გამოტოვებულია. ეს მიიღწევა „ეფექტური exactly-once“.

3. 3 Read-Process-Write ოფსეტური გარიგებით

ლოგზე ორიენტირებული საბურავების შაბლონი: კონსუმერი კითხულობს ბატს, იმავე გარიგებაში იგი აფიქსირებს ბიზნეს ცვლილებას და „დასრულებულ ოფსეტს“. კომიტის შემდეგ ბროკერი შეტყობინებებს მოხმარებულად თვლის. ეს აღმოფხვრის „წაკითხვას, დაეცა და გაიმეორა“ ეფექტის დუბლების გარეშე.

3. 4 TSS/საგები ოფისის ეფექტებისთვის

როდესაც საჭიროა შეთანხმებული მულტიშაგის პროცესი, ჩვენ ვიყენებთ TCC ან საგებს; შეტყობინებები - ბრძანებების/ღონისძიებების ტრანსპორტი, ხოლო გარიგება - ნაბიჯებისა და კომპენსაციის დონეზე.

4) Idempotent Projecers და Consumers

პროდიუსერი: სტაბილური 'მესიჯი _ id '/' idempotency _ key', იგივე გასაღებით ხელახალი გაგზავნა არ ქმნის ახალ ეფექტებს აბონენტებს შორის; შეინარჩუნეთ თანმიმდევრობა.
კონსიუმერი: 'inbox' + ბიზნეს idempotence (upsert/merge, ბოლო ვერსიის გადამოწმება/გადასინჯვა).

5) წესრიგი და მიზეზი

გაატარეთ ბიზნეს გასაღები (მაგალითად, 'aggregate _ id', 'tenant _ id') ისე, რომ ერთი ობიექტის მოვლენები წესრიგში მოვიდეს.
პარტიის შიგნით შეინარჩუნეთ თანმიმდევრული ნომრები/დროებითი ეტიკეტები; DLQ- ის რედაქციის დროს დაიცავით „გასაღები და თანმიმდევრულად“.
თუ გლობალური წესრიგი არ არის კრიტიკული, უზრუნველყეთ ადგილობრივი წესრიგი და დააფიქსირეთ დომენის ინვარიანტები.

6) ოფსეტები და ეფექტების დაფიქსირება

ვარიანტი A: „ოფსეტი მონაცემთა ბაზაში“

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

ვარიანტი B: ბროკერის გარიგება

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

7) Retrai, backoff, DLQ

გაიმეორეთ მხოლოდ retraible შეცდომები (taymauts, 5xx), ექსპონენციალური backoff და jitter.
Non retraible (schema/validation) - დაუყოვნებლივ DLQ- ში მეტამონაცემებით (tenant, key, offset, მიზეზი).
DLQ redrive dotch (batch, rate limit), შეამოწმეთ სქემა გამეორების წინ, დააკვირდით წესრიგს.

8) მულტფილმები და რეგიონები

ჩართეთ 'tenant _ id', 'plan', 'region' მეტამონაცემებში და განაწილების გასაღებებში.
Per-tenant fairness: შეზღუდეთ პუბლიკაცია/დამუშავება ისე, რომ „ხმაურიანმა“ კლიენტმა არ ამოიღო ბიუჯეტი დანარჩენისგან.
Residence: შეინახეთ შეტყობინებები და გარედან იმავე რეგიონში, როგორც დომენის მონაცემები; ინტერრეგიონალური რეპლიკაციები - ასინქრონული ერთეულები.

9) დაკვირვება და აუდიტი

ტრეისი: კორელაცია 'event _ id '/' aggregate _ id '/' saga _ id', სპა „read 'process' write/commit“.
მეტრიკა: პუბლიკაციის/დამუშავების ლაგი (p95/p99), წარმატების წილი, DLQ-rate, რადარის წარმატება, „დუბლიკატები დათრგუნულია“.
ლოგიკა: მოკლედ წარმატებისკენ; შეცდომებზე დეტალურად (მიზეზი, მცდელობა, გასაღები, ოფსეტი).
აუდიტი: ვინ იშვიათი/გამოტოვა, რა ბრძოლა და რა შედეგით.

10) უსაფრთხოება და შესაბამისობა

მინიმუმამდე დაიყვანეთ PII payload- ში; შენიღბვა DLQ/loga- ში გადატანისას.
ხელი მოაწერეთ/დაშიფვრეთ შეტყობინებები გარე საბურავებისთვის; გამოიყენეთ mTLS სერვისებს შორის.
აკონტროლეთ შენახვის ვადა და „დავიწყების უფლება“ per tenant/region.

11) სტანდარტული ინტეგრაციის სქემები

1. სერვისის წყარო (write-side)

ადგილობრივი გარიგება: დომენის ჩაწერა + გარეთ.
Pablisher: batch, 'SKIP LOCKED', backoff, per tenant ლიმიტები.
lage 'now − occurred _ at' - ის მონიტორინგი.

2. სამომხმარებლო მომსახურება (read-side)

Butch- ის კითხვა - მცდელობა 'INSERT inbox (consumer, event _ id)', წარმატების მისაღწევად.
ამავე გარიგებაში, ჩვენ აღვნიშნავთ „დასრულებულ ოფსეტს“ (ვარიანტი A) ან ეყრდნობა ბროკერის გარიგებას (ვარიანტი B).
შეცდომით: retray ან DLQ პოლიტიკა.

3. პროექცია/მატერიალიზებული სახეობა

მხოლოდ idempotent apdates (upsert), ბაბუის კომპაქტური გასაღებები, საკონტროლო თანხების პერიოდული შერწყმა.

12) კონფიგურაციის შაბლონები (მაგალითი)

yaml producer:
idempotency_key: event_id partition_key: "{tenant_id}:{aggregate_id}"
retry:
max_attempts: 8 initial_ms: 200 max_ms: 8000 strategy: exponential_full_jitter

consumer:
batch: 500 offset_commit: "with_domain_tx"  # или "broker_tx"
inbox_enabled: true concurrency_per_partition: 4 dlq:
enabled: true batch_redrive: 200 rate_limit_per_sec: 50 order_by_key: true

observability:
metrics:
- processing_lag_ms
- publish_success_ratio
- dlq_rate
- redrive_success_ratio tracing_tags: [event_id, tenant_id, aggregate_id, partition, offset]

13) ჩეკის სია გაყიდვამდე

  • აღმოფხვრილი იქნა „ორი წერილი“: Outbox პროვაიზერზე ან ოფსეტის დაფიქსირება და ეფექტი ერთ გარიგებაში კონსიუმერთან.
  • Idempotent Consumer: 'inbox '/dedup ჟურნალი, ოპერაციების ბიზნეს idempotence.
  • ბიზნეს გასაღები, ადგილობრივი წესრიგი დაცულია.
  • Retrai ერთად backoff + jitter, შეცდომების კლასიფიკაცია, DLQ მდიდარი მეტამონაცემებით.
  • რედრივი დოზირებული, უსაფრთხო; არის playbooks.
  • მულტფილმები-ჩრდილოვანი ლიმიტები და პრიორიტეტები; ჭდეები 'tenant _ id/plan/region'.
  • ტელემეტრია: ლაგები, წარმატების წილი, „დუბლიკატები ჩახშობილი“, ალერტები p95/p99.
  • პოლიტიკოსები PII/retenshna/დაშიფვრა დაცულია.
  • ტესტები: ნაბიჯებს შორის ვარდნა, დუბლიკატები, გასაღები შეკვეთა, მასობრივი რადარი.

14) ტიპიური შეცდომები

საბურავზე გაგზავნა და მონაცემთა ბაზაში ჩაწერა ცალკეული ნაბიჯებით offset/გარიგების გარეშე.
Idempotence Consumer დუბლირებას უწევს გვერდითი მოვლენებს.
გლობალური წესრიგი „ნებისმიერ ფასად“ - გზები და იშვიათად გამართლებულია; საკმარისია გასაღები.
მასობრივი რადარი შეზღუდვების გარეშე - მეორადი ინციდენტი.
ტრეისინგის/ლაგ მეტრიკის არარსებობა არის „ფარული დეგრადაცია“.
PII ნაზავი DLQ/ლოგოებში.

15) სწრაფი რეცეპტები

SaaS მოვლენები: Outbox + idempotent Consumer (inbox), 'tenant _ id განაწილება: aggregate _ id'.
ETL/პროექციები: Read-process-write, ოფსეტების დაფიქსირება ერთ გარიგებაში, 500-1000 ბატები, upsert.
მაღალი დატვირთვა: საზოგადოებრივი შარდვა, 'SKIP LOCKED', WFQ per tenant, ლაგამის კონტროლი.
მკაცრი შესაბამისობის ზონა: რეგიონალური გარე ბოქსი, payload დაშიფვრა, retenshny და რედაქციის აუდიტი.

დასკვნა

გარიგების მესიჯი არის მონაცემთა და შეტყობინებების ერთობლიობის დისციპლინა. Outobox/inbox- ის კომბინაციით, idempotence, offsets- ის დაფიქსირება ეფექტებთან ერთად და კონტროლირებადი retrais ერთად DLQ, თქვენ იღებთ პრაქტიკულ exactly-once ქცევას გლობალური საკეტების გარეშე და ინარჩუნებთ SLO- ს, თუნდაც წარუმატებლობის, მწვერვალების და რთული და რთული მულტფილმების დროს.

Contact

დაგვიკავშირდით

დაგვიკავშირდით ნებისმიერი კითხვის ან მხარდაჭერისთვის.ჩვენ ყოველთვის მზად ვართ დაგეხმაროთ!

Telegram
@Gamble_GC
ინტეგრაციის დაწყება

Email — სავალდებულოა. Telegram ან WhatsApp — სურვილისამებრ.

თქვენი სახელი არასავალდებულო
Email არასავალდებულო
თემა არასავალდებულო
შეტყობინება არასავალდებულო
Telegram არასავალდებულო
@
თუ მიუთითებთ Telegram-ს — ვუპასუხებთ იქაც, დამატებით Email-ზე.
WhatsApp არასავალდებულო
ფორმატი: ქვეყნის კოდი და ნომერი (მაგალითად, +995XXXXXXXXX).

ღილაკზე დაჭერით თქვენ ეთანხმებით თქვენი მონაცემების დამუშავებას.