მრავალმოიჯარეობა და იდემპოტენტურობა
AiHummer არის მრავალმოიჯარე: ერთ gateway-ს შეუძლია მრავალი workspace-ის მომსახურება ერთი მონაცემთა ბაზიდან მათი მონაცემების ცალკე შენახვით. ორი მექანიზმი ხდის ამას უსაფრთხოს — Postgres Row-Level Security (RLS) წაკითხვა/ჩაწერის იზოლაციისთვის, და იდემპოტენტურობის ფენა ისე, რომ ხელახალი მცდელობები და ბრუნვის აღდგენა არასოდეს გააორმაგებს რეალურ გვერდით ეფექტს.
Tenant-ის იზოლაცია Row-Level Security-ით
იზოლაცია აღსრულდება მონაცემთა ბაზაში, არა მხოლოდ აპლიკაციის კოდში. AiHummer
უშვებს მოთხოვნებს შეზღუდული Postgres როლის (aihummer_app) გავლით, რომელსაც აქვს RLS
პოლიტიკები გამოყენებული, ისე რომ თავად მონაცემთა ბაზა უარყოფს ხაზებს, რომლებიც არ ეკუთვნის
აქტიურ tenant-ს.
RLS არის არჩევითი. თქვენ ააქტიურებთ მას gateway-სთვის მეორე კავშირის სტრიქონის მიცემით შეზღუდული როლისთვის:
# gateway.env
# Owner pool — runs migrations and privileged maintenance
AIHUMMER_DATABASE_URL=postgres://aihummer:***@localhost:5432/aihummer?sslmode=disable
# Restricted role — activates RLS for normal request traffic
AIHUMMER_DB_APP_URL=postgres://aihummer_app:***@localhost:5432/aihummer?sslmode=disable
[!NOTE] ჰოსტ-მშობლიური ინსტალაციებისთვის ინსტალატორი ავტომატურად აყენებს
AIHUMMER_DB_APP_URL-ს, ამიტომ RLS ნაგულისხმევად ჩართულია სტანდარტულ დანერგვაში. თუ ცვლადი არ არსებობს, gateway მუშაობს მხოლოდ owner pool-ზე და RLS არ არის აქტიური.
Tenant-თითო ფარგლების დადება
შეზღუდული როლის ფარგლებში, ყოველი მოთხოვნა ფარგლდება მის tenant-ში: gateway
აყენებს მიმდინარე tenant-ის კონტექსტს კავშირზე ისე, რომ RLS პოლიტიკები გადაიჭრას
სწორი workspace-ის მიმართ. WHERE tenant_id = … ფილტრები ხელით არ იწერება
ყველგან; პოლიტიკა აღასრულებს მას ცენტრალურად, რაც ნიშნავს, რომ გამოტოვებულ ფილტრს ვერ
გააჟონებს სხვა tenant-ის ხაზებს.
სისტემა / გვერდის ავლის რეჟიმი
ზოგიერთი სამუშაო ლეგიტიმურად არის ჯვარედინ-tenant — ფონური worker-ები, განრიგები და სარემონტო სამუშაოები, რომლებიც მუშაობს მთელ ინსტანციაში. ეს მუშაობს სისტემა / გვერდის ავლის რეჟიმში ისე, რომ მათ დაინახონ ის, რაც სჭირდებათ. გვერდის ავლა დაცულია სანდო შიდა worker-ებისთვის, არა მოთხოვნა-დამმუშავებელი ბილიკებისთვის.
[!WARNING] მიგრაციები ყოველთვის მუშაობს owner pool-ზე, არასოდეს შეზღუდული როლის ქვეშ. owner კავშირს აქვს პრივილეგიები სქემის შესაცვლელად და RLS პოლიტიკების გამოსაყენებლად; შეზღუდულ როლს განზრახ არ აქვს. შეინახეთ ორი კავშირის სტრიქონი განსხვავებული და მიანიჭეთ
aihummer_appროლს მხოლოდ ის, რაც სჭირდება.
იდემპოტენტური გვერდითი ეფექტები
ბრუნვას შეუძლია წარმოშვას რეალური გვერდითი ეფექტები: ფოსტის გაგზავნა, შეტყობინების უკან დაბრუნება არხში. თუ ბრუნვა ხელახლა სცადება — გარდამავალი შეცდომის გამო, ან იმის გამო, რომ gateway გადაიტვირთა ბრუნვის შუა გზაზე და აღდგენა ხელახლა უშვებს მას — ეს გვერდითი ეფექტები არ უნდა მოხდეს ორჯერ. AiHummer ამას უზრუნველყოფს ორი თანამშრომელი ნაწილით.
აღდგენა-სტაბილური ledger გასაღები
თითოეული გვერდითი ეფექტი ჩაიწერება აღდგენა-სტაბილური ledger გასაღების მიმართ: გასაღები, რომელიც წარმოიქმნება დეტერმინისტულად ბრუნვიდან, ისე რომ იმავე ბრუნვის განმეორება ითვლის იმავე გასაღებს, ვიდრე ახალს. ledger ახსოვს, რომელი გასაღებები უკვე განხორციელდა.
გვერდითი-ეფექტის ბარიერი
სანამ ეფექტი, როგორიცაა ფოსტა ან არხის-გაგზავნა, შესრულდება, ის გადის გვერდითი-ეფექტის ბარიერში, რომელიც ამოწმებს ledger-ს. თუ ეს გასაღები უკვე გასროლილია, ბარიერი მოკლე-შემოვლით მუშაობს და ეფექტი გამოტოვდება; თუ არა, ეფექტი მუშაობს და გასაღები ფიქსირდება.
side-effect requested
└─▶ compute resume-stable ledger key
└─▶ barrier: key already committed?
├─ yes ─▶ skip (no double-send)
└─ no ─▶ perform effect ─▶ commit key
შედეგი არის ზუსტად-ერთხელ გარე ქცევა მაშინაც კი, როცა მიწოდება შიგნით სულ-მცირე-ერთხელია. ხელახალი მცდელობები უსაფრთხოა კონსტრუქციით, რაც არის ის, რაც აძლევს ბრუნვის აღდგენას (იხ. მიწოდება, outbox და აღდგენა) შესაძლებლობას ხელახლა გაუშვას შეწყვეტილი ბრუნვა ისე, რომ მომხმარებელმა არ მიიღოს იგივე ელფოსტა ან იგივე პასუხი ორჯერ.
[!TIP] ეს არის მიზეზი, თუ რატომ შეუძლია AiHummer-ს შესთავაზოს გარანტირებული მიწოდება და ავტომატური ბრუნვის აღდგენა დუბლირებული შეტყობინებების ჩვეული რისკის გარეშე — იდემპოტენტურობა არის საფუძველი, რომელზეც აშენებულია მიწოდების გარანტიები.
სად შემდეგ
- runtime, რომელიც მართავს ბრუნვას: Gateway და ბრუნვის ძრავა.
- როგორ ბრუნდება პასუხები ზუსტად ერთხელ: მიწოდება, outbox და აღდგენა.