/* PostgreSQL-ის ორი სერვერი არსებობს: * PROD - OLTP სერვერი, * STATS - სერვერი გრძელვადიანი ანალიტიკური შეკვეთებისთვის. მიმდინარე სერვერზე, prod მონაცემთა ბაზაში, არსებობს დიდი (10Tb) ცხრილი შემდეგი სტრუქტურით: CREATE TABLE profiles( id SERIAL, data JSONB ) ცხრილში შეიძლება იყოს "ფუჭი ადგილები", ანუ ზოგი `id` შეიძლება გამოტოვებული იყოს. პროგრამის დაწერა საჭიროა, რომელიც კოპირებს ცხრილს profiles PROD-დან STATS-მდე. განსაზღვრილია, რომ გამოიყენება შემდეგი ინტერფეისები მონაცემთა ბაზებთან მუშაობისთვის: type Row []interface{} type Database interface { // ინტერფეისის რეალიზაცია შეუძლია კავშირების აღდგენა // SaveRows-ის გამოძახება არის იდემპოტენტური io.Closer GetMaxID(ctx context.Context) (uint64, error) LoadRows(ctx context.Context, minID, maxID uint64) ([]Row, error) // [minID, maxID] SaveRows(ctx context.Context, rows []Row) error } func Connect(ctx context.Context, dbname string) (Database, error) // CopyTable // თუ full=false, განაგრძეთ მონაცემების გადაცემა წინა შეცდომის ადგილიდან // თუ full=true, გადაიტანეთ ყველა მონაცემი func CopyTable(fromName string, toName string, full bool) error { // ... თქვენი კოდი } თუ გადაეცემა ვარიანტი `full=false`, პროგრამა უნდა განაგრძოს მონაცემების გადაცემა წინა შეცდომის ადგილიდან. თუ `full=true`, უნდა გადაიტანოს ყველა მონაცემი. **ძირითადი დონე**: - მონაცემების სერიული გადაცემა ერთ ნაკადში - შეცდომის შემდეგ აღდგენა (ვარიანტი `full=false`) დამატებითი ინფორმაცია: - თუ საჭიროია, შეგიძლიათ ინტერფეისი გააფართოვოთ თქვენი საკუთარი მეთოდებით - თუ საჭიროია, შეგიძლიათ პირდაპირ გამოიყენოთ **database/sql** პაკეტი
Golang
/* Տրված է նիշերի շղթա: գտնել i և j ցուցանիշների զույգերի քանակը (i <= j), որոնց միջև կրկնվող նիշեր չկան: "aba" շղթայի համար պատասխանն է 5: կարող է լինել ոչ միայն ASCII [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") */
/* ჩვენს უნდა გადავცეთ მონაცემები გარკვეული წყაროდან გარკვეულ მომხმარებელს. ამ დროს წყარო მცირე პარტიებს აძლევს (~ ათეულობით ჩანაწერი), ხოლო მომხმარებელი ოპტიმალურად მუშაობს დიდ პარტიებთან (~ ათასობით ჩანაწერი). რეალური მაგალითი - მონაცემების მიწოდება Kafka ტიპის რიგებიდან Clickhouse ბაზაში. წყარო: - პირობითად უსასრულო. - წყარო არასდროს აბრუნებს MaxItems-ზე მეტ ჩანაწერს ერთ გამოძახებაზე Next. - ერთ "სესიაში" (ფუნქცია Pipe-ის ერთ გამოძახებაში) წყარო ყოველ ჯერზე ახალ მონაცემებს აბრუნებს. - თუმცა, გადატვირთვის შემდეგ წყარო დაიწყებს წინა "დადასტურებულ" პოზიციიდან, რომელიც cookie-სით არის განსაზღვრული. ამიტომ, თითოეული მნიშვნელობა cookie-ს, რომელიც Next-ის გამოძახებამ დააბრუნა, უნდა იყოს დადასტურებული Commit-ის გამოძახებით, და ეს უნდა მოხდეს ზუსტად იმავე სერიაში, სადაც Next-მა დააბრუნა. მიღება: - არ შეუძლია ერთდროულად MaxItems-ზე მეტი დამუშავება. ძირითადი დონე: ფუნქცია func Pipe(p Producer, c Consumer) error-ის განხორციელება, რომელიც წყაროდან მონაცემებს კითხულობს, მათ დიდ ბუფერში აგროვებს და შემდეგ იღებს მას მიმღებში, და პროგრესს წყაროსთან ერთად განახლებას. რთულობა: Next, Process და Commit მეთოდები დაკავშირებულია ქსელურ გამოძახებებთან და შეიძლება დიდხანს გაგრძელდეს. მოსწრაფვისთვის, მონაცემების წაკითხვა, ჩაწერა და პროგრესის დადასტურება პარალელურად უნდა მოხდეს. ასე რომ, Process ან Commit-ის გამოძახების დროს, წყაროსგან კითხვა და ახალი ბუფერის შექმნა გაგრძელდეს. */
გთხოვთ ახსნათ დამოკიდებულებების საწინააღმდეგო პრინციპი და რატომ ირღვევა SOLID-ის პრინციპი პირდაპირი ზარის მეშვეობით რეპოზიტორიის მეთოდებზე გამოყენების შემთხვევიდან.
არსებობს თუ არა რაიმე ვადა?
როგორ განახორციელეთ შესრულებული მოთხოვნების სისწორის ტესტირება და ვალიდაცია?
რა განსხვავებაა ადგილობრივ, განვითარების, სექციის, წარმოების გარემოებს შორის?
როგორ ამოწმებს JWT თავის ნამდვილობას? როგორ დადასტურება, რომ ტოკენი არ არის ფალსიფიცირებული?
გააზიარე მონაცემთა ბაზების შესახებ — რომელთან მუშაობდი და ახლა რომელთან მუშაობ?
/* მიკროწარმოს არქიტექტურით შექმნილი აპლიკაცია არსებობს. მიკროწარმოს შეიძლება იყოს აბსტრაქტული Backend ინტერფეისის საშუალებით. მიკროწარმოს ერთ ნიმუშზე წვდომისთვის, შეგიძლიათ გამოიყენოთ უკვე რეალიზებული BackendImpl ტიპი. ყოველი მიკროწარმოს აქვს რამდენიმე ათეული ამუშავებული ნიმუში, თითოეული მის მისამართზე, addr. თუმცა, მიკროწარმოს ინდივიდუალური ნიმუშები არ არის საიმედო: შესაძლოა ჩავარდნენ, მიუწვდომელი იყოს ან გადატვირთული იყოს. ამიტომ, თქვენ უნდა განახორციელოთ Balancer ტიპი, რომელიც ასევე რეალიზებს Backend ინტერფეისს და ახორციელებს კლიენტის მხრიდან დატვირთვის ბალანსს მიკროწარმოს ნიმუშებს შორის, ყოველ ჯერზე არჩევანს აკეთებს **მცირე დატვირთულ** ნიმუშზე. */ type Request interface{} type Response interface{} type Backend interface { Invoke(ctx context.Context, req Request) (Response, error) } var _ Backend = &BackendImpl{} // addr შეიცავს კონკრეტული ნიმუშის ip:port მისამართს func NewBackend(addr string) *BackendImpl type Balancer struct { // TODO } var _ Backend = &Balancer{} // addrs შეიცავს ყველა ბალანსირებულ ნიმუშის მისამართებს func NewBalancer(addrs []string) *Balancer { // TODO }
გქონდათ გუნდის მართვის გამოცდილება?
რა ემატება პასუხს, როდესაც ფანჯარა ვალიდურია?
რა შეზღუდვა აქვს სემაფოროს და ბუფერულ არხს პარალელური მოთხოვნების შეზღუდვის გადაწყვეტილებად?
/* მიკროწესის არქიტექტურით შექმნილი აპლიკაცია არსებობს. მიკროწესის ინტერფეისის საშუალებით შეიძლება მისი აბსტრაქცია. მიკროწესის ერთ ნიმუშზე წვდომისთვის, შეგიძლიათ გამოიყენოთ BackendImpl ტიპი, რომელიც უკვე განხორციელებულია. ყოველი მიკროწესის რამდენიმე ათეული ამუშავებული ნიმუში აქვს, თითოეული თავისი მისამართით addr ხელმისაწვდომია. თუმცა, მიკროწესის ინდივიდუალური ნიმუშები საიმედო არაა: შეგვიძლია ჩავარდეს, მიუწვდომელი იყოს ან გადატვირთული იყოს. ამიტომ, თქვენ უნდა განახორციელოთ Balancer ტიპი, რომელიც ასევე განახორციელებს Backend ინტერფეისს და ახორციელებს მიკროწესის ნიმუშებს შორის მომხმარებლის მხარის დატვირთვის ბალანსირებას, ყოველ ჯერზე არჩევს **მცირე დატვირთულ** ნიმუშს. */
რა არის მაქსიმალური რაოდენობა მოთხოვნათა წამში (RPS), რომელსაც ყველაზე დატვირთული სერვისი უმკლავდა?
სამუშაო ფორმატი: დისტანციურად, ოფისში ან ჰიბრიდულად?
როგორ შევადაროთ ელემენტები რუკაზე? როგორ დავრწმუნდეთ, რომ ორი რუკა ემთხვევა ერთმანეთს?
JWT ტოკენი რა არის? რა შემადგენლობაშია?
აღწერეთ ალგორითმი ყველა უნიკალური სიმბოლოსთან ერთად სუბსტრინგების რაოდენობისთვის
დაწერეთ დავალება Go ენის გამოყენებით — პრაქტიკული ნაწილი (დეველოპერის ცხოვრების პრობლემები, ალგორითმების გარეშე): სერვისის გაუმჯობესება ან გამოსწორება. ხანგრძლივობა — 1,5 საათი.