Программалык камсыздоонун архитектурасы жана системаларынын дизайны: чоң сүрөт жана ресурстук колдонмо

Саламатсыздарбы кесиптештер.

Бүгүн биз сиздердин карооңуздарга заманбап программалык системаларды долбоорлоо принциптерин салыштырмалуу аз көлөмдө баяндап берүүгө милдеттенген Тугберк Угурлунун макаласынын котормосун сунуштайбыз. Бул жерде автор кыскача өзү жөнүндө эмне дейт:

Программалык камсыздоонун архитектурасы жана системаларынын дизайны: чоң сүрөт жана ресурстук колдонмо
2019-жылга карата архитектуралык үлгүлөр + дизайн үлгүлөрү сыяктуу эбегейсиз чоң теманы хабро макаласында чагылдыруу таптакыр мүмкүн болбогондуктан, биз Уруглу мырзанын өзүнүн текстин гана эмес, ага боорукерлик менен кошкон көптөгөн шилтемелерди да сунуштайбыз. Эгер сизге жакса, биз бөлүштүрүлгөн системалардын дизайны жөнүндө көбүрөөк адистештирилген текстти жарыялайбыз.

Программалык камсыздоонун архитектурасы жана системаларынын дизайны: чоң сүрөт жана ресурстук колдонмо

Snapshot Исаак Смит Unsplash тартып

Эгерде сиз эч качан нөлдөн баштап программалык камсыздоо системасын долбоорлоо сыяктуу кыйынчылыктарга туш келбеген болсоңуз, анда мындай ишти баштаганда, кээде эмнеден баштоо керектиги түшүнүксүз болуп калат. Менимче, сиз адегенде сиз эмнени долбоорлой турганыңыз жөнүндө аздыр-көптүр ишенимдүү түшүнүккө ээ болушуңуз үчүн чектерди сызып, анан жеңиңизди түрүп, ошол чектердин ичинде иштешиңиз керек деп ойлойм. Баштапкы чекит катары, сиз өнүмдү же кызматты (идеалында сизге чындап жактырган) алып, аны кантип ишке ашырууну чечсеңиз болот. Сиз бул продукт канчалык жөнөкөй көрүнгөнүнө таң калышыңыз мүмкүн жана анын канчалык татаалдыгы бар. унутпа: жөнөкөй - адатта татаал, жана бул жакшы.

Мен системаны иштеп чыгууну баштагандарга бере турган эң жакшы кеңеш бул: эч кандай божомолдорду жасабаңыз! Эң башынан эле бул система жөнүндө белгилүү болгон фактыларды жана ага байланыштуу күтүүлөрдү тактоо керек. Дизайныңызды баштоого жардам бере турган кээ бир жакшы суроолор:

  • Биз чечүүгө аракет кылып жаткан маселе кандай?
  • Биздин система менен иштеше турган колдонуучулардын эң жогорку саны канча?
  • Жазуунун жана окуунун кандай үлгүлөрүн колдонобуз?
  • Кандай күтүлбөгөн жагдайлар бар, биз аларды кантип чечебиз?
  • Системанын ырааттуулугун жана жеткиликтүүлүгүн кандай күтөт?
  • Иштеп жатканда тышкы текшерүүгө жана жөнгө салууга байланыштуу кандайдыр бир талаптарды эске алышыңыз керекпи?
  • Биз кандай купуя маалыматтарды сактайбыз?

Бул көп жылдык кесиптик ишмердүүлүгүмдө мага да, мен катышкан командаларга да пайдалуу болгон бир нече суроолор. Эгерде сиз бул суроолорго жоопторду билсеңиз (жана сиз иштөөгө туура келген контекстке тиешелүү болгон башка суроолор), анда сиз акырындык менен маселенин техникалык деталдарына тереңдеп кирсеңиз болот.

Баштапкы деңгээлди коюңуз

Бул жерде "базалык" деп эмнени айткым келет? Чындыгында, биздин мезгилде программалык камсыздоо тармагындагы көйгөйлөрдүн көбүн колдонуудагы ыкмаларды жана технологияларды колдонуу менен чечсе болот. Демек, бул пейзажда навигациялоо менен, сиз башка бирөө сизден мурун чечиши керек болгон көйгөйлөргө туш болгондо белгилүү бир башталгыч аласыз. Программалар бизнес жана колдонуучулардын көйгөйлөрүн чечүү үчүн жазылганын унутпаңыз, ошондуктан биз маселени эң жөнөкөй жана жөнөкөй (колдонуучунун көз карашы боюнча) чечүүгө умтулабыз. Муну эстеп калуу эмне үчүн маанилүү? Балким, сиз координаттар тутумуңузда бардык көйгөйлөр үчүн уникалдуу чечимдерди издегенди каалайсыз, анткени сиз: "Эгер мен бардык жерде үлгүлөрдү кармансам, мен кандай программист болом" деп ойлойсуз? Чындыгында, Бул жерде искусство кайда жана эмне кылуу керектиги жөнүндө чечим кабыл алууда. Албетте, ар бирибиз мезгил-мезгили менен уникалдуу көйгөйлөргө туш болушубуз керек, алардын ар бири чыныгы кыйынчылык. Бирок, эгерде биздин баштапкы деңгээлибиз так аныкталса, анда биз өзүбүздүн күчүбүздү эмнеге жумшашыбызды билебиз: алдыбызга коюлган маселени чечүүнүн даяр варианттарын издөөгө же аны андан ары изилдеп, тереңирээк түшүнүүгө.

Эгерде адис кээ бир сонун программалык камсыздоо тутумдарынын архитектуралык компоненти эмне экенин ишенимдүү түшүнсө, анда бул билим архитектордун чеберчилигин өздөштүрүү жана бул тармакта бекем негизди иштеп чыгуу үчүн зарыл боло тургандыгына мен сизди ишендире алдым деп ойлойм.

Макул, эмнеден баштоо керек? У Донна Мартина GitHubда репозиторий деп аталган репозиторий бар система-дизайн-праймер, андан сиз масштабдуу системаларды кантип долбоорлоону үйрөнө аласыз, ошондой эле бул тема боюнча интервьюга даярдансаңыз болот. Репозиторийде мисалдар бар бөлүм бар чыныгы архитектура, бул жерде, атап айтканда, алардын системаларынын дизайнына кандай мамиле кылышы каралат кээ бир белгилүү компаниялармисалы, Twitter, Uber ж.б.

Бирок, бул материалга өтүүдөн мурун, биз практикада туш болгон эң маанилүү архитектуралык кыйынчылыктарга тереңирээк токтололу. Бул абдан маанилүү, анткени сиз өжөр жана көп кырдуу маселенин КӨП аспектилерин тактап, анан аны белгилүү бир системада колдонулуп жаткан ченемдик укуктук актылардын алкагында чечишиңиз керек. Джексон Габбард, деп жазды Фейсбуктун мурдагы кызматкери Системаларды долбоорлоо маектери тууралуу 50 мүнөттүк видео, анда ал жүздөгөн талапкерлерди текшерүү боюнча өз тажрыйбасы менен бөлүштү. Видеодо чоң системанын дизайнына жана мындай кызматка талапкер издөөдө маанилүү болгон ийгилик критерийлерине көп көңүл бурулганы менен, ал системаларды долбоорлоодо эмнелер эң маанилүү экендиги боюнча комплекстүү булак катары кызмат кылат. Мен дагы сунуш кылам кыскача мазмууну бул видео.

Маалыматтарды сактоо жана алуу боюнча билимдерди түзүү

Адатта, сиздин маалыматыңызды узак мөөнөткө кантип сактоо жана алуу боюнча чечимиңиз системанын иштешине олуттуу таасирин тийгизет. Ошондуктан, сиз алгач тутумуңуздун күтүлгөн жазуу жана окуу мүнөздөмөлөрүн түшүнүшүңүз керек. Андан кийин бул көрсөткүчтөрдү баалоо жана жасалган баалардын негизинде тандоо мүмкүнчүлүгүнө ээ болушу керек. Бирок, сиз учурдагы маалыматтарды сактоо үлгүлөрүн түшүнгөнүңүздө гана бул иш менен натыйжалуу күрөшө аласыз. Негизи, бул байланыштуу бекем билимди билдирет маалымат базасын тандоо.

Берилиштер базаларын өтө масштабдуу жана бышык маалымат структуралары катары кароого болот. Ошондуктан, белгилүү бир маалымат базасын тандоодо маалымат структураларын билүү сизге абдан пайдалуу болушу керек. Мисалы, Redis ар кандай маанилерди колдогон маалымат структурасынын сервери. Бул тизмелер жана топтомдор сыяктуу маалымат структуралары менен иштөөгө жана белгилүү алгоритмдерди колдонуу менен маалыматтарды окууга мүмкүндүк берет, мисалы, LRU, мындай ишти бышык жана жогорку жеткиликтуу стилде уюштуруу.

Программалык камсыздоонун архитектурасы жана системаларынын дизайны: чоң сүрөт жана ресурстук колдонмо

Snapshot Сэмюэл Зеллер Unsplash тартып

Маалыматтарды сактоонун ар кандай үлгүлөрү жөнүндө жетиштүү түшүнүккө ээ болгондон кийин, маалыматтардын ырааттуулугун жана жеткиликтүүлүгүн изилдөөгө өтүңүз. Биринчиден, сиз түшүнүү керек CAP теоремасы жок дегенде жалпы мааниде, анан калыптанган үлгүлөрдү жакшыраак карап чыгуу менен бул билимди жылтырат ырааттуулук и жеткиликтүүлүк. Ошентип, сиз бул тармакты түшүнүп, маалыматтарды окуу жана жазуу чындыгында эки башка көйгөй экенин түшүнөсүз, ар биринин өзүнүн уникалдуу кыйынчылыктары бар. Бир нече ырааттуулук жана жеткиликтүүлүк үлгүлөрү менен куралдангандан кийин, сиз тиркемелериңизге маалыматтардын жылмакай агымын камсыз кылуу менен системанын иштешин бир топ жогорулата аласыз.

Акыр-аягы, маалыматтарды сактоо көйгөйлөрү жөнүндө сүйлөшүүнү жыйынтыктап жатып, кэштештирүү жөнүндө да айта кетүү керек. Ал бир эле учурда кардар менен серверде иштеши керекпи? Сиздин кэшиңизде кандай маалыматтар болот? Анан эмне үчүн? Кэшти жараксыз кылууну кантип уюштурасыз? Ал үзгүлтүксүз, белгилүү интервалдар менен аткарылабы? Ооба болсо, канча жолу? Мен бул темаларды изилдөөнү баштоону сунуштайм кийинки бөлүм жогоруда аталган системанын дизайн праймери.

Коммуникация үлгүлөрү

Системалар ар кандай компоненттерден турат; бул бир физикалык түйүн ичинде иштеген ар кандай процесстер же тармагыңыздын ар кайсы бөлүктөрүндө иштеген ар кандай машиналар болушу мүмкүн. Тармагыңыздагы бул ресурстардын айрымдары жеке болушу мүмкүн, бирок башкалары ачык болушу керек жана аларга сырттан кирүүчү керектөөчүлөр үчүн ачык болушу керек.

Бул ресурстардын бири-бири менен байланышын, ошондой эле бүтүндөй система менен тышкы дүйнөнүн ортосунда маалымат алмашууну камсыз кылуу зарыл. Системаларды долбоорлоо контекстинде бул жерде дагы бир катар жаңы жана уникалдуу кыйынчылыктарга туш болдук. Келгиле, алар кантип пайдалуу боло аларын карап көрөлү асинхрондук тапшырма агымдары, жана эмне бАр кандай байланыш үлгүлөрү бар.

Программалык камсыздоонун архитектурасы жана системаларынын дизайны: чоң сүрөт жана ресурстук колдонмо

Snapshot Тони Стоддард Unsplash тартып

тышкы дүйнө менен байланышты уюштурууда, ал ар дайым абдан маанилүү болуп саналат коопсуздук, аны камсыз кылуу да олуттуу жана жигердуу жургузууну талап кылат.

Байланыш бөлүштүрүү

Бул теманы өзүнчө бөлүмгө салуу баарына эле туура көрүнөөрүнө ишенбейм. Ошентсе да, мен бул жерде майда-чүйдөсүнө чейин бул концепцияны көрсөтөм жана бул бөлүмдөгү материал "байланыш бөлүштүрүү" термини менен эң туура сүрөттөлгөн деп эсептейм.

Системалар көптөгөн компоненттерди туура туташтыруу аркылуу түзүлөт жана алардын бири-бири менен байланышы көбүнчө белгиленген протоколдордун негизинде уюштурулат, мисалы, TCP жана UDP. Бирок, мындай протоколдор көп учурда заманбап системалардын бардык муктаждыктарын канааттандырууга жетишсиз, алар көбүнчө жогорку жүктөм астында иштетилет жана ошондой эле колдонуучунун керектөөлөрүнө өтө көз каранды. Көп учурда системадагы мындай чоң жүктөрдү көтөрүү үчүн байланыштарды бөлүштүрүү жолдорун табуу керек.

Бул бөлүштүрүү жалпыга белгилүү негизделет домендик аталыш системасы (DNS). Мындай система жүктү бөлүштүрүүгө жардам берүү үчүн салмактуу айланма робин жана кечигүү негизиндеги методдор сыяктуу домендик аталыштарды өзгөртүүгө мүмкүндүк берет.

Жүктүн тең салмактуулугу принципиалдуу мааниге ээ жана бүгүнкү күндө биз иштеп жаткан дээрлик ар бир чоң Интернет системасы бир же бир нече жүк балансынын артында жайгашкан. Жүктөлгөн баланстоочулар кардарлардын суроо-талаптарын бир нече жеткиликтүү инстанциялар боюнча бөлүштүрүүгө жардам берет. Жүктөлгөн баланстоочулар аппараттык жана программалык камсыздоодо да болот, бирок, иш жүзүндө, көбүнчө, мисалы, программалык камсыздоо менен күрөшүүгө туура келет. HAProxy и ELB. Тескери проксилер концептуалдык жактан да жүк баланстоочуларга абдан окшош, бирок биринчи менен экинчисинин ортосунда диапазон бар айкын айырмачылыктар. Бул айырмачылыктар сиздин муктаждыктарыңызга негизделген системаны иштеп чыгууда эске алынышы керек.

жөнүндө да билишиңиз керек мазмун жеткирүү тармактары (CDN). CDN – белгилүү бир колдонуучуга географиялык жактан жакын жайгашкан түйүндөрдөн маалыматты жеткирүүчү прокси серверлердин глобалдык бөлүштүрүлгөн тармагы. Эгер сиз JavaScript, CSS жана HTML тилдеринде жазылган статикалык файлдар менен иштесеңиз, CDN'лерди колдонуу артык. Мындан тышкары, трафик менеджерлерин камсыз кылган булут кызматтары бүгүнкү күндө кеңири таралган, мисалы, Azure Traffic Manager, динамикалык мазмун менен иштөөдө сизге глобалдык бөлүштүрүүнү жана кыскартылган күтүү убактысын берет. Бирок, мындай кызматтар, адатта, жарандыгы жок желе кызматтары менен иштөөгө туура келген учурларда пайдалуу.

Келгиле, бизнес логикасы жөнүндө сүйлөшөлү. Бизнес логикасын, тапшырма агымдарын жана компоненттерин структуралаштыруу

Ошентип, биз системанын ар кандай инфраструктуралык аспектилерин талкуулоого жетиштик. Сыягы, колдонуучу сиздин тутумуңуздун бардык бул элементтери жөнүндө ойлонбойт жана, чынын айтканда, аларга таптакыр маани бербейт. Колдонуучу сиздин системаңыз менен өз ара аракеттенүү кандай экени, муну жасоо менен эмнеге жетүүгө болот, ошондой эле система колдонуучунун буйруктарын кантип аткараары, колдонуучу маалыматтары менен эмнени жана кантип иштээри кызыктырат.

Бул макаланын аталышынан көрүнүп тургандай, мен программалык камсыздоонун архитектурасы жана системанын дизайны жөнүндө сүйлөшмөкчү болдум. Демек, мен программалык камсыздоонун компоненттери кандайча түзүлгөнүн сүрөттөгөн программалык камсыздоонун дизайн үлгүлөрүн камтууну пландаган эмесмин. Бирок, мен бул жөнүндө көбүрөөк ойлонгон сайын, мага ошончолук программалык дизайн үлгүлөрү менен архитектуралык үлгүлөрдүн ортосундагы сызык өтө бүдөмүк жана эки түшүнүк бири-бири менен тыгыз байланышкандай сезилет. Мисалга алалы окуяны каттоо (окуянын булактары). Бул архитектуралык үлгүнү кабыл алгандан кийин, ал тутумуңуздун дээрлик бардык аспектилерине таасир этет: маалыматтардын узак мөөнөттүү сакталышы, тутумуңузда кабыл алынган ырааттуулуктун деңгээли, андагы компоненттердин формасы ж.б.у.с. Ошондуктан, мен түздөн-түз бизнес логикасына тиешелүү кээ бир архитектуралык үлгүлөрдү айтууну чечтим. Бул макала жөнөкөй тизме менен чектелиши керек болсо да, мен сизди аны менен таанышып, ушул калыптарга байланыштуу идеялар жөнүндө ойлонууга чакырам. Мынаке:

Биргелешкен ыкмалар

Системанын долбоорлоо процесси үчүн жалгыз жооптуу катышуучу катары өзүңүздү долбоордо табышыңыз өтө күмөн. Тескерисинче, ишиңиздин ичинде да, сыртында да иштеген кесиптештериңиз менен иштешүүгө туура келет. Бул учурда, кесиптештер менен тандалган технологиялык чечимдерди баалоо, бизнес муктаждыктарын аныктоо жана милдеттерди кантип параллелдештирүү керектигин түшүнүү керек болушу мүмкүн.

Программалык камсыздоонун архитектурасы жана системаларынын дизайны: чоң сүрөт жана ресурстук колдонмо

Snapshot Kaleidico Unsplash тартып

Биринчи кадам - ​​бул сиз жетүү үчүн аракет кылып жаткан бизнес максаты эмне жана кандай кыймылдуу бөлүктөр менен күрөшүүгө туура келет деген так жана жалпы түшүнүктү иштеп чыгуу. Топтук моделдөө ыкмалары, атап айтканда штурман окуялар (окуя штурминг) бул процессти бир кыйла тездетүүгө жана ийгиликке жетүү мүмкүнчүлүгүн жогорулатууга жардам берет. Бул иш планга чейин же кийин жасалышы мүмкүн кызматтарыңыздын чектери, анан продукт жетилгенде аны тереңдетет. Бул жерде жетишиле турган ырааттуулуктун деңгээлине жараша, сиз да түзө аласыз жалпы тил сиз иштеген чектелген контекст үчүн. Системаңыздын архитектурасы жөнүндө сөз кылуу керек болгондо, сиз аны пайдалуу деп эсептейсиз модели C4, сунушталган Саймон Браун, айрыкча, көйгөйдүн майда-чүйдөсүнө чейин канчалык тереңирээк киришиңиз керек экенин түшүнүшүңүз керек болгондо, баарлашкыңыз келген нерселерди визуалдаштыруу.

Бул темада дагы бир жетилген технология бар, ал Домен Дизайнынан кем эмес пайдалуу. Бирок, биз кандайдыр бир жол менен предметтик аймакты түшүнүүгө кайтып келебиз, ошондуктан бул тармактагы билим жана тажрыйба Доменге негизделген дизайн силер үчүн пайдалуу болушу керек.

Source: www.habr.com

Комментарий кошуу