რა არის back-end დეველოპმენტი
რას ნიშნავს ბექენდ დეველოპმენტი? ძირითადი პრინციპები და ტექნოლოგიები ძალიან მარტივად.
წარმოიდგინეთ, რომ ნებისმიერი ვებსაიტი დახვეწილი რესტორანია. მაშინ ფრონტენდი იქნება ის გაფორმებული დარბაზი, სადაც სხდებით, ხოლო ბექენდი კულისებს მიღმა არსებული სამზარეულო, რომელშიც რეალურად მზადდება თქვენი შეკვეთა! ცხადია, ყველაფერი ასე მარტივად არ არის, თუმცა ეს ანალოგია მაინც კარგი პირველი მიახლოებაა.
მოდით, რაიმე მაგალითი წარმოვიდგინოთ. როცა Netflix.com-ზე შედიხართ, თქვენ ფრონტენდი გაჩვენებთ ფილმების ლამაზ პოსტერებს, მაგრამ სწორედ ბექენდი იმახსოვრებს, რომ გუშინ ღამით მე-3 სერიაზე ჩაგეძინათ და ზუსტად იმ წამიდან გირთავთ ვიდეოს! ის ეძებს ფილმებს, ინახავს თქვენს პროფილს და აკეთებს ათას სხვა უხილავ მაგიას!
ახლა, დავუშვათ, თქვენ სქროლავთ Netflix-ს და წააწყდით კიდევ ერთ ახალ სერიალს, რომლის ნახვასაც საკუთარ თავს ჰპირდებით (და რომელიც, ალბათ, სამუდამოდ დარჩება თქვენს სანახავ სიაში). როგორც კი დააჭერთ ღილაკს „სიაში დამატება“, რა ხდება ამ დროს? მოდით, ყველაფერი სულ-სულ თავიდან დავიწყოთ!
კლიენტი და სერვერი: როგორ საუბრობენ კომპიუტერები
ნებისმიერ კომპიუტერს, რომელიც დაკავშირებულია ინტერნეტთან, მათ შორის თქვენსას და ჩემსას, შეუძლია ინტერნეტის საშუალებით გაუგზავნოს შეტყობინება სხვა კომპიუტერს, რომელიც ასევე ჩართულია ინტერნეტში. რომ გავამარტივოთ, Netflix-ს სადღაც თავის ოფისში აქვს კომპიუტერი და ჩვენი კომპიუტერი ამ სერვერს უგზავნის შეტყობინებას, რომ ფილმის შენახვა გვსურს. ამ სცენარში, კომპიუტერს, რომელიც აგზავნის შეტყობინებას, ეწოდება კლიენტი (client), ხოლო კომპიუტერს, რომელიც იღებს შეტყობინებას, სერვერი (server).
მაგრამ სანამ ეს მოხდება, უნდა ვიცოდეთ, რომ კომპიუტერებს თავისთავად არ შეუძლიათ ინტერნეტიდან შეტყობინებების მიღება. ჩვენ უნდა დავაპროგრამოთ ისინი, რათა შეტყობინებების მიღება შეძლონ. ამისთვის კი გვჭირდება ბექენდ პროგრამირების ენა. თითქმის ყველა პროგრამირების ენას აქვს ფუნქცია, რომელიც კომპიუტერს აქცევს სერვერად. ჩვენს შემთხვევაში მთავარი აქცენტი Python-ზე იქნება, თუმცა პოპულარული ბექენდ ენებია ასევე Java, php, Ruby, Rust, Go.
მხოლოდ ბექენდ პროგრამირების ენის გამოყენება ნულიდან საკმაოდ რთულია და უზარმაზარ კოდს მოითხოვს. ამიტომ არსებობს ორი ინსტრუმენტი, რომელიც ამაში გვეხმარება: ბექენდ ფრეიმვორკი (framework) და პაკეტების მენეჯერი (package manager).
ბექენდ ფრეიმვორკი გვეხმარება სერვერის ბევრად უფრო მარტივად და გაცილებით ნაკლები კოდით შექმნაში. Python-ის სამყაროში ყველაზე პოპულარული და მძლავრი ფრეიმვორკია Django (ასევე ცნობილია FastAPI და Flask). სხვა ენებისთვის კი არსებობს Express.js, Spring და ა.შ.
ბექენდში ჩვენ ასევე ხშირად ვიყენებთ სხვების მიერ დაწერილ კოდს, რომელსაც პაკეტები (packages) ეწოდება. ისინი გვეხმარება სტანდარტულ ამოცანებში, როგორიცაა მომხმარებლის ავტორიზაცია ან მონაცემთა ბაზასთან კომუნიკაცია. ჩვენს Django პროექტში უამრავ პაკეტს ვიყენებთ, ამიტომ მათ სამართავად გვჭირდება პაკეტების მენეჯერი. Python-ისთვის ეს არის PIP. სწორედ მისი დახმარებით ვაინსტალირებთ ნებისმიერ გარე ბიბლიოთეკას.
მონაცემთა ბაზები და მოთხოვნები (Requests)
შემდეგი პრობლემა ის არის, რომ გვჭირდება ადგილი ჩვენი ვებსაიტის მონაცემების შესანახად. Netflix-ის მაგალითზე, ეს არის მომხმარებლის ლოგინის მონაცემები, "ჩემი სიის" (My List) ჩანაწერები და თავად ფილმების აღწერები.
ამისათვის ვიყენებთ მონაცემთა ბაზას (database). მონაცემთა ბაზა არის პროგრამული უზრუნველყოფა, რომელიც სხვა კომპიუტერზეა გაშვებული. Django-ს შემთხვევაში, ინდუსტრიის სტანდარტი და ყველაზე ხშირად გამოყენებული ბაზა არის PostgreSQL, თუმცა შეგიძლიათ გამოიყენოთ MySQL ან MongoDB-იც. ჩვენ ვწერთ გარკვეულ კონფიგურაციას (Django-ს settings.py-ში), რათა ჩვენმა ბექენდმა ბაზასთან კომუნიკაცია შეძლოს.
თუ ახლა იწყებთ, ეს ძირითადად ყველაფერია, რაც ბექენდისთვის გჭირდებათ: სერვერი და მონაცემთა ბაზა.
აი, როგორ შეიძლება იმუშაოს Netflix-ის სცენარმა: როდესაც მომხმარებელი ამატებს ფილმს სიაში, ფრონტენდი აგზავნის შეტყობინებას ბექენდში. Django-ს ბექენდი იღებს ამ მოთხოვნას, ინახავს ჩანაწერს PostgreSQL-ის ბაზაში და ფრონტენდს უბრუნებს პასუხს, რომ ოპერაცია წარმატებით შესრულდა.
შეტყობინებას, რომელსაც ფრონტენდი უგზავნის ბექენდს, ეწოდება მოთხოვნა (request), ხოლო შეტყობინებას, რომელსაც ბექენდი უკან აბრუნებს — პასუხი (response). ამ პროცესს "მოთხოვნა-პასუხის ციკლი" ეწოდება.
ახლა მოდით უფრო ღრმად შევიდეთ და ვნახოთ, რა არის მოთხოვნის შიგნით. თავში გვაქვს მოთხოვნის ტიპი (type), დომენის სახელი (domain name) და URL მისამართი (URL path).
კომპანიამ იყიდა დომენი netflix.com და ისე დააკონფიგურირა, რომ ყველა მოთხოვნა მათ სერვერებზე წავიდეს. ტიპი და URL კი განსაზღვრავს მოქმედებას. მაგალითად, ეს შეიძლება იყოს POST მოთხოვნა /watchlist მისამართზე. Django-ში ჩვენ ვწერთ ე.წ. "View"-ებს (ან ვიყენებთ Django REST Framework-ს) იმის განსასაზღვრად, თუ როგორ დავამუშავოთ ეს მოთხოვნები.
მაგალითად:
POST /watchlist- ვიღებთ მოთხოვნას და ვინახავთ ახალ ფილმს მომხმარებლის სიაში.GET /watchlist- ამოვიღებთ სიას მონაცემთა ბაზიდან და ვაბრუნებთ პასუხად.DELETE /watchlist- ვშლით ფილმს სიიდან.
ამ წინასწარ განსაზღვრული წესებისა და დასაშვები მოთხოვნების ერთობლიობას ეწოდება API (Application Programming Interface).
მარტივად რომ ვთქვათ, API არის ერთგვარი "მენიუ" ან შუამავალი. ის ეუბნება ფრონტენდს: „აი, ეს არის იმ ბრძანებების (POST, GET, DELETE) ჩამონათვალი, რომელთა გაგებაც შემიძლია. თუ ამ წესების დაცვით მომმართავ, შესაბამის შედეგს დაგიბრუნებ.“ შესაბამისად, თუ გააგზავნით მოთხოვნას, რომელიც API-ს ამ წესებში არ წერია, ბექენდი შეცდომით (Error) გიპასუხებთ. მოთხოვნების ასეთ დასახელების კონვენციას კი ეწოდება REST (Representational State Transfer), ხოლო თავად API-ს — REST API. REST-ში POST ნიშნავს შექმნას, GET წამოღებას, DELETE წაშლას და ა.შ.
ინფრასტრუქტურა და ქლაუდ ტექნოლოგიები
ახლა ვისაუბროთ ინფრასტრუქტურაზე. დღესდღეობით კომპანიები ქირაობენ კომპიუტერებს "ქლაუდ" კომპანიებისგან. უდიდესი ქლაუდ პროვაიდერებია: AWS, GCP და Azure. სხვათაშორის, Netflix მთლიანად AWS-ზე მუშაობს.
ამ მოდელს ეწოდება IaaS (Infrastructure as a Service). ჩვენ ვქირაობთ ვირტუალურ მანქანებს (VMs). როდესაც Netflix-ზე ახალი სერიალის პრემიერაა და ტრაფიკი იზრდება, ქლაუდ ტექნოლოგიებით ჩვენ ვქმნით რამდენიმე VM-ს ერთი და იგივე Django კოდით, ხოლო მათ წინ ვაყენებთ Load Balancer-ს (დატვირთვის გამანაწილებელს). ის მოთხოვნებს თანაბრად ანაწილებს.
თუმცა ბევრი სერვერის ხელით მართვა რთულია. ამიტომ არსებობს PaaS (Platform as a Service). PaaS საშუალებას გვაძლევს უბრალოდ ავტვირთოთ ჩვენი Python კოდი, დანარჩენს კი პლატფორმა მიხედავს. Django დეველოპერებში ძალიან პოპულარული PaaS სერვისებია AWS Elastic Beanstalk, Railway, Render, PythonAnywhere და სხვა.
შემდეგი კონცეფცია არის მიკროსერვისები (Microservices). Netflix-ის ბექენდი მილიონობით ხაზი კოდია, ამიტომ ის დაყოფილია მრავალ პატარა ბექენდად. ერთი ბექენდი მართავს "ჩემს სიას", მეორე სერვისი აკეთებს ვიდეოს ენკოდინგს, მესამე — აგზავნის ელ. ფოსტას. ამას მიკროსერვისები ეწოდება. არ არის აუცილებელი ყველა სერვისი Python-ზე იყოს დაწერილი, ზოგი შეიძლება JavaScript-ს იყენებდეს.
თუ არ გვინდა მეილის სერვისი თავად დავწეროთ, შეგვიძლია გამოვიყენოთ ისეთი კომპანია, როგორიცაა MailGun ან SendGrid (რომელსაც Django-ში მარტივად ვაკავშირებთ django-anymail პაკეტით). როდესაც კომპანია უზრუნველყოფს მზა ბექენდს, ამას ეწოდება SaaS (Software as a Service).
დამატებითი ტექნოლოგიები, რომლებიც უნდა იცოდეთ
ბოლოს, განვიხილოთ რამდენიმე დამატებითი ტექნოლოგია რისი ცოდნას უმნიშნელოვანესია თანამედროვე back-end დეველოპერისთვის:
- ფაილების საცავი: ფილმის პოსტერების (ფოტოების) ან თავად ვიდეო ფაილების შესანახად ძირითადი ბაზა არ გამოდგება. ვიყენებთ "Blob" საცავს, როგორიცაა AWS S3 და CDN-ს (Django-ში ამას
django-storagesპაკეტით ვაგვარებთ). - ძიება: ტექსტური ძიებისთვის (მაგ. ფილმის სათაურის მოძებნა) ვიყენებთ საძიებო ბაზას, როგორიცაა ElasticSearch.
- ქეშირება: დიდი ტრაფიკისას ბაზის განსატვირთად ვიყენებთ ქეშს, როგორიცაა Redis. (Django-ს აქვს Redis-ის მძლავრი მხარდაჭერა სწრაფი ქეშირებისთვის).
- ანალიტიკა: მონაცემთა დასამუშავებლად მონაცემებს ვაკოპირებთ ანალიტიკურ ბაზაში, როგორიცაა Snowflake.
- ფონური დავალებები (Job Queue): რას აგვარებს ეს სერვისი? დავუშვათ, ნეტფლიქსს დასჭირდა, მეილი გამოგიგზავნოთ. მთავარი პრობლემა ის არის, რომ ელ. ფოსტის გაგზავნა ნელი პროცესია (შეიძლება 2-3 წამი დასჭირდეს). თუ Netflix-ის მთავარი სერვერი თავად დაიწყებს ათასობით მეილის გაგზავნას, ის უბრალოდ "გაიჭედება". ამ დროს სხვა მომხმარებლები საიტზე ფილმს ვერ ჩართავენ, რადგან სერვერი დაკავებულია მეილების გზავნით.
ამ ბლოგისთვის, ვფიქრობ, საკმარისია. დამწყებთათვის კარგია იცოდეთ Django-სა და PostgreSQL-ის გამოყენება. დანარჩენ ტექნოლოგიებს (Redis, Celery, S3) კი დაამატებთ მაშინ, როცა პროექტი უფრო მასშტაბური გახდება.
ავტორის შესახებ
გიგი ჩაკაბერია
back-end დეველოპერი და მენტორი