Tip2Go монолиттік жобасын микросервистерге бөлу тәжірибем
Tip2Go жобасы өсе бастағанда, оның архитектурасын шұғыл өзгертуге тура келді. Бастапқыда жоба шағын болып, монолит форматында жасалғандықтан, оны сервистерге бөлу қызықты тапсырма болды!
Мен бірнеше рет айтқан жобамыз туралы. Біз қазір соңғы кезеңдеміз, оны достарымыз бен таныстарымыз қолданып жатыр, олардан кері байланыс алып, бірдеңелерді түзетіп немесе толықтырып жатырмыз.
Tip2Go бастапқыда Telegram-дағы бот ретінде және шектеулі функционалмен ойластырылғандықтан, мен оны барлық функционалды қамтитын монолит ретінде жасай бастадым. Бұл Docker-ге бәрін жинап, орналастыру үшін бір ғана команданы орындау жеткілікті болғанда өте ыңғайлы.
Бірақ жобаның идеясы дамыған сайын, егер оны монолиттік күйде қалдырсам, сервердің қуатын пропорционалды емес арттыруға тура келетінін түсіндім, бұл, тағы да, күту шығындарына әкеледі. Сондықтан мен жобаны әртүрлі серверлерге таратуға болатын сервистерге бөлу туралы шешім қабылдадым. Бақытымызға орай, мен бастапқыда бағдарламалаудағы заманауи тәсілдерді ұстандым және жоба, монолит бола тұра, ішінде өте жақсы жобаланған, SOLID принциптерін сақтаған.
Бұл жобадан қажетті объектілерді оңай бөліп алып, оларды негізгі жобаға зиян келтірмей, басқа жобаға тез көшіруге болатынын білдіреді. Жалғыз жауапкершілік принципі (single responsibility), ол SOLID аббревиатурасындағы S әрпіне жауап береді, өте маңызды. Егер мен объектілерге артық функционал қосқан болсам, оларды жеке сервиске бөлу оңай болмас еді.
Сонымен, сервистерге бөлінгеннен кейін жоба қандай болды?
Кірісте балансировщик, оның артында 4 сервис, дерекқор сыртқы IP-сыз жеке серверде, ал файлдар S3-те сақталады.
Мұндай архитектура бір серверге қарағанда екі есе арзан болып шықты. Бұл нұсқа монолитпен салыстырғанда икемді және сенімді.
Жобада сыртқа тек бір IP шығады және онда балансировщик орналасқан, ол сұрауларды ішкі сервистерге бағыттайды.
Егер сурет сұралса, сұрау файлдар сервисіне бағытталады. Мұнда мен суреттерді серверде бар-жоғын тексеру және сурет табылмаса, оның орнына бос сурет қайтару идеясын жүзеге асырдым.
Егер пайдаланушы басқару панеліне кіруді қаласа, алдымен негізгі сервиске авторизациялануы керек және жүйеде сәйкес рөлге ие болуы керек. Әйтпесе, пайдаланушыны негізгі сервис бетіне қайта бағыттайды.
Бот үшін, біз оны ұмытпадық және ол да жобада бар, бөлек сервиске шығарылды, оған тек белгілі IP мекенжайларынан қол жеткізуге болады, әйтпесе пайдаланушы қайтадан ботты іске қосу бетіне бағытталады.
Ал төртінші сервис, дәл пайдаланушыларға арналған, авторизацияланған және авторизацияланбаған пайдаланушыларға ашық. Әрине, авторизацияланған пайдаланушыларға көбірек функционал мен мүмкіндіктер беріледі. Бірақ авторизацияланбаған пайдаланушылар да жобаның беттерінде орналастырылған барлық тегін ақпаратқа қол жеткізе алады.
Бірақ бұл туралы келесі жолы айтамын.