Инженерлік блог

Google Cloud Run-да серверсіз микросервистерді масштабтау

16.07.2026
Шарафутдинов Р.

Қазіргі таңда бұлттық технологиялар мен микросервистік архитектуралар әлемдік IT индустриясының негізгі қозғаушы күшіне айналды. Дәстүрлі физикалық серверлер мен виртуалды машиналардан (Virtual Machines) басталған эволюция контейнерлеуге (Containerization), ал кейіннен серверсіз (Serverless) есептеулер тұжырымдамасына ұласты. Бұл эволюцияның шыңы ретінде Google Cloud Platform (GCP) экожүйесіндегі ең озық өнімдердің бірі — Google Cloud Run қызметін атауға болады. Google Cloud Run — бұл контейнерленген қолданбаларды инфрақұрылымды басқарусыз-ақ іске қосуға және автоматты түрде масштабтауға мүмкіндік беретін толық басқарылатын (fully managed) платформа.

Дәстүрлі IaaS (Infrastructure as a Service) немесе тіпті PaaS (Platform as a Service) шешімдерімен салыстырғанда, Cloud Run әзірлеушілерді операциялық жүйелерді жаңарту, ядролық деңгейдегі қауіпсіздік патчтарын орнату, желілік маршрутизацияны баптау және кластерлерді басқару сияқты күрделі міндеттерден толықтай босатады. Сізге тек қолданбаңызды Docker немесе кез келген OCI (Open Container Initiative) стандартына сай келетін контейнерге орап, оны Google Artifact Registry қоймасына жүктеу жеткілікті. Қалған жұмыстың барлығын, соның ішінде gVisor контейнерлік құмсалғышы (sandbox) арқылы жоғары деңгейлі оқшаулауды қамтамасыз етуді Google Cloud өз мойнына алады. gVisor — бұл Google әзірлеген, контейнерлер мен хост операциялық жүйесі арасындағы қауіпсіздік шекарасын күшейтетін бағдарламалық жасақтама. Ол жүйелік шақыруларды (system calls) ұстап алып, оларды пайдаланушы кеңістігінде (user space) өңдейді, бұл бір хостта жұмыс істейтін әртүрлі клиенттердің контейнерлерінің бір-біріне ешқандай қауіп төндірмейтініне кепілдік береді.

Сонымен қатар, Cloud Run ашық бастапқы кодты Knative стандартына негізделген. Бұл дегеніміз, сіздің қолданбаңызда vendor lock-in (белгілі бір провайдерге тәуелділік) қаупі болмайды. Егер болашақта инфрақұрылымыңызды басқа бұлттық провайдерге немесе жеке серверлеріңіздегі Kubernetes кластеріне көшіргіңіз келсе, қолданба кодын немесе контейнер конфигурациясын өзгертпей-ақ, оны оңай жүзеге асыра аласыз.

Суық старттар (Cold Starts) мәселесінің терең талдауы

Серверсіз архитектуралардың ең көп талқыланатын және инженерлер үшін үлкен сынаққа айналатын мәселелерінің бірі — «суық старттар» (Cold Starts). Бұл құбылыстың табиғатын түсіну үшін Cloud Run-ның ішкі жұмыс механизміне үңілу керек. Егер сіздің сервисіңізге белгілі бір уақыт бойы (әдетте 15 минут) ешқандай сұрау (HTTP request) түспесе, платформа ресурстарды үнемдеу және шығындарды азайту мақсатында белсенді контейнерлер санын нөлге дейін төмендетеді. Бұл процесс scale-to-zero деп аталады.

Жаңа пайдаланушы сұрауы түскен кезде, платформа мынадай үш негізгі кезеңнен өтуге мәжбүр болады:

  1. Infrastructure Provisioning: Контейнерді іске қосу үшін қажетті виртуалды ресурстарды (процессор мен жад) бөлу.
  2. Container Pulling & Starting: Контейнер бейнесін (container image) ішкі реестрден жүктеп алу және оны gVisor ортасында іске қосу.
  3. Application Initialization: Қолданбаның өзін іске қосу, қажетті кітапханаларды жүктеу, дерекқорлармен алғашқы қосылымдарды орнату және белгіленген портты (әдетте PORT 8080) тыңдай бастау.

Осы кезеңдердің жиынтығы пайдаланушы үшін қосымша кідіріс (latency) тудырады. Бұл кідіріс қарапайым қолданбаларда бірнеше жүз миллисекундтан, ауыр Java немесе Spring Boot қолданбаларында 10-15 секундқа дейін созылуы мүмкін. Төмендегі диаграммада әртүрлі технологиялық стектердегі суық старт кідірісінің айырмашылығы көрсетілген:

Технологиялық стектер бойынша суық және жылы старт кідірісі

Түрлі бағдарламалау тілдеріндегі контейнерлердің іске қосылу уақытын салыстыру (миллисекундпен)

Суық старттардың әсерін барынша азайтудың бірнеше тиімді жолы бар. Ең бірінші және ең сенімді тәсіл — min-instances (экземплярлардың минималды саны) параметрін баптау. Мысалы, төмендегі gcloud командасы арқылы сервисіңіздің ең кемі 1 данасы әрқашан жұмыс істеп тұруын қамтамасыз ете аласыз:

gcloud run deploy my-service --image gcr.io/my-project/my-image --min-instances 1

Бұл параметрді орнатқан кезде, Cloud Run тіпті ешқандай трафик болмаса да, кем дегенде бір контейнерді белсенді күйде ұстайды. Бұл суық старт мәселесін толық жояды, бірақ белсенді тұрған инстанс үшін аздаған тұрақты шығын (baseline cost) төлеуіңіз керек екенін есте сақтаңыз. Сондай-ақ, Cloud Run жақында енгізген CPU allocation параметрін Always on (әрқашан қосулы) күйінен Only allocated during request processing (тек сұрауларды өңдеу кезінде ғана процессор бөлу) күйіне ауыстыру арқылы шығындарды оңтайландыруға болады.

Сонымен қатар, контейнердің өзін оңтайландыру өте маңызды. Dockerfile файлдарын жазғанда үлкен базалық бейнелерді (мысалы, толық Ubuntu немесе Debian бейнелерін) пайдаланбаңыз. Олардың орнына Alpine Linux немесе Google ұсынған distroless бейнелерін қолданыңыз. Мысалы, Node.js қолданбасы үшін қысқартылған Dockerfile келесідей болуы мүмкін:

FROM node:18-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --only=production
COPY . .
EXPOSE 8080
CMD [ "node", "server.js" ]

Қолданбаның іске қосылу уақытын (bootstrap time) қысқарту үшін код деңгейінде де оңтайландыру жүргізіңіз: қажетсіз кітапханаларды (dependencies) жойыңыз, файлдарды оқу сияқты ауыр операцияларды қолданба іске қосылған сәтте емес, сұрау түскен кезде асинхронды орындауға көшіріңіз (lazy initialization). Егер сіз Java тілін қолдансаңыз, GraalVM және Quarkus немесе Micronaut сияқты заманауи фреймворктерді пайдалану арқылы контейнердің іске қосылу жылдамдығын ондаған есе арттырып, суық старт уақытын 100 миллисекундқа дейін төмендете аласыз.

Сұрауларды параллельді өңдеу (Concurrency) және масштабтау

Cloud Run платформасының дәстүрлі FaaS (Function as a Service), мысалы AWS Lambda немесе Google Cloud Functions-пен салыстырғандағы басты артықшылықтарының бірі — сұрауларды параллельді өңдеу (Concurrency) мүмкіндігі болып табылады. Көптеген FaaS платформаларында бір контейнер (немесе функция данасы) бір уақытта Кем дегенде бір ғана сұрауды өңдей алады. Егер бір уақытта 100 сұрау түссе, платформа 100 жеке контейнерді іске қосуға мәжбүр болады, бұл өз кезегінде жаппай суық старттарға және ресурстардың тиімсіз жұмсалуына әкеледі.

Cloud Run-да әдепкі бойынша бір инстанс бір уақытта 80 сұрауға доғарыла алады (бұл мәнді 1000-ға дейін арттыруға болады). Бұл дегеніміз, егер сіздің сервисіңізге жоғары трафик түссе, бір ғана белсенді контейнер жүздеген пайдаланушының сұрауларын асинхронды түрде өңдей алады.

Осы параметрді қолмен теңшеу үшін келесі команданы пайдалануға болады:

gcloud run deploy my-service --image gcr.io/my-project/my-image --concurrency 150

Алайда, жоғары concurrency мәнін орнатпас бұрын, қолданбаңыздың ағынға қауіпсіздігін (thread-safety) және таңдалған технологиялық стекке сәйкестігін бағалау қажет. Мысалы, Node.js (бір ағынды Event Loop негізінде жұмыс істейді) немесе Go (жеңіл салмақты goroutines пайдаланады) сияқты технологиялар параллельділікті өте тиімді басқарады. Ал егер сіз Python (WSGI) немесе Ruby сияқты синхронды технологияларды қолдансаңыз, тым жоғары concurrency мәні қолданбаның жадының (RAM) таусылуына (Out of Memory) немесе процессордың шамадан тыс жүктелуіне әкелуі мүмкін.

Масштабтау алгоритмі сұраулардың келу жиілігі мен ағымдағы белсенді қосылымдар санын есептей отырып, жаңа инстанстарды іске қосу шешімін қабылдайды. Егер барлық жұмыс істеп тұрған инстанстардың орташа жүктемесі белгіленген concurrency шегіне жақындаса, Cloud Run автоматты түрде жаңа контейнерді іске қосады.

Дерекқорларға қауіпсіз және өнімді қосылу

Микросервистік архитектурада ең жиі кездесетін мәселелердің бірі — дерекқорлармен (Databases) қауіпсіз және өнімді байланыс орнату. Cloud Run сервисі секундтар ішінде жүздеген данаға дейін масштабтала алатындықтан, бұл дәстүрлі реляциялық дерекқорларға (мысалы, PostgreSQL немесе MySQL) үлкен қауіп төндіреді. Әрбір іске қосылған контейнер дерекқорға жаңа қосылым (connection) ашатын болса, дерекқордың максималды қосылымдар шегі (max_connections) өте тез таусылып, жүйенің істен шығуына (connection pool exhaustion) әкеп соғады.

Бұл мәселені шешудің негізгі жолдары:

  1. Қосылымдар пулын басқару (Connection Pooling): Қолданба деңгейінде қосылымдар пулын дұрыс баптау қажет. Мысалы, әрбір контейнерге ең көбі 5 немесе 10 тұрақты қосылым ашуға рұқсат беру керек.
  2. Cloud SQL Auth Proxy: Google Cloud SQL дерекқорына қауіпсіз қосылу үшін бұл құрал өте маңызды. Ол деректерді шифрлайды және IAM (Identity and Access Management) рөлдері арқылы авторизацияны қамтамасыз етеді.
  3. VPC Serverless Access Connector: Бұл технология Cloud Run-ға сыртқы интернет желісіне шықпай-ақ, ішкі виртуалды желі (VPC) арқылы дерекқорға тікелей және өте жылдам қосылуға мүмкіндік береді. Бұл тек қауіпсіздікті арттырып қана қоймай, желілік кідірісті (network latency) айтарлықтай азайтады.

Төмендегі сызбада желілік коннектор мен кәдімгі қосылым кезіндегі белсенді дерекқор қосылымдарының тиімділігі көрсетілген:

Инстанстар санына байланысты дерекқор қосылымдарының саны

Connection Pooling қолданылған және қолданылмаған кездегі белсенді қосылымдар санының артуы

Желілік коннекторды құру үшін gcloud құралын пайдалануға болады:

gcloud compute networks vpc-access connectors create my-connector --region us-central1 --range 10.8.0.0/28 --network my-vpc

Осыдан кейін, Cloud Run сервисін орналастырған кезде жасалған коннекторды көрсету қажет. Бұл дерекқормен жұмыс істеу кезіндегі қауіпсіздік пен жылдамдықты жаңа деңгейге көтереді. Сондай-ақ, рұқсат деңгейлерін шектеу үшін Ingress Settings параметрлерінде Internal-only немесе Internal and Cloud Load Balancing режимдерін таңдау ұсынылады.

Cloud CDN және жаһандық жүктеме баланстауышы

Кез келген жоғары жүктемелі жүйенің өнімділігін арттырудың ең тиімді әдісі — ол деректерді кэштеу (Caching). Егер сіздің Cloud Run сервисіңіз статикалық файлдарды немесе жиі өзгермейтін API жауаптарын қайтарса, бұл сұраулардың барлығын контейнер деңгейіне жеткізбей, жолда кэштеп алған жөн. Ол үшін Google Cloud CDN (Content Delivery Network) және Global HTTP(S) Load Balancer біріктірілімін пайдалану қажет.

Бұл архитектура келесідей жұмыс істейді:

  • Пайдаланушы сұрауы алдымен жаһандық жүктеме баланстауышына (Global Load Balancer) түседі.
  • Баланстауышқа жалғанған Cloud CDN сұралатын ақпараттың кэште бар-жоғын тексереді.
  • Егер ақпарат кэште болса (cache hit), ол пайдаланушыға ең жақын орналасқан Google Edge торабынан лезде қайтарылады.
  • Егер ақпарат кэште болмаса (cache miss), сұрау Serverless Network Endpoint Group (NEG) арқылы Cloud Run-ға бағытталады.

Бұл тәсіл Cloud Run инстанстарына түсетін жүктемені 80-90%-ға дейін азайтуға мүмкіндік береді, бұл өз кезегінде бұлттық инфрақұрылымға жұмсалатын шығындарды едәуір қысқартады. Кэштеуді басқару үшін қолданбаңыздан қайтарылатын HTTP тақырыпшаларын (мысалы, Cache-Control: public, max-age=3600) дұрыс баптау жеткілікті.

Нақты өмірдегі қолданыс мысалы

Нақты өмірден мысал келтіретін болсақ, ірі электронды коммерция (e-commerce) платформасының қараша айындағы жеңілдіктер науқаны (мысалы, "Қара жұма") кезінде трафик кенеттен 50 есеге артуы мүмкін. Дәстүрлі виртуалды машиналарда бұл жүйенің толық құлауына әкеп соғар еді. Ал дұрыс бапталған Cloud Run, VPC Access Connector, Cloud SQL Auth Proxy және Cloud CDN архитектурасы бұл жүктемені ешқандай инженердің араласуынсыз, автоматты түрде өңдей алады. Трафик басылғаннан кейін, жүйе қайтадан бастапқы қалыпқа келіп, сіз артық ресурстар үшін ақша төлемейсіз.

Қорытындылай келе, Google Cloud Run — заманауи бұлттық қолданбаларды әзірлеуге арналған теңдессіз құрал. Оның икемділігі, масштабталу жылдамдығы және үнемділігі оны шағын стартаптар үшін де, ірі корпоративтік жүйелер үшін де тамаша таңдау етеді. Жоғарыда айтылған суық старттарды оңтайландыру, параллельділікті дұрыс теңшеу және дерекқорлармен қауіпсіз байланыс орнату ережелерін сақтай отырып, сіз кез келген жүктемеге төтеп бере алатын, сенімді әрі жылдам өнімдер жасай аласыз.

Рустам Шарафутдинов

Рустам Шарафутдинов

Инженерлік блог авторы

Google Cloud архитектурасы саласындағы сарапшы және 15 жылдан астам тәжірибесі бар Senior Full-Stack әзірлеушісі. Ақауға төзімді архитектураларға, жоғары жүктемелі жобаларды оңтайландыруға және AI (Vertex AI) интеграциясына маманданған.

Сараптама: GCP, Kubernetes, Микросервистер, React, Node.js

Пікірлер (0)