Дар заминаи модулҳои хидматрасонии мутақобила саволи ногузир ба миён меояд: Муошират бо кадом қоидаҳо сурат мегирад? Дар маҳсулоти IT, "қарордод" фаҳмиши расмии ҷараёни интиқоли маълумот дар байни системаҳо ва чӣ гуна интиқоли онро ифода мекунад. Ин формати додаҳо (JSON, Protobuf ва ғайра), унсурҳои сохторӣ (майдонҳо, намудҳои додаҳо), протоколи иртиботӣ (REST, gRPC, навбатҳои паёмҳо) ва мушаххасоти дигарро дар бар мегирад.
Шартнома ошкорбаёнӣ (ҳама медонад, ки чӣ қабул ва фиристода мешавад), пешгӯишаванда (мо метавонем шартномаро навсозӣ кунем ва версияҳоро нигоҳ дорем) ва эътимоднокӣ (агар мо тағироти хуб идора карда шавад, системаи мо ноком нахоҳад шуд) кафолат медиҳад.
Дар амал, гарчанде ки ҳама дар бораи хидматҳои хурд, "шартномаҳо" ва APIҳо сӯҳбат мекунанд, мо аксар вақт мебинем, ки одамон чунин равишро қабул мекунанд: "Чаро дар пойгоҳи додаҳо ба ҷои сохтани APIҳо ҷадвали муштарак эҷод накунед?"
Аз ин рӯ, ҳангоми истифодаи ҷадвали муштарак барои табодули маълумот метавонад барои натиҷаҳои зуд муассир ва оптимизатсияшуда ба назар расад, он дар дарозмуддат мушкилоти гуногуни техникӣ ва ташкилиро ба вуҷуд меорад. Аммо, вақте ки дастаҳо ҷадвалҳои муштаракро барои табодули маълумот интихоб мекунанд, онҳо метавонанд ҳангоми татбиқ бо мушкилоти зиёд рӯ ба рӯ шаванд.
Вақте ки хидматҳо тавассути REST/gRPC/GraphQL муошират мекунанд, онҳо таърифи расмӣ доранд: OpenAPI (Swagger), схемаҳои протобуф ё схемаҳои GraphQL. Инҳо ба таври муфассал муайян мекунанд, ки кадом захираҳо (нуқтаҳои ниҳоӣ) дастрасанд, кадом майдонҳо интизоранд, намудҳои онҳо ва форматҳои дархост/ҷавоб. Вақте ки "мизи муштарак" ҳамчун шартнома амал мекунад, тавсифи расмӣ вуҷуд надорад: Тавсифи расмии шартнома вуҷуд надорад; танҳо схемаи ҷадвал (DDL) дастрас аст ва ҳатто он хуб ҳуҷҷатгузорӣ нашудааст. Ҳама гуна тағироти ночизи сохтори ҷадвал (масалан, илова кардан ё нест кардани сутун, тағир додани намуди маълумот) метавонад ба дастаҳои дигаре, ки аз ин ҷадвал мехонанд ё ба он менависанд, таъсир расонад.
Навсозии API як таҷрибаи муқаррарӣ аст: Мо шояд v1, v2 ва ғайра дошта бошем ва мо метавонем мутобиқати ақибро нигоҳ дорем ва сипас тадриҷан муштариёнро ба версияҳои навтар интиқол диҳем. Барои ҷадвалҳои пойгоҳи додаҳо, мо танҳо амалиёти DDL дорем (масалан, ALTER TABLE
), ки бо муҳаррики мушаххаси DB зич пайваст шудаанд ва коркарди эҳтиёткоронаи муҳоҷиратро талаб мекунанд.
Ягон системаи мутамарказе вуҷуд надорад, ки метавонад ба истеъмолкунандагон дар бораи тағироти схема огоҳӣ фиристад, ки аз онҳо навсозии дархостҳои худро талаб кунад. Дар натиҷа, аҳдҳои "дар зери миз" метавонанд ба вуқӯъ оянд: касе метавонад дар чат навишт, "Фардо мо сутуни X ба Y иваз мекунем", аммо ҳеҷ кафолате нест, ки ҳама сари вақт омода хоҳанд шуд.
Вақте ки API-и аниқ муайяншуда вуҷуд дорад, маълум мешавад, ки он кӣ дорад: хидмате, ки ҳамчун ношири API хидмат мекунад. Вақте ки дастаҳои сершумор як ҷадвали пойгоҳи додаҳоро истифода мебаранд, дар бораи кӣ сохторро муайян мекунад ва кадом майдонҳоро нигоҳ доштан ва чӣ гуна тафсири онҳоро муайян мекунад, нофаҳмиҳо вуҷуд дорад. Дар натиҷа, ҷадвал метавонад "моли касе" шавад ва ҳар як тағирот ба ҷустуҷӯ табдил меёбад: "Мо бояд бо он дастаи дигар тафтиш кунем, агар онҳо сутуни кӯҳнаро истифода баранд!"
Агар бисёр дастаҳо ба МД дастрасӣ дошта бошанд, пайгирӣ кардани он душвор аст, ки кӣ дар ҷадвал хонда ва навишта метавонад. Имконияти он вуҷуд дорад, ки хидматҳои беиҷозат метавонанд ба маълумот дастрасӣ дошта бошанд, гарчанде ки он барои онҳо пешбинӣ нашуда буд. Идоракунии чунин масъалаҳо бо API осонтар аст: Шумо метавонед ҳуқуқҳои дастрасиро назорат кунед (кӣ метавонад ба кадом усулҳо занг занад), аутентификатсия ва авторизатсияро истифода баред ва назорат кунед, ки кӣ ба чӣ занг зад. Бо ҷадвал, он хеле мураккабтар аст.
Ҳама гуна тағйироти дохилӣ ба додаҳо (азнавташкилдиҳии индексҳо, тақсим кардани ҷадвал, тағир додани МБ) як мушкилоти глобалӣ мешаванд. Агар ҷадвал ҳамчун интерфейси ҷамъиятӣ кор кунад, соҳиб наметавонад тағироти дохилиро бидуни хатар ба ҳама хонандагон ва нависандагони беруна ворид кунад.
Ин ҷанбаи аз ҳама дардовар аст: Чӣ тавр кас ба дастаи дигар хабар медиҳад, ки схема рӯзи дигар тағир меёбад?
Вақте ки дастаҳои сершумор ҷадвали муштаракро барои интихоб ва навсозии маълумоти муҳим истифода мебаранд, он метавонад ба осонӣ ба "майдони ҷанг" табдил ёбад. Натиҷа ин аст, ки мантиқи тиҷорат дар хидматҳои гуногун пароканда мешавад ва назорати мутамаркази тамомияти додаҳо вуҷуд надорад. Донистани он, ки чаро як майдони мушаххас ба таври мушаххас нигоҳ дошта мешавад, кӣ метавонад онро навсозӣ кунад ва агар холӣ монад, чӣ мешавад, хеле душвор мешавад.
Масалан, фарз мекунем, ки ҷадвал шикаста шуд: Фарз мекунем, ки маълумоти бад вуҷуд дорад ё касе дар баъзе сатрҳои муҳим қуфл гирифтааст. Муайян кардани сарчашмаи мушкилот метавонад аксар вақт талаб кунад, ки ҳар як дастаи дорои дастрасии DB барои муайян кардани кадом дархост боиси мушкилот шудааст. Ин аксар вақт маълум нест: Ин маънои онро дорад, ки дархости як даста метавонад пойгоҳи додаҳоро баста бошад, дар ҳоле ки дархости дастаи дигар хатои мушоҳидашавандаро ба вуҷуд меорад.
Махзани маълумоти муштарак як нуқтаи ноком аст. Агар он паст шавад, пас бисёр хидматҳо бо он фурӯ хоҳанд рафт. Вақте ки пойгоҳи додаҳо бо сабаби пурсишҳои вазнини як хадамот бо иҷроиш мушкилӣ доранд, ҳама хидматҳо бо мушкилот дучор мешаванд. Дар модели дорои API-ҳои возеҳ ва моликияти додаҳо, ҳар як даста устоди дастрасӣ ва иҷрои хидмати худ аст, бинобар ин нокомӣ дар як ҷузъ ба дигарон паҳн намешавад.
Як созиши умумӣ ин аст: "Мо ба шумо як нусхаи танҳо барои хондан медиҳем, то шумо бидуни таъсир ба пойгоҳи асосии мо пурсед." Дар аввал, ин метавонад баъзе мушкилоти боркуниро ҳал кунад, аммо:
Таҷрибаҳои муосири тарроҳӣ (масалан, "API Аввал" ё "Аввал шартнома") бо таърифи расмии интерфейс оғоз мешаванд. Схемаҳои OpenAPI/Swagger, protobuf ё GraphQL истифода мешаванд. Ҳамин тариқ, ҳам одамон ва ҳам мошинҳо медонанд, ки кадом нуқтаҳо дастрасанд, кадом майдонҳо талаб карда мешаванд ва кадом намуди маълумот истифода мешаванд.
Дар меъмории микросервисҳо (ё ҳатто модулӣ), фарзия ин аст, ки ҳар як хидмат маълумоти худро пурра дорад. Он сохтор, нигоҳдорӣ ва мантиқи тиҷоратиро муайян мекунад ва API-ро барои ҳама дастрасии беруна ба ин API таъмин мекунад. Ҳеҷ кас наметавонад ба махзани "каси дигар" даст расонад: танҳо ба нуқтаи ниҳоӣ ё рӯйдодҳои расмӣ. Ин ҳаётро осонтар мекунад, вақте ки тағирот дар назар аст ва ҳамеша маълум аст, ки кӣ гунаҳкор аст.
GET /items
, POST /items
ва ғайраро нашр мекунад ва муштариён бо схемаи дақиқи додаҳо (DTO) дархост пешниҳод мекунанд.
Новобаста аз он ки кадом модел, татбиқи назорати версия дар интерфейс ҳам имконпазир ва ҳам муҳим аст. Барои намуна:
Принсипи асосӣ ин аст, ки гурӯҳе, ки маълумотро дорад, тасмим мегирад, ки чӣ гуна нигоҳдорӣ ва идора кардани онро интихоб кунад, аммо онҳо набояд дастрасии мустақими навиштанро ба хидматҳои дигар диҳанд. Дигарон бояд дар муқоиса бо таҳрири маълумоти хориҷӣ аз API гузаранд. Ин тақсимоти масъулиятро равшантар медиҳад: Агар хидмати А вайрон бошад, пас хидмати А барои ислоҳи он аст, на ҳамсояҳо.
Дар назари аввал, агар ҳама чиз дар як даста бошад, пас чаро корҳоро бо API мураккаб кардан лозим аст? Дар асл, ҳатто агар шумо як маҳсулот ба модулҳо тақсим карда бошед, ҷадвали муштарак метавонад ба ҳамон мушкилот оварда расонад.
Масалан, хидмати фармоишҳо соҳиби ҷадвали фармоишҳо мебошад ва хидматрасонии ҳисоббаробаркунӣ мустақиман ба он ҷадвал дастрасӣ надорад - он ба нуқтаҳои ниҳоии хидмати Фармоишҳо занг мезанад, то тафсилоти фармоишро дарёфт кунад ё фармоишро ҳамчун пардохт қайд кунад.
Дар сатҳи баландтар, вақте ки ду ё зиёда дастаҳо барои соҳаҳои гуногун масъуланд, принсипҳо якхела боқӣ мемонанд. Масалан:
Агар дастаи В бевосита ҷадвали “Каталог”-и мутааллиқ ба дастаи Аро дархост кунад, ҳама гуна тағйироти схемаи дохилӣ дар А (масалан, илова кардани майдонҳо, тағир додани сохтор) метавонад ба дастаи В таъсир расонад.
Муносибати дуруст ин истифодаи API аст: Гурӯҳи A нуқтаҳои ниҳоӣ ба монанди GET /catalog/items
, GET /catalog/items/{id}
ва ғайраро таъмин мекунад ва Гурӯҳи B ин усулҳоро истифода мебарад. Агар A қодир бошад, ки версияҳои кӯҳна ва навтарро дастгирӣ кунад, онҳо метавонанд /v2-ро озод кунанд, ки ба B вақти муҳоҷиратро медиҳад.
Бо шартномаи расмӣ, ҳама тағиротҳо намоён мешаванд: дар Swagger/OpenAPI, файлҳои .proto, ё ҳуҷҷатҳои ҳодиса. Ҳар як навсозиро метавон пешакӣ баррасӣ кард, дуруст санҷида ва ба нақша гирифта, бо стратегияҳои мутобиқати пас аз зарурат.
Тағирот дар як хидмат ба дигарон камтар таъсир мерасонад. Ба даста лозим нест, ки дар бораи "шикандан" ягон каси дигар хавотир нашаванд, агар онҳо майдонҳои нав ва кӯҳна ё нуқтаҳоро дуруст идора кунанд ва гузариши ҳамворро таъмин кунанд.
Шлюзҳои API, аутентификатсия ва авторизатсия (JWT, OAuth) барои хидматҳо стандартӣ мебошанд, аммо бо ҷадвали муштарак қариб ғайриимкон аст. Танзими дастрасӣ (кӣ метавонад ба кадом усулҳо занг занад), сабтҳо, пайгирии омори истифода ва ҷорӣ кардани квота осонтар аст. Ин системаро бехатартар ва пешгӯинашаванда мегардонад.
Ҷадвали муштарак дар пойгоҳи додаҳо тафсилоти татбиқ аст, на созишномаи байни хидматҳо, бинобар ин шартнома ҳисобида намешавад. Масъалаҳои зиёд (версияи мураккаб, тағироти бесарусомон, моликияти норавшан, амният ва хатарҳои иҷроиш) ин равишро дар муддати тӯлонӣ ғайриимкон мегардонанд.
Муносибати дуруст Шартномаи аввал аст, ки маънои муайян кардани ҳамкорӣ тавассути тарҳрезии расмӣ ва риояи принсипи он, ки ҳар як хидмат соҳиби маълумоти он боқӣ мемонад. Ин на танҳо ба кам кардани қарзи техникӣ мусоидат мекунад, балки шаффофиятро афзоиш медиҳад, рушди маҳсулотро суръат мебахшад ва имкон медиҳад, ки тағироти бехатарро бидуни иштирок дар сӯхторҳо аз рӯи схемаҳои пойгоҳи додаҳо анҷом диҳанд.
Ин ҳам як масъалаи техникӣ (чӣ гуна тарҳрезӣ кардан ва ҳамгироӣ кардан) ва масъалаи ташкилӣ (чӣ гуна дастаҳо муошират мекунанд ва тағиротро идора мекунанд) мебошад. Агар шумо хоҳед, ки маҳсулоти шумо бидуни сар задани ҳолатҳои фавқулоддаи беохир дар бораи схемаҳои пойгоҳи додаҳо афзоиш ёбад, пас шумо бояд дар бораи шартномаҳо фикр кунед, на дастрасии мустақим ба пойгоҳи додаҳо.