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

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

რას ატარებს გათიშვის კაუჭი სინამდვილეში

Community OpenVPN 2.6-ში კაუჭის ცნობარი time_unix განსაზღვრავს იმ მომენტად, როცა კლიენტი დაუკავშირდა; ის დგინდება დაკავშირების კაუჭის გაშვებამდე და არ განისაზღვრება ხელახლა, როცა გათიშვის კაუჭი მოგვიანებით ამოქმედდება. time_duration აძლევს ამ სესიის ხანგრძლივობას წამებში, ამიტომ დასასრული დაახლოებით დაკავშირების დრო პლუს ხანგრძლივობაა. ორივე მთელი წამია და არც ერთი არ არის ის მომენტი, როცა თქვენმა მონაცემთა ბაზამ მოვლენა დაამუშავა. სწორედ ამ სამი დროის განცალკევება იწვევს იმას, რომ კორელაცია ძლებს, ნაცვლად იმისა, რომ მხოლოდ ტესტირებისას გამოიყურებოდეს სწორად.

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

რატომ არ არის აშკარა წყვილი უნიკალური

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

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

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

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

შვილობილი დაკავშირების სკრიპტის შიგნით დაყენებული გარემოს ცვლადები არ გადადიან მშობელი დემონის მოგვიანებით გათიშვის სკრიპტში, რადგან ეს სკრიპტები ცალკე პროცესებად მუშაობენ საკუთარი გარემოთი. ამიტომ დაკავშირების დროს UUID-ის გენერირება ნახევარი გადაწყვეტაა. გათიშვის მხარემ უნდა შეძლოს იმავე UUID-ის დასახელება, რაც ნიშნავს, რომ იდენტობა უნდა ცხოვრობდეს ისეთ ადგილას, სადაც ორივე მოვლენა მიაღწევს.

გახადეთ გაუქმება პირობითი და იდემპოტენტური

გააუქმეთ სესიის მფლობელის მიხედვით და არა მომხმარებლის. დამმუშავებელი, რომელიც შლის სახელს ამჟამად კუთვნილ ნებისმიერ გამოყოფას, საბოლოოდ არასწორს წაშლის, და ერთადერთი დაცვაა შეამოწმოთ, რომ მოხსნილი ჩანაწერი არის ის ჩანაწერი, რომელსაც ეს მოვლენა აღწერს.

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

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

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

დაკავშირებული სტატიები