
අන්තර්ක්රියා කරන සේවා මොඩියුලවල සන්දර්භය තුළ, නොවැළැක්විය හැකි ප්රශ්නයක් මතු වේ: සන්නිවේදනය සිදුවන්නේ කුමන නීති මගින්ද ? තොරතුරු තාක්ෂණ නිෂ්පාදන වලදී, "කොන්ත්රාත්තුවක්" යනු පද්ධති අතර ගලා යන දත්ත සහ එය සම්ප්රේෂණය වන ආකාරය පිළිබඳ විධිමත් අවබෝධයක් නියෝජනය කරයි. මෙයට දත්ත ආකෘතිය (JSON, Protobuf, ආදිය), ව්යුහාත්මක අංග (ක්ෂේත්ර, දත්ත වර්ග), සන්නිවේදන ප්රොටෝකෝලය (REST, gRPC, පණිවිඩ පෝලිම්) සහ අනෙකුත් පිරිවිතරයන් ඇතුළත් වේ.
කොන්ත්රාත්තුවක් විවෘතභාවය (ලැබෙන සහ යවන දේ සෑම කෙනෙකුම දනී), පුරෝකථනය කිරීමේ හැකියාව (අපට කොන්ත්රාත්තුව යාවත්කාලීන කර අනුවාද පවත්වා ගත හැකිය) සහ විශ්වසනීයත්වය (අපි හොඳින් කළමනාකරණය කළ වෙනස්කම් සිදු කළහොත් අපගේ පද්ධතිය අසාර්ථක නොවනු ඇත) සහතික කරයි.
ප්රායෝගිකව, සෑම කෙනෙකුම ක්ෂුද්ර සේවා, “කොන්ත්රාත්තු” සහ API ගැන කතා කළත්, අපි බොහෝ විට මිනිසුන් ප්රවේශය අනුගමනය කරන ආකාරය දකිමු: “API ගොඩනැගීම වෙනුවට දත්ත සමුදාය තුළ බෙදාගත් වගුවක් නිර්මාණය නොකරන්නේ ඇයි?”
එබැවින්, දත්ත හුවමාරුව සඳහා බෙදාගත් වගුවක් භාවිතා කිරීම කාර්යක්ෂම හා ඉක්මන් ප්රතිඵල සඳහා ප්රශස්ත කර ඇති බවක් පෙනෙන්නට තිබුණද, එය දිගු කාලීනව විවිධ තාක්ෂණික සහ සංවිධානාත්මක අභියෝග ජනනය කරයි. කෙසේ වෙතත්, කණ්ඩායම් දත්ත හුවමාරුව සඳහා බෙදාගත් වගු තෝරා ගන්නා විට, ක්රියාත්මක කිරීමේදී ඔවුන්ට බොහෝ ගැටළු වලට මුහුණ දීමට සිදුවිය හැකිය.
සේවාවන් REST/gRPC/GraphQL හරහා සන්නිවේදනය කරන විට, ඒවාට විධිමත් අර්ථ දැක්වීමක් ඇත: OpenAPI (Swagger), protobuf යෝජනා ක්රම හෝ 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 හරහා යා යුතුය. මෙය පැහැදිලි වගකීම් බෙදාහැරීමක් ලබා දෙයි: සේවාව A කැඩී ඇත්නම්, එය නිවැරදි කිරීම A සේවාවේ වගකීම වන අතර එහි අසල්වැසියන් නොවේ.
මුලින්ම බැලූ බැල්මට, සියල්ල එක කණ්ඩායමක තිබේ නම්, API එකකින් දේවල් සංකීර්ණ කරන්නේ ඇයි? යථාර්ථයේ දී, ඔබට තනි නිෂ්පාදනයක් මොඩියුලවලට බෙදා තිබුණත්, බෙදාගත් වගුවක් එකම ගැටළු වලට තුඩු දිය හැකිය.
උදාහරණයක් ලෙස, ඇණවුම් සේවාව ඇණවුම් වගුවේ හිමිකරු වන අතර, බිල්පත් සේවාව එම වගුවට සෘජුවම ප්රවේශ නොවේ - එය ඇණවුම් විස්තර ලබා ගැනීමට හෝ ඇණවුමක් ගෙවූ ලෙස සලකුණු කිරීමට ඇණවුම් සේවාවේ අන්ත ලක්ෂ්ය වෙත ඇමතුම් ලබා දෙයි.
ඉහළ මට්ටමක දී, කණ්ඩායම් දෙකක් හෝ වැඩි ගණනක් විවිධ ක්ෂේත්ර සඳහා වගකිව යුතු විට, මූලධර්ම එලෙසම පවතී. උදාහරණයක් ලෙස:
B කණ්ඩායම A කණ්ඩායමට අයත් “නාමාවලි” වගුව සෘජුවම විමසන්නේ නම්, A හි ඕනෑම අභ්යන්තර යෝජනා ක්රම වෙනස්වීමක් (උදා: ක්ෂේත්ර එකතු කිරීම, ව්යුහය වෙනස් කිරීම) B කණ්ඩායමට බලපෑ හැකිය.
නිසි ප්රවේශය වන්නේ API එකක් භාවිතා කිරීමයි: කණ්ඩායම A GET /catalog/items
, GET /catalog/items/{id}
, වැනි අන්ත ලක්ෂ්ය සපයන අතර B කණ්ඩායම එම ක්රම භාවිතා කරයි. A පැරණි සහ නව අනුවාදයන්ට සහාය වීමට සමත් නම්, ඔවුන්ට /v2 නිකුත් කළ හැකි අතර, එමඟින් B හට සංක්රමණය වීමට කාලය ලැබේ.
විධිමත් ගිවිසුමක් සමඟ, සියලු වෙනස්කම් දෘශ්යමාන වේ: Swagger/OpenAPI, .proto ගොනු හෝ සිදුවීම් ලියකියවිලි වල. ඕනෑම යාවත්කාලීන කිරීමක් කලින් සාකච්ඡා කළ හැකිය, නිසි ලෙස පරීක්ෂා කළ හැකිය, සහ අවශ්ය පරිදි පසුගාමී අනුකූලතා උපාය මාර්ග සමඟ කාලසටහන්ගත කළ හැකිය.
එක් සේවාවක වෙනස්කම් අනෙක් අයට අඩු බලපෑමක් ඇති කරයි. නව සහ පැරණි ක්ෂේත්ර හෝ අන්ත ලක්ෂ්ය නිසි ලෙස කළමනාකරණය කර, සුමට සංක්රාන්තියක් සහතික කරන්නේ නම්, කණ්ඩායමට වෙනත් කෙනෙකු "බිඳ දැමීම" ගැන කරදර විය යුතු නැත.
API ද්වාර, සත්යාපනය සහ අවසරය (JWT, OAuth) සේවා සඳහා සම්මත වේ, නමුත් බෙදාගත් වගුවක් සමඟ එය කළ නොහැකි තරම්ය. ප්රවේශය සියුම් ලෙස සකස් කිරීම (කුමන ක්රම ඇමතීමට හැකිද), ලොග් තබා ගැනීම, භාවිත සංඛ්යාලේඛන නිරීක්ෂණය කිරීම සහ කෝටා පැනවීම පහසුය. මෙය පද්ධතිය ආරක්ෂිත සහ වඩාත් පුරෝකථනය කළ හැකි කරයි.
දත්ත සමුදායේ බෙදාගත් වගුවක් යනු සේවා අතර ගිවිසුමක් නොව ක්රියාත්මක කිරීමේ විස්තරයකි, එබැවින් එය කොන්ත්රාත්තුවක් ලෙස නොසැලකේ. බොහෝ ගැටළු (සංකීර්ණ අනුවාදකරණය, අවුල් සහගත වෙනස්කම්, අපැහැදිලි හිමිකාරිත්වය, ආරක්ෂාව සහ කාර්ය සාධන අවදානම්) මෙම ප්රවේශය දිගු කාලීනව පිළිගත නොහැකි කරයි.
නිවැරදි ප්රවේශය වන්නේ කොන්ත්රාත්තුව පළමුව යන්නයි , එහි තේරුම විධිමත් සැලසුමක් හරහා අන්තර්ක්රියා නිර්වචනය කිරීම සහ සෑම සේවාවක්ම එහි දත්තවල හිමිකරු ලෙස පවතින බවට මූලධර්මය අනුගමනය කිරීමයි. මෙය තාක්ෂණික ණය අඩු කිරීමට පමණක් නොව විනිවිදභාවය වැඩි කිරීමට, නිෂ්පාදන සංවර්ධනය වේගවත් කිරීමට සහ දත්ත සමුදා යෝජනා ක්රම මත ගිනි නිවීමේ කටයුතුවල යෙදීමෙන් තොරව ආරක්ෂිත වෙනස්කම් සක්රීය කිරීමට උපකාරී වේ.
එය තාක්ෂණික ගැටළුවක් (සැලසුම් කර ඒකාබද්ධ කරන්නේ කෙසේද) සහ ආයතනික ගැටළුවක් (කණ්ඩායම් වෙනස්කම් සන්නිවේදනය කරන සහ කළමනාකරණය කරන ආකාරය) යන දෙකම වේ. දත්ත සමුදා යෝජනා ක්රම සම්බන්ධයෙන් නිමක් නැති හදිසි අවස්ථා වලට මුහුණ නොදී ඔබේ නිෂ්පාදනය වර්ධනය වීමට ඔබට අවශ්ය නම්, ඔබ සෘජු දත්ත සමුදා ප්රවේශයට වඩා කොන්ත්රාත්තු අනුව සිතීම ආරම්භ කළ යුතුය.