Гузариш аз монолит ба микросервисҳо: таърих ва амалия

Дар ин мақола, ман дар бораи он сӯҳбат мекунам, ки чӣ гуна лоиҳае, ки ман дар он кор карда истодаам, аз як монолити калон ба маҷмӯи микросервисҳо табдил ёфт.

Лоиҳа таърихи худро хеле пештар, дар ибтидои соли 2000 оғоз карда буд. Нахустин версияҳо дар Visual Basic 6 навишта шуда буданд. Бо гузашти вақт маълум шуд, ки дар оянда таҳияи ин забон мушкил хоҳад буд, зеро IDE ва худи забон суст инкишоф ёфтааст. Дар охири солҳои 2000-ум тасмим гирифта шуд, ки ба C# гузарад. Версияи нав дар баробари таҷдиди нусхаи кӯҳна навишта шуда буд, тадриҷан дар .NET коди бештар ва бештар навишта мешуд. Backend дар C# дар аввал ба меъмории хидматҳо нигаронида шуда буд, аммо ҳангоми таҳия китобхонаҳои умумӣ бо мантиқ истифода мешуданд ва хидматҳо дар як раванди ягона ба кор андохта шуданд. Натиҷа як барномае буд, ки мо онро "монолити хидматрасонӣ" номидем.

Яке аз чанд бартариҳои ин комбинатсия қобилияти хидматрасонӣ барои занг задан ба ҳамдигар тавассути API берунӣ буд. Барои гузаштан ба хидматрасонии дурусттар ва дар оянда, меъмории микросервис шартҳои равшан мавҷуданд.

Мо кори худро дар бораи таҷзия тақрибан соли 2015 оғоз кардем. Мо то ҳол ба ҳолати идеалӣ нарасидаем - ҳанӯз қисматҳои лоиҳаи бузург вуҷуд доранд, ки онҳоро монолит номидан душвор аст, аммо онҳо ба микросервисҳо низ монанд нестанд. Бо вуҷуди ин, пешрафт назаррас аст.
Ман дар ин бора дар мақола гап мезанам.

Гузариш аз монолит ба микросервисҳо: таърих ва амалия

Мундариҷа

Архитектура ва проблемахои халли мавчуда


Дар аввал меъморӣ чунин менамуд: UI замимаи алоҳида аст, қисми монолитӣ дар Visual Basic 6 навишта шудааст, замимаи .NET маҷмӯи хидматҳои алоқаманд аст, ки бо пойгоҳи додаҳои хеле калон кор мекунанд.

Камбудиҳои ҳалли қаблӣ

Як нуқтаи ноком
Мо як нуқтаи нокомӣ доштем: барномаи .NET дар як раванди ягона кор мекард. Агар ягон модул ноком шавад, тамоми барнома ноком шуд ва бояд аз нав оғоз карда шавад. Азбаски мо шумораи зиёди равандҳоро барои корбарони гуногун автоматӣ мекунем, бинобар нокомӣ дар яке аз онҳо, ҳама муддате кор карда наметавонистанд. Ва дар сурати хатогии нармафзор, ҳатто нусхабардорӣ кӯмак накард.

Навбати беҳбудиҳо
Ин камбудй аз чихати ташкилй бештар аст. Замимаи мо муштариёни зиёде дорад ва ҳама мехоҳанд онро ҳарчи зудтар такмил диҳанд. Пештар ин корро мувози-на кардан мумкин набуд ва хамаи мизочон дар навбат меистанд. Ин раванд барои тиҷорат манфӣ буд, зеро онҳо бояд исбот кунанд, ки вазифаи онҳо арзишманд аст. Ва гурӯҳи таҳиягарон барои ташкили ин навбат вақт сарф карданд. Ин вақт ва саъю кӯшиши зиёдро талаб мекард ва маҳсулот дар ниҳоят наметавонист ба қадри имкон зуд тағйир ёбад, ки онҳо мехостанд.

Истифодаи ғайриқонунии захираҳо
Ҳангоми хостинги хидматҳо дар як раванди ягона, мо ҳамеша конфигуратсияро аз сервер ба сервер пурра нусхабардорӣ мекардем. Мо мехостем, ки хидматҳои пурборро дар алоҳидагӣ ҷойгир кунем, то захираҳоро исроф накунем ва аз болои нақшаи ҷойгиркунии худ назорати бештар фасењтар ба даст орем.

Татбиқи технологияҳои муосир мушкил аст
Мушкилоте, ки ба ҳама таҳиягарон шинос аст: хоҳиши ҷорӣ кардани технологияҳои муосир дар лоиҳа вуҷуд дорад, аммо имкон нест. Бо як ҳалли бузурги монолитӣ, ҳама гуна навсозии китобхонаи ҷорӣ, ба ғайр аз гузаштан ба китобхонаи нав, ба як вазифаи хеле ночиз табдил меёбад. Ба сардори бригада исбот кардан лозим аст, ки ин назар ба асабхои бехуда бештар мукофот медихад.

Мушкилот дар додани тағирот
Ин мушкилоти ҷиддитарин буд - мо ҳар ду моҳ релизҳоро мебаровардем.
Ҳар як нашр, сарфи назар аз озмоишҳо ва кӯшишҳои таҳиягарон ба як фалокати воқеӣ барои бонк табдил ёфт. Корхона фаҳмид, ки дар аввали ҳафта баъзе аз функсияҳои он кор намекунанд. Ва таҳиягарон фаҳмиданд, ки онҳоро як ҳафта ҳодисаҳои ҷиддӣ интизоранд.
Ҳама хоҳиши тағир додани вазъиятро доштанд.

Интизориҳо аз хидматрасонии микро


Ҳангоми тайёр кардани ҷузъҳо. Интиқоли ҷузъҳо ҳангоми омодагӣ тавассути таҷзияи маҳлул ва ҷудо кардани равандҳои гуногун.

Гурӯҳҳои хурди маҳсулот. Ин мухим аст, зеро коллективи калоне, ки дар монолити кухна кор мекард, идора кардан душвор буд. Чунин коллектив мачбур буд, ки аз руи процесси катъй кор кунад, вале бештар эчодкорй ва мустакилиятро мехостанд. Танҳо дастаҳои хурд метавонанд ин корро кунанд.

Ҷудокунии хидматҳо дар равандҳои алоҳида. Дар ҳолати беҳтарин, ман мехоҳам онро дар контейнерҳо ҷудо кунам, аммо шумораи зиёди хидматҳое, ки дар .NET Framework навишта шудаанд, танҳо дар зери он кор мекунанд WindowsХизматрасониҳо дар асоси .NET Core ҳоло пайдо мешаванд, аммо шумораи онҳо то ҳол кам аст.

Муваффақияти ҷойгиркунӣ. Мо мехоҳем хидматҳоро тавре муттаҳид созем, ки ба мо лозим аст, на тавре ки код онро маҷбур мекунад.

Истифодаи технологияҳои нав. Ин барои ҳар як барномасоз ҷолиб аст.

Мушкилоти гузариш


Албатта, агар як монолитро ба микросервисҳо шикастан осон мебуд, дар ин бора дар конфронсҳо сӯҳбат кардан ва мақола навиштан лозим намешуд. Дар ин процесс да-ракатдои зиёде мавчуданд, ман ондоеро, ки ба мо халал расонданд, тавсиф мекунам.

Мушкилоти аввал хоси аксари монолитҳо: ҳамоҳангии мантиқи тиҷорат. Вақте ки мо монолит менависем, мо мехоҳем синфҳои худро дубора истифода барем, то коди нолозим нанависем. Ва ҳангоми гузаштан ба микросервисҳо, ин мушкилот мегардад: ҳамаи рамзҳо ба таври зич пайваст шудаанд ва ҷудо кардани хидматҳо душвор аст.

Дар вакти огози кор анбор зиёда аз 500 лоиха ва зиёда аз 700 хазор хатти код дошт. Ин як қарори хеле бузург аст ва масъалаи дуюм. Онро танҳо гирифтан ва ба микросервисҳо тақсим кардан ғайриимкон буд.

Масъалаи сеюм — набудани инфраструктураи зарурй. Дар асл, мо рамзи сарчашмаро ба серверҳо дастӣ нусхабардорӣ мекардем.

Чӣ тавр аз монолит ба микросервисҳо гузаштан мумкин аст


Таъмини хидматрасониҳои хурд

Аввалан, мо дарҳол худамон муайян кардем, ки ҷудокунии микросервисҳо як раванди такрорист. Мо ҳамеша талаб мекарданд, ки мушкилоти тиҷоратро дар як вақт таҳия кунем. Чӣ тавр мо инро аз ҷиҳати техникӣ амалӣ хоҳем кард, аллакай мушкили мост. Аз ин рӯ, мо ба раванди такрорӣ омодагӣ гирифтем. Агар шумо як барномаи калон дошта бошед ва он дар аввал барои дубора навиштан омода набошад, он бо роҳи дигар кор намекунад.

Мо барои ҷудо кардани микросервисҳо кадом усулҳоро истифода мебарем?

Роҳи аввал — модулҳои мавҷударо ҳамчун хидмат интиқол диҳед. Дар ин робита, мо хушбахт будем: аллакай хидматҳое ба қайд гирифта шудаанд, ки бо протоколи WCF кор мекарданд. Онҳо ба маҷлисҳои алоҳида ҷудо карда шуданд. Мо онҳоро алоҳида интиқол додем ва ба ҳар як сохтмон як дастгоҳи хурд илова кардем. Он бо истифода аз китобхонаи аҷиби Topshelf навишта шудааст, ки ба шумо имкон медиҳад барномаро ҳам ҳамчун хидмат ва ҳам ҳамчун консол иҷро кунед. Ин барои ислоҳ кардан қулай аст, зеро дар ҳалли ягон лоиҳаи иловагӣ талаб карда намешавад.

Хидматҳо мувофиқи мантиқи тиҷорат пайваст карда шуданд, зеро онҳо маҷлисҳои умумиро истифода мебурданд ва бо пойгоҳи додаҳои умумӣ кор мекарданд. Онҳоро дар шакли софи худ микросервис номидан душвор аст. Аммо, мо метавонем ин хидматҳоро дар равандҳои гуногун алоҳида пешниҳод кунем. Факат хамин имконият дод, ки таъсири онхо ба хамдигар кам карда шуда, проблема бо инкишофи параллелй ва як нуктаи нокомй кам карда шавад.

Ассамблея бо мизбон танҳо як сатри код дар синфи Барнома аст. Мо корро бо Topshelf дар синфи ёрирасон пинҳон кардем.

namespace RBA.Services.Accounts.Host
{
   internal class Program
   {
      private static void Main(string[] args)
      {
        HostRunner<Accounts>.Run("RBA.Services.Accounts.Host");

       }
    }
}

Роҳи дуюми тақсимоти хидматрасониҳои хурд инҳоянд: барои халли проблемахои нав ба вучуд оваранд. Агар дар айни замон монолит нашъунамо наёбад, ин аллакай аъло аст, яъне мо дар самти дуруст ҳаракат мекунем. Барои ҳалли мушкилоти нав мо кӯшиш кардем, ки хидматҳои алоҳида эҷод кунем. Агар чунин имконият вуҷуд дошта бошад, пас мо хидматҳои бештари "каноникӣ"-ро таъсис додем, ки модели додаҳои худро комилан идора мекунанд, пойгоҳи додаҳои алоҳида.

Мо, мисли бисёриҳо, аз хидматрасонии аутентификатсия ва авторизатсия оғоз кардем. Онҳо барои ин комил ҳастанд. Онҳо мустақиланд, чун қоида, онҳо модели алоҳидаи маълумот доранд. Худи онхо бо монолит муомила намекунанд, факат барои халли баъзе масъалахо ба онхо мурочиат мекунад. Бо истифода аз ин хидматҳо, шумо метавонед гузариш ба меъмории навро оғоз кунед, инфрасохторро дар онҳо ислоҳ кунед, баъзе равишҳои марбут ба китобхонаҳои шабакавӣ ва ғайраро санҷед. Мо дар ташкилоти мо ягон гурӯҳе надорем, ки хидмати аутентификатсияро эҷод карда натавонанд.

Роҳи сеюми тақсимоти хидматрасонии хурдОн чизе, ки мо истифода мебарем, барои мо каме мушаххас аст. Ин нест кардани мантиқи тиҷорат аз қабати UI мебошад. Замимаи асосии UI мо мизи корӣ аст; он, ба монанди пуштибони, дар C# навишта шудааст. Таҳиягарон давра ба давра ба хатогиҳо роҳ медоданд ва қисмҳои мантиқро ба интерфейси UI интиқол медоданд, ки бояд дар паси ақиб вуҷуд дошта, дубора истифода мешуданд.

Агар шумо як мисоли воқеиро аз рамзи қисми UI нигаред, шумо мебинед, ки аксарияти ин ҳалли мантиқи воқеии тиҷоратро дар бар мегирад, ки на танҳо барои сохтани шакли UI, дар равандҳои дигар муфид аст.

Гузариш аз монолит ба микросервисҳо: таърих ва амалия

Мантиқи воқеии UI танҳо дар чанд сатри охирин мавҷуд аст. Мо онро ба сервер интиқол додем, то он дубора истифода шавад ва ба ин васила UI-ро коҳиш дод ва меъмории дурустро ба даст овард.

Роҳи чорум ва муҳимтарин барои ҷудо кардани хидматрасониҳои хурд, ки барои кам кардани монолит имкон медиҳад, бартараф кардани хидматҳои мавҷуда бо коркард мебошад. Вақте ки мо модулҳои мавҷударо ҳамон тавре ки ҳастем, хориҷ мекунем, натиҷа на ҳамеша ба таҳиягарон писанд аст ва шояд раванди тиҷорат аз замони таъсиси ин функсия кӯҳна шуда бошад. Бо рефакторинг, мо метавонем раванди нави тиҷоратиро дастгирӣ кунем, зеро талаботҳои тиҷорат доимо тағйир меёбанд. Мо метавонем рамзи сарчашмаро такмил диҳем, камбудиҳои маълумро бартараф кунем ва модели беҳтари додаҳоро эҷод кунем. Манфиатҳои зиёд ба даст оварда мешаванд.

Ҷудо кардани хидматҳо аз коркард бо мафҳуми контексти маҳдуд ба таври ногусастанӣ алоқаманд аст. Ин консепсия аз Domain Driven Design аст. Ин маънои қисмати модели доменро дорад, ки дар он тамоми истилоҳҳои як забони ягона ба таври нотакрор муайян карда шудаанд. Биёед мисоли контексти суғурта ва векселҳоро дида бароем. Мо як барномаи монолитӣ дорем ва мо бояд бо ҳисоб дар суғурта кор кунем. Мо интизорем, ки таҳиякунанда синфи мавҷудаи Ҳисобро дар маҷлиси дигар пайдо кунад ва ба он аз синфи суғурта истинод кунад ва мо рамзи корӣ хоҳем дошт. Принсипи DRY риоя карда мешавад, вазифа бо истифода аз рамзи мавҷуда зудтар иҷро карда мешавад.

Дар натиҷа, маълум мешавад, ки контекстҳои ҳисобҳо ва суғурта алоқаманданд. Вақте ки талаботҳои нав ба миён меоянд, ин пайвастшавӣ ба рушд халал мерасонад ва мураккабии мантиқи аллакай мураккаби тиҷоратиро афзоиш медиҳад. Барои ҳалли ин мушкилот, шумо бояд сарҳадҳои байни контекстҳоро дар код пайдо кунед ва вайронкуниҳои онҳоро бартараф кунед. Масалан, дар шароити суѓурта, комилан имконпазир аст, ки рақами суратҳисоби Бонки марказӣ аз 20-рақама ва санаи кушодани суратҳисоб кофӣ бошад.

Барои ҷудо кардани ин контекстҳои маҳдудшуда аз ҳамдигар ва оғози раванди ҷудо кардани хидматрасониҳои хурд аз ҳалли монолитӣ, мо равишеро ба мисли эҷоди APIҳои беруна дар дохили барнома истифода бурдем. Агар мо медонистем, ки баъзе модулҳо бояд ба хидматрасонии хурд табдил ёбанд, ки дар дохили раванд тағир дода шудаанд, мо фавран ба мантиқе, ки ба контексти маҳдуди дигар тааллуқ дорад, тавассути зангҳои беруна занг мезанем. Масалан, тавассути REST ё WCF.

Мо қатъиян тасмим гирифтем, ки аз коде, ки транзаксияҳои тақсимшударо талаб мекунад, канорагирӣ накунем. Дар ҳолати мо, риояи ин қоида хеле осон буд. Мо то ҳол ба ҳолатҳое дучор наомадаем, ки дар он амалиёти қатъии тақсимшуда воқеан лозим аст - мувофиқати ниҳоӣ байни модулҳо кофӣ аст.

Биёед мисоли мушаххасро дида бароем. Мо мафҳуми оркестрро дорем - лӯлае, ки объекти "ариза" -ро коркард мекунад. Вай дар навбати худ муштарӣ, суратҳисоб ва корти бонкиро эҷод мекунад. Агар муштарӣ ва ҳисоб бомуваффақият сохта шаванд, аммо эҷоди корт ноком шавад, барнома ба ҳолати "муваффақият" намегузарад ва дар ҳолати "корт сохта нашудааст" боқӣ мемонад. Дар оянда, фаъолияти замина онро гирифта, ба анҷом мерасонад. Система чанд вакт боз дар холати номувофикй буд, вале мо умуман аз ин каноатмандем.

Агар вазъияте ба миён ояд, ки ба таври доимӣ як қисми маълумотро захира кардан лозим аст, мо эҳтимоли зиёд барои муттаҳидсозии хидмат барои коркарди он дар як раванд меравем.

Биёед мисоли тақсимоти хидматрасонии хурдро бубинем. Чӣ тавр шумо онро нисбатан бехатар ба истеҳсолот оварда метавонед? Дар ин мисол, мо як қисми алоҳидаи система - модули хидматрасонии музди меҳнат дорем, ки яке аз қисмҳои коди онро мо мехоҳем микросервис созем.

Гузариш аз монолит ба микросервисҳо: таърих ва амалия

Пеш аз ҳама, мо тавассути навиштани код микросервис эҷод мекунем. Мо баъзе ҷиҳатҳоеро такмил медиҳем, ки аз онҳо қаноатманд набудем. Мо талаботҳои нави тиҷоратиро аз муштарӣ иҷро мекунем. Мо ба пайвастшавӣ байни UI ва пуштибонӣ API Gateway илова мекунем, ки интиқоли зангҳоро таъмин мекунад.

Гузариш аз монолит ба микросервисҳо: таърих ва амалия

Баъдан, мо ин конфигуратсияро ба кор мебарорем, аммо дар ҳолати озмоишӣ. Аксарияти корбарони мо то ҳол бо равандҳои бизнеси кӯҳна кор мекунанд. Барои корбарони нав, мо версияи нави барномаи монолитиро таҳия карда истодаем, ки дигар ин равандро дар бар намегирад. Аслан, мо маҷмӯи монолит ва микросервис дорем, ки ҳамчун пилот кор мекунанд.

Гузариш аз монолит ба микросервисҳо: таърих ва амалия

Бо пилоти муваффақ, мо мефаҳмем, ки конфигуратсияи нав воқеан қобили кор аст, мо метавонем монолити кӯҳнаро аз муодила хориҷ кунем ва конфигуратсияи навро ба ҷои ҳалли кӯҳна гузорем.

Гузариш аз монолит ба микросервисҳо: таърих ва амалия

Дар маҷмӯъ, мо қариб ҳамаи усулҳои мавҷударо барои тақсим кардани рамзи ибтидоии монолит истифода мебарем. Ҳамаи онҳо ба мо имкон медиҳанд, ки андозаи қисмҳои барномаро кам кунем ва онҳоро ба китобхонаҳои нав тарҷума кунем ва рамзи сарчашмаро беҳтар созем.

Кор бо базаи маълумот


Пойгоҳи додаҳоро аз коди сарчашма бадтар тақсим кардан мумкин аст, зеро он на танҳо схемаи ҷорӣ, балки маълумоти ҷамъшудаи таърихиро низ дар бар мегирад.

Махзани маълумотхои мо, мисли бисьёр дигарон, боз як камбудии мухим — хачми бузурги он дошт. Ин пойгоҳи додаҳо мувофиқи мантиқи мураккаби тиҷоратии як монолит тарҳрезӣ шудааст ва муносибатҳо дар байни ҷадвалҳои контекстҳои гуногуни маҳдудшуда ҷамъ шудаанд.

Дар ҳолати мо, барои бартараф кардани ҳама мушкилот (маъзани калон, пайвастҳои зиёд, баъзан сарҳадҳои норавшан байни ҷадвалҳо), мушкилоте ба миён омад, ки дар бисёр лоиҳаҳои калон рух медиҳад: истифодаи қолаби муштараки пойгоҳи додаҳо. Маълумот аз ҷадвалҳо тавассути намоиш, тавассути репликатсия гирифта шуда, ба системаҳои дигар фиристода мешуд, ки ин репликатсия лозим буд. Дар натиҷа, мо натавонистем ҷадвалҳоро ба схемаи алоҳида интиқол диҳем, зеро онҳо фаъолона истифода мешуданд.

Ҳамон тақсимот ба контекстҳои маҳдуд дар код ба мо дар ҷудошавӣ кӯмак мекунад. Он одатан ба мо тасаввуроти хуб медиҳад, ки чӣ гуна мо маълумотро дар сатҳи пойгоҳи додаҳо тақсим мекунем. Мо мефаҳмем, ки кадом ҷадвалҳо ба як контексти маҳдуд ва кадоме ба дигараш тааллуқ доранд.

Мо ду усули глобалии тақсимоти пойгоҳи додаҳоро истифода бурдем: тақсимоти ҷадвалҳои мавҷуда ва тақсимкунӣ бо коркард.

Ҷудо кардани ҷадвалҳои мавҷуда як усули хубест, ки агар сохтори додаҳо хуб бошад, ба талаботи тиҷорат ҷавобгӯ бошад ва ҳама аз он қаноатманд бошанд. Дар ин ҳолат мо метавонем ҷадвалҳои мавҷударо ба схемаи алоҳида ҷудо кунем.

Шӯъбаи коркард лозим аст, вақте ки модели бизнес хеле тағир ёфтааст ва ҷадвалҳо дигар моро тамоман қонеъ намекунанд.

Тақсим кардани ҷадвалҳои мавҷуда. Мо бояд муайян кунем, ки чиро ҷудо мекунем. Бе ин дониш, ҳеҷ чиз кор намекунад ва дар ин ҷо ҷудо кардани контекстҳои маҳдуд дар код ба мо кӯмак мекунад. Чун қоида, агар шумо ҳудуди контекстҳоро дар коди ибтидоӣ фаҳмед, маълум мешавад, ки кадом ҷадвалҳо бояд ба рӯйхат барои кафедра дохил карда шаванд.

Биёед тасаввур кунем, ки мо ҳалли худро дорем, ки дар он ду модули монолитӣ бо як пойгоҳи додаҳо ҳамкорӣ мекунанд. Мо бояд боварӣ ҳосил кунем, ки танҳо як модул бо қисмати ҷадвалҳои ҷудошуда ҳамкорӣ мекунад ва дигаре бо он тавассути API кор мекунад. Барои оғоз кардан, кофӣ аст, ки танҳо сабт тавассути API анҷом дода шавад. Ин як шарти зарурист, ки мо дар бораи мустақилияти микросервисҳо сӯҳбат кунем. Пайвастҳои хондан метавонанд то он даме, ки ягон мушкилии калон вуҷуд надорад, боқӣ монад.

Гузариш аз монолит ба микросервисҳо: таърих ва амалия

Қадами навбатӣ ин аст, ки мо метавонем қисмати кодеро, ки бо ҷадвалҳои ҷудошуда кор мекунад, бо коркард ё бидуни коркард ба як микросервиси алоҳида ҷудо карда, онро дар як раванди алоҳида, як контейнер иҷро кунем. Ин хидмати алоҳида бо пайвастшавӣ ба пойгоҳи додаҳои монолитӣ ва ҷадвалҳое хоҳад буд, ки мустақиман ба он алоқаманд нестанд. Монолит то ҳол барои хондан бо қисми ҷудошаванда ҳамкорӣ мекунад.

Гузариш аз монолит ба микросервисҳо: таърих ва амалия

Баъдтар мо ин пайвастро нест мекунем, яъне хондани маълумот аз замимаи монолитӣ аз ҷадвалҳои ҷудошуда низ ба API интиқол дода мешавад.

Гузариш аз монолит ба микросервисҳо: таърих ва амалия

Баъдан, мо аз базаи умумӣ ҷадвалҳоеро интихоб мекунем, ки бо онҳо танҳо микросервиси нав кор мекунад. Мо метавонем ҷадвалҳоро ба схемаи алоҳида ё ҳатто ба пойгоҳи додаҳои физикии алоҳида интиқол диҳем. Байни микросервис ва пойгоҳи додаи монолитӣ ҳанӯз ҳам робитаи хониш мавҷуд аст, аммо ҳеҷ чизи ташвишовар нест, дар ин конфигуратсия он метавонад муддати тӯлонӣ зиндагӣ кунад.

Гузариш аз монолит ба микросервисҳо: таърих ва амалия

Қадами охирин ин комилан нест кардани ҳама пайвастҳо мебошад. Дар ин ҳолат, ба мо лозим аст, ки маълумотро аз пойгоҳи додаҳои асосӣ интиқол диҳем. Баъзан мо мехоҳем баъзе маълумот ё директорияҳои аз системаҳои беруна нусхабардорӣшударо дар якчанд пойгоҳи додаҳо дубора истифода барем. Ин бо мо давра ба давра рӯй медиҳад.

Гузариш аз монолит ба микросервисҳо: таърих ва амалия

Шӯъбаи коркард. Ин усул ба усули аввал хеле монанд аст, танҳо бо тартиби баръакс. Мо фавран пойгоҳи нав ва микросервиси навро ҷудо мекунем, ки бо монолит тавассути API ҳамкорӣ мекунад. Аммо дар айни замон, маҷмӯи ҷадвалҳои пойгоҳи додаҳо боқӣ мемонад, ки мо мехоҳем дар оянда нест кунем. Мо дигар ба он ниёз надорем, мо онро дар модели нав иваз кардем.

Гузариш аз монолит ба микросервисҳо: таърих ва амалия

Барои он ки ин нақша кор кунад, ба мо эҳтимол давраи гузариш лозим мешавад.

Пас ду равиши имконпазир вуҷуд дорад.

Аввал: мо ҳама маълумотро дар базаҳои нав ва кӯҳна такрор мекунем. Дар ин ҳолат, мо зиёдатии маълумот дорем ва мушкилоти ҳамоҳангсозӣ метавонад ба миён ояд. Аммо мо метавонем ду муштарии гуногунро гирем. Яке бо версияи нав, дигаре бо версияи кӯҳна кор хоҳад кард.

Дуюм: мо маълумотро мувофиқи баъзе меъёрҳои тиҷорат тақсим мекунем. Масалан, мо дар система 5 маҳсулот доштем, ки дар базаи кӯҳна нигоҳ дошта мешуданд. Мо шашумро дар доираи вазифаи нави тиҷоратӣ дар базаи нав ҷойгир мекунем. Аммо ба мо API Gateway лозим аст, ки ин маълумотро ҳамоҳанг созад ва ба муштарӣ аз куҷо ва чӣ гирифтанро нишон диҳад.

Ҳарду равиш кор мекунанд, вобаста ба вазъият интихоб кунед.

Пас аз он ки мо боварӣ дорем, ки ҳама чиз кор мекунад, қисми монолитро, ки бо сохторҳои кӯҳнаи пойгоҳи додаҳо кор мекунад, ғайрифаъол кардан мумкин аст.

Гузариш аз монолит ба микросервисҳо: таърих ва амалия

Қадами охирин тоза кардани сохторҳои кӯҳнаи додаҳо мебошад.

Гузариш аз монолит ба микросервисҳо: таърих ва амалия

Барои ҷамъбаст, мо метавонем бигӯем, ки мо бо базаи маълумот мушкилот дорем: кор бо он нисбат ба коди ибтидоӣ душвор аст, мубодила кардан душвортар аст, аммо онро метавон иҷро кард ва бояд анҷом дод. Мо баъзе роҳҳоеро пайдо кардем, ки ба мо имкон медиҳанд, ки ин корро комилан бехатар анҷом диҳем, аммо ба ҳар ҳол хато кардан бо додаҳо нисбат ба рамзи сарчашма осонтар аст.

Кор бо рамзи сарчашма


Вақте ки мо ба таҳлили лоиҳаи монолитӣ шурӯъ кардем, диаграммаи коди манбаъ чунин буд.

Гузариш аз монолит ба микросервисҳо: таърих ва амалия

Онро тақрибан ба се қабат тақсим кардан мумкин аст. Ин як қабати модулҳои оғозшуда, плагинҳо, хидматҳо ва фаъолиятҳои инфиродӣ мебошад. Дар асл, инҳо дар дохили як ҳалли монолитӣ нуқтаҳои вуруд буданд. Ҳамаи онҳо бо қабати умумӣ маҳкам баста шуданд. Он мантиқи тиҷорӣ дошт, ки хидматҳо муштарак ва пайвастагиҳои зиёде доранд. Ҳар як хидмат ва плагин, вобаста ба андоза ва виҷдони таҳиягарон, то 10 ё бештар аз анҷуманҳои умумӣ истифода мешуд.

Мо хушбахтем, ки китобхонаҳои инфрасохторӣ дорем, ки онҳоро алоҳида истифода бурдан мумкин аст.

Баъзан вазъияте ба миён меояд, ки баъзе объектҳои умумӣ воқеан ба ин қабат тааллуқ надоштанд, балки китобхонаҳои инфрасохторӣ буданд. Ин бо роҳи тағир додани ном ҳал карда шуд.

Бузургтарин нигаронӣ контекстҳои маҳдуд буд. Чунин рӯй дод, ки 3-4 контекст дар як маҷлиси умумӣ омехта шуда, ҳамдигарро дар доираи як вазифаҳои корӣ истифода мекарданд. Фаҳмидани он лозим буд, ки онро дар куҷо ва дар кадом сарҳад тақсим кардан мумкин аст ва минбаъд бо харитасозии ин тақсимот ба ассамблеяҳои коди ибтидоӣ чӣ бояд кард.

Мо якчанд қоидаҳоро барои раванди тақсимоти код таҳия кардем.

Аввал: Мо дигар намехостем, ки мантиқи тиҷоратро байни хидматҳо, фаъолиятҳо ва плагинҳо мубодила кунем. Мо мехостем, ки мантиқи тиҷоратро дар дохили хидматрасонии микросервис мустақил созем. Микросервисҳо, аз тарафи дигар, идеалӣ ҳамчун хидматҳое ҳисобида мешаванд, ки комилан мустақилона вуҷуд доранд. Ман боварӣ дорам, ки ин равиш то андозае беҳуда аст ва ба он ноил шудан душвор аст, зеро масалан, хидматҳо дар C# дар ҳар сурат тавассути китобхонаи стандартӣ пайваст карда мешаванд. Системаи мо бо C# навишта шудааст; мо то ҳол технологияҳои дигарро истифода накардаем. Аз ин рӯ, мо тасмим гирифтем, ки мо метавонем ба истифода аз ассотсиатсияҳои техникии умумӣ тавонем. Муҳим он аст, ки онҳо ягон порча аз мантиқи тиҷорат надоранд. Агар шумо дар болои ORM истифода мебаред, як бастаи қулай дошта бошед, пас нусхабардории он аз хидмат ба хидмат хеле гарон аст.

Дастаи мо як мухлиси тарҳрезии домен аст, аз ин рӯ меъмории пиёз барои мо мувофиқ буд. Асоси хидматҳои мо на қабати дастрасии додаҳо, балки маҷмӯа бо мантиқи домен мебошад, ки танҳо мантиқи тиҷоратро дар бар мегирад ва бо инфрасохтор робита надорад. Ҳамзамон, мо метавонем мустақилона маҷмӯи доменҳоро барои ҳалли мушкилоти марбут ба чаҳорчӯба тағир диҳем.

Дар ин марҳила мо бо аввалин мушкилоти ҷиддии худ рӯ ба рӯ шудем. Хизмат бояд ба як маҷлиси домен муроҷиат кунад, мо мехостем мантиқро мустақил кунем ва принсипи DRY ба мо дар ин ҷо хеле халал расонд. Таҳиягарон мехостанд, ки синфҳоро аз маҷлисҳои ҳамсоя дубора истифода баранд, то такрор нашаванд ва дар натиҷа, доменҳо дубора ба ҳам пайваст шуданд. Мо натиҷаҳоро таҳлил кардем ва қарор додем, ки шояд мушкилот низ дар соҳаи дастгоҳи нигаҳдории коди сарчашма бошад. Мо як анбори калон доштем, ки ҳама рамзи сарчашмаро дар бар мегирад. Ҳалли тамоми лоиҳа дар мошини маҳаллӣ ҷамъоварӣ кардан хеле душвор буд. Аз ин рӯ, барои қисматҳои лоиҳа қарорҳои хурди ҷудогона таҳия карда шуданд ва ҳеҷ кас ба онҳо илова кардани ягон маҷмӯи умумӣ ё домен ва истифодаи дубораи онҳоро манъ накардааст. Ягона воситае, ки ба мо имкон намедод, ки ин корро кунем, баррасии код буд. Аммо баъзан он ҳам ноком мешуд.

Пас аз он мо ба модели дорои анборҳои алоҳида гузаштан шурӯъ кардем. Мантиқи тиҷорат дигар аз хидмат ба хидмат намегузарад, доменҳо воқеан мустақил шуданд. Контекстҳои маҳдудшуда равшантар дастгирӣ карда мешаванд. Чӣ тавр мо китобхонаҳои инфрасохториро дубора истифода мебарем? Мо онҳоро ба як анбори алоҳида ҷудо кардем ва сипас онҳоро ба бастаҳои Nuget ҷойгир кардем, ки мо онҳоро ба Artifactory гузоштем. Бо ҳар гуна тағирот, ҷамъбаст ва нашр ба таври худкор сурат мегирад.

Гузариш аз монолит ба микросервисҳо: таърих ва амалия

Хидматҳои мо ба бастаҳои инфрасохтори дохилӣ ба мисли бастаҳои беруна муроҷиат карданд. Мо китобхонаҳои берунаро аз Nuget зеркашӣ мекунем. Барои кор бо Artifactory, ки мо ин бастаҳоро ҷойгир кардем, мо ду мудири бастаҳоро истифода мебарем. Дар анбори хурд мо инчунин Nuget-ро истифода мебарем. Дар анборҳои дорои хидматҳои гуногун, мо пакетро истифода мебарем, ки мутобиқати бештари версияи байни модулҳоро таъмин мекунад.

Гузариш аз монолит ба микросервисҳо: таърих ва амалия

Ҳамин тариқ, бо кор кардан дар коди ибтидоӣ, каме тағир додани меъморӣ ва ҷудо кардани анборҳо, мо хидматҳои худро мустақилтар мегардонем.

Проблемаҳои инфрасохтор


Аксари нуқсонҳои гузаштан ба хидматрасонии микроэлементҳо бо инфрасохтор алоқаманданд. Шумо ба ҷойгиркунии автоматӣ ниёз доред, ба шумо китобхонаҳои нав лозим аст, то инфрасохторро идора кунед.

Насбкунии дастӣ дар муҳитҳо

Дар аввал, мо ҳалли муҳити атрофро дастӣ насб кардем. Барои автоматикунонии ин раванд, мо қубури CI/CD-ро сохтем. Мо раванди интиқоли муттасилро интихоб кардем, зеро густариши пайваста барои мо аз нуқтаи назари равандҳои тиҷорат ҳанӯз қобили қабул нест. Аз ин рӯ, фиристодан барои амалиёт бо истифода аз тугма ва барои санҷиш - ба таври худкор анҷом дода мешавад.

Гузариш аз монолит ба микросервисҳо: таърих ва амалия

Мо барои нигоҳдории рамзи сарчашма Atlassian, Bitbucket ва барои сохтмон бамбук истифода мебарем. Мо мехоҳем дар торт скриптҳои бунёдӣ нависем, зеро он бо C# якхела аст. Бастаҳои тайёр ба Artifactory меоянд ва Ansible ба таври худкор ба серверҳои санҷишӣ ворид мешавад, ки пас аз он онҳо метавонанд фавран санҷида шаванд.

Гузариш аз монолит ба микросервисҳо: таърих ва амалия

Сабти алоҳида


Як вактхо яке аз идеяхои монолит таъмин намудани чубу тахтаи муштарак буд. Мо инчунин бояд фаҳмем, ки бо сабтҳои инфиродӣ, ки дар дискҳо мавҷуданд, чӣ кор кардан лозим аст. Журналҳои мо ба файлҳои матнӣ навишта мешаванд. Мо тасмим гирифтем, ки стеки стандартии ELK-ро истифода барем. Мо ба ELK мустақиман тавассути провайдерҳо нанавиштем, аммо тасмим гирифтем, ки гузоришҳои матниро тағир диҳем ва ID-и пайгирӣ дар онҳо ҳамчун идентификатор нависем ва номи хидматро илова кунем, то ин гузоришҳо баъдтар таҳлил карда шаванд.

Гузариш аз монолит ба микросервисҳо: таърих ва амалия

Бо ёрии Filebeat мо метавонем гузоришҳои худро аз серверҳо, сипас онҳоро табдил диҳед, аз Kibana барои сохтани дархостҳо дар UI истифода баред ва бубинед, ки чӣ гуна занг байни хидматҳо равона карда шудааст. ID-ҳои пайгирӣ барои ин хеле муфиданд.

Санҷиш ва ислоҳи хидматҳои марбут


Дар аввал, мо пурра нафаҳмидем, ки чӣ гуна ислоҳ кардани хидматҳои таҳияшаванда. Бо монолит ҳама чиз оддӣ буд, мо онро дар мошини маҳаллӣ идора кардем. Дар аввал онҳо кӯшиш мекарданд, ки бо хидматрасонии микросервис низ ҳамин тавр кунанд, аммо баъзан барои пурра ба кор андохтани як микросервис, шумо бояд якчанд хидмати дигарро оғоз кунед ва ин нороҳат аст. Мо фаҳмидем, ки мо бояд ба моделе гузарем, ки дар мошини маҳаллӣ танҳо хидмат ё хидматҳоеро, ки мо мехоҳем ислоҳ кунем, мегузорем. Хидматҳои боқимонда аз серверҳое истифода мешаванд, ки ба конфигуратсия бо prod мувофиқат мекунанд. Пас аз ислоҳкунӣ, ҳангоми санҷиш, барои ҳар як вазифа танҳо хидматҳои тағирёфта ба сервери санҷишӣ дода мешаванд. Ҳамин тариқ, маҳлул дар он шакле санҷида мешавад, ки дар оянда дар истеҳсолот пайдо мешавад.

Серверҳое ҳастанд, ки танҳо версияҳои истеҳсолии хидматҳоро иҷро мекунанд. Ин серверҳо дар сурати рух додани ҳодисаҳо, барои тафтиши таҳвил пеш аз ҷойгиркунӣ ва омӯзиши дохилӣ лозиманд.

Мо бо истифода аз китобхонаи машҳури Specflow раванди санҷиши автоматиро илова кардем. Санҷишҳо ба таври худкор бо истифода аз NUnit фавран пас аз ҷойгиркунӣ аз Ansible иҷро мешаванд. Агар фарогирии вазифа комилан автоматӣ бошад, пас барои санҷиши дастӣ лозим нест. Гарчанде ки баъзан санҷиши иловагии дастӣ ҳанӯз талаб карда мешавад. Мо барчаспҳоро дар Jira истифода мебарем, то муайян кунем, ки кадом озмоишҳо барои як масъалаи мушаххас иҷро мешаванд.

Илова бар ин, эҳтиёҷ ба озмоиши сарборӣ афзоиш ёфтааст, қаблан он танҳо дар ҳолатҳои кам гузаронида мешуд. Мо барои гузаронидани санҷишҳо JMeter, барои нигоҳ доштани онҳо InfluxDB ва барои сохтани графикҳои раванд Grafana истифода мебарем.

Мо ба чй ноил шудем?


Аввалан, мо аз мафҳуми «озод кардан» халос шудем. Варақаҳои даҳшатноки думоҳа, вақте ки ин колосс дар муҳити истеҳсолӣ ҷойгир карда шуда, равандҳои тиҷоратро муваққатан халалдор мекард, аз байн рафтанд. Ҳоло мо хидматҳоро ба ҳисоби миёна ҳар 1,5 рӯз ҷойгир карда, онҳоро гурӯҳбандӣ мекунем, зеро онҳо пас аз тасдиқ ба кор медароянд.

Дар системаи мо ягон нокомии марговар нест. Агар мо микросервисро бо иштибоҳ бароварем, он гоҳ функсияи марбут ба он вайрон мешавад ва ба ҳама функсияҳои дигар таъсир намерасонанд. Ин таҷрибаи корбарро хеле беҳтар мекунад.

Мо метавонем намунаи ҷойгиркуниро назорат кунем. Агар лозим бошад, шумо метавонед гурӯҳҳои хидматҳоро аз қисми боқимондаи ҳалли алоҳида интихоб кунед.

Илова бар ин, мо мушкилотро бо навбати калони такмилдиҳӣ хеле кам кардем. Ҳоло мо гурӯҳҳои алоҳидаи маҳсулот дорем, ки бо баъзе хидматҳо мустақилона кор мекунанд. Раванди Scrum аллакай дар ин ҷо мувофиқ аст. Гурӯҳи мушаххас метавонад соҳиби Маҳсулоти алоҳида дошта бошад, ки ба он вазифаҳо медиҳад.

Натиҷа

  • Микросервисҳо барои вайрон кардани системаҳои мураккаб хуб мувофиқанд. Дар ин раванд, мо мефаҳмем, ки дар системаи мо чӣ мавҷуд аст, чӣ гуна контекстҳои маҳдуд мавҷуданд, сарҳадҳои онҳо дар куҷо ҷойгиранд. Ин ба шумо имкон медиҳад, ки такмилҳоро дар байни модулҳо дуруст тақсим кунед ва нофаҳмиҳои кодро пешгирӣ кунед.
  • Микросервисҳо манфиатҳои ташкилӣ медиҳанд. Дар бораи онҳо аксар вақт танҳо ҳамчун меъморӣ сухан мегӯянд, аммо ҳар як меъморӣ барои ҳалли эҳтиёҷоти тиҷорат лозим аст, на худ. Аз ин рӯ, мо метавонем бигӯем, ки микросервисҳо барои ҳалли мушкилот дар дастаҳои хурд мувофиқанд, бо назардошти он, ки Scrum ҳоло хеле маъмул аст.
  • Ҷудокунӣ як раванди такрорист. Шумо наметавонед ягон барномаро қабул кунед ва онро ба микросервисҳо тақсим кунед. Маҳсулоте, ки дар натиҷа ба даст омадааст, аз эҳтимол дур нест. Ҳангоми бахшидани хидматҳои хурд, аз нав навиштани мероси мавҷуда, яъне табдил додани он ба коде, ки ба мо маъқул аст ва аз ҷиҳати функсионалӣ ва суръат эҳтиёҷоти тиҷоратро беҳтар қонеъ мекунад, муфид аст.

    Як огоҳии хурд: Хароҷоти гузариш ба хидматрасониҳои микроорганизмҳо хеле назаррасанд. Барои халли як худи проблемам инфраструктура вакти зиёд лозим шуд. Ҳамин тавр, агар шумо як барномаи хурде дошта бошед, ки миқёси мушаххасро талаб намекунад, ба шарте ки шумо шумораи зиёди муштариён барои таваҷҷӯҳ ва вақти дастаи шумо рақобат накунанд, пас хидматрасониҳои хурд шояд он чизе ки имрӯз ба шумо лозим нест. Ин хеле гарон аст. Агар шумо ин равандро бо хидматрасонии хурд оғоз кунед, пас хароҷот дар аввал нисбат ба ҳамон як лоиҳа бо таҳияи монолит оғоз карда мешавад, зиёдтар хоҳад буд.

    PS Ҳикояи бештар эҳсосотӣ (ва гӯё барои шумо шахсан) - мувофиқи пайванд.
    Дар ин ҷо нусхаи пурраи гузориш аст.

Манбаъ: will.com

Хостинги боэътимодро барои сайтҳо бо муҳофизати DDoS, серверҳои VPS VDS харед 🔥 Харидани хостинги боэътимоди вебсайт бо муҳофизати DDoS, серверҳои VPS VDS | ProHoster