Sa phost seo ba mhaith linn bealach suimiúil a roinnt chun déileáil le cumraíocht córais dáilte.
Léirítear an chumraíocht go díreach i dteanga Scala ar bhealach cineál sábháilte. Déantar cur síos mionsonraithe ar shampla ar chur i bhfeidhm. Pléitear gnéithe éagsúla den togra, lena n-áirítear tionchar ar an bpróiseas forbartha iomlán.

()
Réamhrá
Teastaíonn cumraíocht cheart agus chomhleanúnach a úsáid ar gach nóid chun córais láidre dáilte a thógáil. Is é an réiteach is gnách ná cur síos ar imscaradh téacsúil a úsáid (terraform, insible nó rud éigin araon) agus comhaid cumraíochta a ghintear go huathoibríoch (go minic — tiomnaithe do gach nód/ról). Ba mhaith linn freisin na prótacail chéanna de na leaganacha céanna a úsáid ar gach nóid chumarsáide (ar shlí eile bheadh fadhbanna neamh-chomhoiriúnachta againn). I saol JVM ciallaíonn sé seo gur chóir go mbeadh an leabharlann teachtaireachtaí ar a laghad den leagan céanna ar gach nóid chumarsáide.
Cad mar gheall ar an gcóras a thástáil? Ar ndóigh, ba cheart go mbeadh tástálacha aonaid againn le haghaidh na gcomhpháirteanna go léir roimh theacht ar thástálacha comhtháthaithe. Le bheith in ann torthaí tástála a eachtarshuíomh ar am rite, ba cheart dúinn a chinntiú go gcoimeádtar na leaganacha de na leabharlanna go léir mar an gcéanna in am rite agus i dtimpeallachtaí tástála.
Agus tástálacha comhtháthaithe á reáchtáil, is minic a bhíonn sé i bhfad níos éasca an cosán céanna a bheith ar gach nóid. Níl le déanamh againn ach a chinntiú go n-úsáidtear an cosán céanna ar imscaradh. (Is féidir cosáin éagsúla a úsáid ar nóid éagsúla, ach tá sé níos deacra an chumraíocht seo a léiriú agus é a imscaradh i gceart.) Mar sin, chun rudaí a choinneáil simplí ní bhreithneoidh muid ach cosáin chomhionanna ar gach nóid.
Is gnách go n-éabhlóidíonn cumraíocht in éineacht leis na bogearraí. Is iondúil go n-úsáidimid leaganacha chun éagsúla a aithint
céimeanna forbartha bogearraí. Dealraíonn sé go bhfuil sé réasúnta cumraíocht a chlúdach faoi bhainistiú leagan agus cumraíochtaí éagsúla a aithint le roinnt lipéad. Mura bhfuil ach cumraíocht amháin i dtáirgeadh, féadfaimid leagan amháin a úsáid mar aitheantóir. Uaireanta b'fhéidir go mbeadh timpeallachtaí táirgthe iolracha againn. Agus do gach timpeallacht b'fhéidir go mbeadh orainn brainse ar leith de chumraíocht. Mar sin d’fhéadfaí cumraíochtaí a lipéadú le brainse agus le leagan chun cumraíochtaí éagsúla a shainaithint go huathúil. Freagraíonn gach lipéad brainse agus leagan do mheascán amháin de nóid dáilte, calafoirt, acmhainní seachtracha, leaganacha leabharlainne cosán ar gach nód. Anseo ní chlúdóimid ach an brainse aonair agus déanfaimid cumraíochtaí a aithint de réir leagan deachúlach trí chomhpháirt (1.2.3), ar an mbealach céanna le déantáin eile.
I dtimpeallachtaí nua-aimseartha ní dhéantar comhaid chumraíochta a mhodhnú de láimh a thuilleadh. De ghnáth gineann muid
comhaid a chumrú ag am imscartha agus ina dhiaidh. Mar sin d'fhéadfadh duine a fhiafraí cén fáth a n-úsáideann muid formáid téacs fós le haghaidh comhaid cumraíochta? Rogha inmharthana é an chumraíocht a chur taobh istigh d’aonad tiomsaithe agus leas a bhaint as bailíochtú cumraíochta ama tiomsaithe.
Sa phost seo déanfaimid scrúdú ar an smaoineamh an chumraíocht a choinneáil sa déantúsán tiomsaithe.
Cumraíocht inchurtha
San alt seo déanfaimid plé ar shampla de chumraíocht statach. Tá dhá sheirbhís shimplí - seirbhís macalla agus cliant na seirbhíse macalla á chumrú agus á gcur i bhfeidhm. Ansin cuirtear dhá chóras dáilte éagsúla leis an dá sheirbhís ar an toirt. Tá ceann amháin le haghaidh cumraíochta nód amháin agus ceann eile le haghaidh cumraíochta dhá nóid.
Is éard atá i gcóras dáilte tipiciúil ná roinnt nóid. D’fhéadfaí na nóid a shainaithint trí úsáid a bhaint as cineál éigin:
sealed trait NodeId
case object Backend extends NodeId
case object Frontend extends NodeIdnó díreach
case class NodeId(hostName: String)nó fiú
object Singleton
type NodeId = Singleton.typeComhlíonann na nóid seo róil éagsúla, reáchtálann siad roinnt seirbhísí agus ba cheart go mbeidís in ann cumarsáid a dhéanamh leis na nóid eile trí naisc TCP/HTTP.
Tá uimhir phoirt ar a laghad ag teastáil le haghaidh nasc TCP. Ba mhaith linn freisin a chinntiú go bhfuil an cliant agus an freastalaí ag caint ar an bprótacal céanna. Chun nasc idir nóid a shamhaltú, dearbhaimis an rang seo a leanas:
case class TcpEndPoint[Protocol](node: NodeId, port: Port[Protocol])Sa chás go Port ach Int laistigh den raon ceadaithe:
type PortNumber = Refined[Int, Closed[_0, W.`65535`.T]]Cineálacha scagtha
Féach leabharlann. I mbeagán focal, ceadaíonn sé srianta ama tiomsaithe a chur le cineálacha eile. Sa chás seo Int ní cheadaítear ach luachanna 16-giotán a bheith ann ar féidir leo uimhir phoirt a léiriú. Níl aon cheanglas an leabharlann seo a úsáid don chur chuige cumraíochta seo. Dealraíonn sé go n-oireann sé go han-mhaith.
I gcás HTTP (REST) d’fhéadfadh go mbeadh cosán na seirbhíse de dhíth orainn freisin:
type UrlPathPrefix = Refined[String, MatchesRegex[W.`"[a-zA-Z_0-9/]*"`.T]]
case class PortWithPrefix[Protocol](portNumber: PortNumber, pathPrefix: UrlPathPrefix)Cineál phantom
Chun prótacal a aithint le linn tiomsaithe táimid ag baint úsáide as an ghné Scala chun argóint cineáil a dhearbhú Protocol nach n-úsáidtear sa rang. Tá sé ar a dtugtar cineál phantom. Ag am rite is annamh a bhíonn gá againn le sampla aitheantóra prótacail, sin an fáth nach stórálaimid é. Le linn tiomsaithe tugann an cineál phantom seo sábháilteacht bhreise don chineáil. Ní féidir linn pas a fháil leis an bprótacal mícheart.
Ceann de na prótacail is mó a úsáidtear ná REST API le sraithiú Json:
sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]Sa chás go RequestMessage an cineál teachtaireachtaí is féidir leis an gcliant a sheoladh chuig an bhfreastalaí agus ResponseMessage an teachtaireacht freagartha ón bhfreastalaí. Ar ndóigh, is féidir linn tuairiscí prótacail eile a chruthú a shonraíonn an prótacal cumarsáide leis an cruinneas atá ag teastáil.
Chun críocha an phoist seo úsáidfimid leagan níos simplí den phrótacal:
sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]Sa iarratas prótacail seo cuirtear an teachtaireacht i gceangal leis an url agus cuirtear an teachtaireacht freagartha ar ais mar theaghrán simplí.
D’fhéadfaí cur síos a dhéanamh ar chumraíocht seirbhíse le hainm na seirbhíse, le bailiúchán port agus le roinnt spleáchais. Tá roinnt bealaí féideartha ann chun na heilimintí seo go léir a léiriú i Scala (mar shampla, HList, cineálacha sonraí ailgéabracha). Chun críocha an phoist seo úsáidfimid Patrún Císte agus léireoimid píosaí in-chomhcheangailte (modúil) mar thréithe. (Ní riachtanas é Patrún Císte don chur chuige cumraíochta seo le chéile. Níl ann ach cur i bhfeidhm féideartha amháin den smaoineamh.)
D’fhéadfaí spleáchais a léiriú agus an Patrún Císte á úsáid mar chríochphointí nóid eile:
type EchoProtocol[A] = SimpleHttpGetRest[A, A]
trait EchoConfig[A] extends ServiceConfig {
def portNumber: PortNumber = 8081
def echoPort: PortWithPrefix[EchoProtocol[A]] = PortWithPrefix[EchoProtocol[A]](portNumber, "echo")
def echoService: HttpSimpleGetEndPoint[NodeId, EchoProtocol[A]] = providedSimpleService(echoPort)
}Níl ach port cumraithe ag teastáil ón tseirbhís macalla. Agus dearbhaímid go dtacaíonn an calafort seo le prótacal macalla. Tabhair faoi deara nach gá dúinn calafort ar leith a shonrú faoi láthair, toisc go gceadaíonn tréithe dearbhuithe modhanna teibí. Má úsáidimid modhanna teibí, beidh gá le cur i bhfeidhm ón tiomsaitheoir i gcás cumraíochta. Anseo tá an cur i bhfeidhm curtha ar fáil againn (8081) agus úsáidfear é mar an luach réamhshocraithe má scipeálaimid é i gcumraíocht nithiúil.
Is féidir linn spleáchas a dhearbhú i gcumraíocht an chliaint seirbhíse macalla:
trait EchoClientConfig[A] {
def testMessage: String = "test"
def pollInterval: FiniteDuration
def echoServiceDependency: HttpSimpleGetEndPoint[_, EchoProtocol[A]]
}Tá an cineál céanna ag an spleáchas leis an echoService. Go háirithe, éilíonn sé an prótacal céanna. Mar sin, is féidir linn a bheith cinnte má nascaimid an dá spleáchas seo go n-oibreoidh siad i gceart.
Cur i bhfeidhm seirbhísí
Teastaíonn feidhm le seirbhís a thosú agus a mhúchadh go galánta. (Tá sé ríthábhachtach seirbhís a mhúchadh le haghaidh tástála.) Arís tá roinnt roghanna ann chun feidhm den sórt sin a shonrú le haghaidh cumraíochta ar leith (mar shampla, d'fhéadfaimis ranganna cineáil a úsáid). Don phostáil seo úsáidfimid Patrún Císte arís. Is féidir linn ionadaíocht a dhéanamh ar sheirbhís ag baint úsáide as cats.Resource a sholáthraíonn lúibín agus scaoileadh acmhainní cheana féin. Chun acmhainn a fháil ba cheart dúinn cumraíocht agus roinnt comhthéacs ama rite a sholáthar. Mar sin b’fhéidir go mbeadh cuma ar an bhfeidhm tosaigh seirbhíse:
type ResourceReader[F[_], Config, A] = Reader[Config, Resource[F, A]]
trait ServiceImpl[F[_]] {
type Config
def resource(
implicit
resolver: AddressResolver[F],
timer: Timer[F],
contextShift: ContextShift[F],
ec: ExecutionContext,
applicative: Applicative[F]
): ResourceReader[F, Config, Unit]
}Sa chás go
Config— an cineál cumraíochta a theastaíonn ón tosaitheoir seirbhíse seoAddressResolver— réad ama rite a bhfuil an cumas aige seoltaí réadacha nóid eile a fháil (lean ort ag léamh le haghaidh sonraí).
tagann na cineálacha eile as cats:
F[_]— cineál na héifeachta (Sa chás is simplíF[A]d'fhéadfadh a bheith díreach() => A. Sa phost seo úsáidfimidcats.IO.)Reader[A,B]— is comhchiall é, a bheag nó a mhór, d'fheidhmA => Bcats.Resource— go bhfuil bealaí aige chun é a fháil agus a scaoileadhTimer— ceadaíonn sé codladh/am a thomhasContextShift- analógach deExecutionContextApplicative— cumhdaitheoir feidhmeanna i bhfeidhm (beagnach monad) (d'fhéadfaimis rud éigin eile a chur ina ionad sa deireadh)
Ag baint úsáide as an gcomhéadan seo is féidir linn roinnt seirbhísí a chur i bhfeidhm. Mar shampla, seirbhís nach ndéanann faic:
trait ZeroServiceImpl[F[_]] extends ServiceImpl[F] {
type Config <: Any
def resource(...): ResourceReader[F, Config, Unit] =
Reader(_ => Resource.pure[F, Unit](()))
}(Féach do chur chun feidhme seirbhísí eile — ,
agus .)
Is réad amháin é nód a ritheann roinnt seirbhísí (cuireann Patrún Císte le slabhra acmhainní a thosú):
object SingleNodeImpl extends ZeroServiceImpl[IO]
with EchoServiceService
with EchoClientService
with FiniteDurationLifecycleServiceImpl
{
type Config = EchoConfig[String] with EchoClientConfig[String] with FiniteDurationLifecycleConfig
}Tabhair faoi deara go sonraimid sa nód an cineál cruinn cumraíochta atá de dhíth leis an nód seo. Ní ligfidh an tiomsaitheoir dúinn an réad (Císte) a thógáil gan dóthain cineál, toisc go ndearbhaíonn gach tréith seirbhíse srian ar an Config cineál. Chomh maith leis sin ní bheidh muid in ann nód a thosú gan cumraíocht iomlán a sholáthar.
Taifeach seoladh nód
Chun nasc a bhunú ní mór dúinn seoladh fíor-óstach do gach nód. D'fhéadfadh sé a bheith ar eolas níos déanaí ná codanna eile den chumraíocht. Mar sin, teastaíonn bealach uainn le léarscáiliú a sholáthar idir an t-aitheantas nód agus an seoladh iarbhír. Is feidhm í an mhapáil seo:
case class NodeAddress[NodeId](host: Uri.Host)
trait AddressResolver[F[_]] {
def resolve[NodeId](nodeId: NodeId): F[NodeAddress[NodeId]]
}Tá roinnt bealaí féideartha ann chun feidhm den sórt sin a chur i bhfeidhm.
- Má tá seoltaí iarbhíre ar eolas againn roimh imscaradh, le linn an toirt óstaigh nód, is féidir linn cód Scala a ghiniúint leis na seoltaí iarbhír agus an tógáil a reáchtáil ina dhiaidh sin (a dhéanann seiceálacha ama a thiomsú agus a ritheann sraith tástála comhtháthaithe). Sa chás seo tá eolas statach ar ár bhfeidhm mapála agus is féidir í a shimpliú go dtí rud éigin mar a
Map[NodeId, NodeAddress]. - Uaireanta ní fhaighimid seoltaí iarbhír ach ag pointe níos déanaí nuair a thosaíonn an nód iarbhír, nó níl seoltaí nóid againn nár cuireadh tús leo fós. Sa chás seo d'fhéadfadh go mbeadh seirbhís fionnachtana againn a thosaítear roimh gach nód eile agus d'fhéadfadh gach nód a sheoladh a fhógairt sa tseirbhís sin agus liostáil le spleáchais.
- Más féidir linn a mhodhnú
/etc/hosts, is féidir linn ainmneacha óstaigh réamhshainithe a úsáid (cosúil lemy-project-main-nodeagusecho-backend) agus nasc díreach an t-ainm seo le seoladh IP ag am imlonnaithe.
Sa phost seo ní dhéanaimid na cásanna seo a chlúdach go mion níos mó. Go deimhin inár sampla bréagán beidh an seoladh IP céanna ag gach nóid — 127.0.0.1.
Sa phost seo déanfaimid machnamh ar dhá leagan amach córais dáilte:
- Leagan amach nód aonair, ina gcuirtear na seirbhísí go léir ar an nód aonair.
- Leagan amach dhá nód, áit a bhfuil an tseirbhís agus an cliant ar nóid éagsúla.
An chumraíocht le haghaidh a Seo a leanas an leagan amach:
Cumraíocht nód aonair
object SingleNodeConfig extends EchoConfig[String]
with EchoClientConfig[String] with FiniteDurationLifecycleConfig
{
case object Singleton // identifier of the single node
// configuration of server
type NodeId = Singleton.type
def nodeId = Singleton
/** Type safe service port specification. */
override def portNumber: PortNumber = 8088
// configuration of client
/** We'll use the service provided by the same host. */
def echoServiceDependency = echoService
override def testMessage: UrlPathElement = "hello"
def pollInterval: FiniteDuration = 1.second
// lifecycle controller configuration
def lifetime: FiniteDuration = 10500.milliseconds // additional 0.5 seconds so that there are 10 requests, not 9.
}Anseo cruthaímid cumraíocht amháin a leathnaíonn cumraíocht an fhreastalaí agus an chliaint araon. Chomh maith leis sin déanaimid rialtóir saolré a chumrú a chríochnóidh cliant agus freastalaí ina dhiaidh sin de ghnáth lifetime pasanna eatramh.
Is féidir an tsraith chéanna feidhmiúcháin agus cumraíochtaí seirbhíse a úsáid chun leagan amach córais a chruthú le dhá nód ar leith. Ní mór dúinn ach a chruthú leis na seirbhísí cuí:
Cumraíocht dhá nóid
object NodeServerConfig extends EchoConfig[String] with SigTermLifecycleConfig
{
type NodeId = NodeIdImpl
def nodeId = NodeServer
override def portNumber: PortNumber = 8080
}
object NodeClientConfig extends EchoClientConfig[String] with FiniteDurationLifecycleConfig
{
// NB! dependency specification
def echoServiceDependency = NodeServerConfig.echoService
def pollInterval: FiniteDuration = 1.second
def lifetime: FiniteDuration = 10500.milliseconds // additional 0.5 seconds so that there are 10 request, not 9.
def testMessage: String = "dolly"
}Féach mar a shonraímid an spleáchas. Luaímid seirbhís soláthraithe an nód eile mar spleáchas ar an nód reatha. Déantar an cineál spleáchais a sheiceáil toisc go bhfuil cineál phantom ann a chuireann síos ar phrótacal. Agus ag am rite beidh an t-aitheantas nód ceart againn. Tá sé seo ar cheann de na gnéithe tábhachtacha den chur chuige cumraíochta atá beartaithe. Soláthraíonn sé an cumas dúinn port a shocrú ach uair amháin agus a chinntiú go bhfuil muid ag tagairt don chalafort ceart.
Cur i bhfeidhm dhá nód
Chun an chumraíocht seo a úsáid bainimid úsáid as na feidhmiúcháin seirbhísí céanna. Gan athruithe ar chor ar bith. Mar sin féin, cruthaímid dhá fheidhmiú nód éagsúla ina bhfuil sraith éagsúil seirbhísí:
object TwoJvmNodeServerImpl extends ZeroServiceImpl[IO] with EchoServiceService with SigIntLifecycleServiceImpl {
type Config = EchoConfig[String] with SigTermLifecycleConfig
}
object TwoJvmNodeClientImpl extends ZeroServiceImpl[IO] with EchoClientService with FiniteDurationLifecycleServiceImpl {
type Config = EchoClientConfig[String] with FiniteDurationLifecycleConfig
}Cuireann an chéad nód freastalaí i bhfeidhm agus ní gá dó ach config taobh an fhreastalaí. Cuireann an dara nód cliant i bhfeidhm agus tá cuid eile de config ag teastáil uaidh. Éilíonn an dá nód roinnt sonraíocht feadh an tsaoil. Chun críocha an nód postseirbhíse seo beidh saolré gan teorainn a d'fhéadfaí a fhoirceannadh ag baint úsáide as SIGTERM, cé go dtiocfaidh deireadh le cliant macalla tar éis na tréimhse teoranta cumraithe. Féach ar an le haghaidh sonraí.
Próiseas forbartha foriomlán
Feicfimid conas a athraíonn an cur chuige seo an bealach a n-oibrímid le cumraíocht.
Beidh an chumraíocht mar chód a chur le chéile agus a tháirgeadh Déantán. Dealraíonn sé go bhfuil sé réasúnta Déantán cumraíochta a scaradh ó dhéantúsáin chód eile. Go minic is féidir linn an iliomad cumraíochtaí a bheith againn ar an mbonn cód céanna. Agus ar ndóigh, is féidir linn leaganacha iolracha de bhrainsí cumraíochta éagsúla a bheith againn. I gcumraíocht is féidir linn leaganacha ar leith de leabharlanna a roghnú agus fanfaidh sé seo mar a chéile aon uair a úsáidfimid an chumraíocht seo.
Éiríonn le hathrú cumraíochta athrú cód. Mar sin ba cheart é a bheith clúdaithe ag an bpróiseas dearbhaithe cáilíochta céanna:
Ticéad -> PR -> athbhreithniú -> chumasc -> comhtháthú leanúnach -> imscaradh leanúnach
Tá na hiarmhairtí seo a leanas ag an gcur chuige:
- Tá an chumraíocht comhleanúnach do shampla córais ar leith. Dealraíonn sé nach bhfuil aon bhealach ann nasc mícheart a bheith idir nóid.
- Níl sé éasca cumraíocht a athrú ach in aon nód amháin. Dealraíonn sé go bhfuil sé míréasúnta logáil isteach agus roinnt comhaid téacs a athrú. Mar sin éiríonn sruth cumraíochta níos lú is féidir.
- Níl sé éasca athruithe beaga cumraíochta a dhéanamh.
- Leanfaidh an chuid is mó de na hathruithe cumraíochta an próiseas forbartha céanna, agus déanfaidh sé roinnt athbhreithnithe.
An gá dúinn stór ar leith le haghaidh cumraíocht táirgthe? D’fhéadfadh faisnéis íogair a bheith sa chumraíocht táirgthe ar mhaith linn a choinneáil as teacht ar go leor daoine. Mar sin b’fhiú stór ar leith a choinneáil le rochtain theoranta ina mbeidh an chumraíocht táirgthe. Is féidir linn an chumraíocht a roinnt ina dhá chuid - ceann ina bhfuil na paraiméadair táirgthe is oscailte agus ceann ina bhfuil an chuid rúnda den chumraíocht. Chuirfeadh sé seo ar chumas an chuid is mó de na forbróirí rochtain a fháil ar fhormhór mór na bparaiméadar agus srian ar rochtain ar rudaí fíor-íogair. Is furasta é seo a bhaint amach trí úsáid a bhaint as tréithe idirmheánacha a bhfuil luachanna paraiméadair réamhshocraithe acu.
Éagsúlachtaí
Feicfimid na buntáistí agus na míbhuntáistí a bhaineann leis an gcur chuige atá beartaithe i gcomparáid leis na teicnící bainistíochta cumraíochta eile.
Ar an gcéad dul síos, déanfaimid roinnt roghanna eile a liostú ar na gnéithe éagsúla den bhealach atá beartaithe chun déileáil le cumraíocht:
- Comhad téacs ar an meaisín sprioc.
- Stóras láraithe eochairluacha (cosúil le
etcd/zookeeper). - Comhpháirteanna fophróisis a d'fhéadfaí a athchumrú/atosú gan an próiseas a atosú.
- Cumraíocht lasmuigh de rialú déantán agus leagan.
Tugann an téacschomhad roinnt solúbthachta maidir le socruithe ad hoc. Is féidir le riarthóir córais logáil isteach sa nód sprice, athrú a dhéanamh agus an tseirbhís a atosú. Seans nach bhfuil sé seo chomh maith do chórais níos mó. Níl aon rian fágtha ar an athrú. Ní dhéantar athbhreithniú ar an athrú le péire súl eile. D’fhéadfadh sé a bheith deacair a fháil amach cad ba chúis leis an athrú. Níor tástáladh é. Ó thaobh an chórais dáilte de ní féidir le riarthóir dearmad a dhéanamh ach an chumraíocht a nuashonrú i gceann de na nóid eile.
(Btw, má bhíonn gá le comhaid cumraíochta téacs a úsáid sa deireadh, ní bheidh orainn ach parsálaí + bailíochtóir a chur leis a d'fhéadfadh an rud céanna a tháirgeadh Config cineál agus a bheadh go leor chun tús a úsáid configs téacs. Léiríonn sé seo freisin go bhfuil castacht cumraíochta tiomsaithe-ama beagán níos lú ná castacht na cumraíochta téacs-bhunaithe, mar i leagan téacs-bhunaithe ní mór dúinn roinnt cód breise.)
Meicníocht mhaith is ea stóráil lárluacha lárnach chun meitea-pharaiméadair feidhmchláir a dháileadh. Anseo ní mór dúinn smaoineamh ar na rudaí a mheasaimid a bheith ina luachanna cumraíochta agus cad atá ann ach sonraí. Tugtar feidhm C => A => B de ghnáth tugaimid luachanna a athraíonn go hannamh C "chumraíocht", agus sonraí á n-athrú go minic A - gan ach sonraí a ionchur. Ba cheart cumraíocht a sholáthar don fheidhm níos luaithe ná na sonraí A. Mar gheall ar an smaoineamh seo is féidir linn a rá go bhfuiltear ag súil le minicíocht athruithe cad a d'fhéadfaí a úsáid chun sonraí cumraíochta a idirdhealú ó shonraí díreacha. Chomh maith leis sin de ghnáth tagann sonraí ó fhoinse amháin (úsáideoir) agus tagann cumraíocht ó fhoinse eile (riarachán). Mar thoradh ar dhéileáil le paraiméadair is féidir a athrú tar éis an phróisis tosaigh, méadaítear castacht an iarratais. I gcás paraiméadair den sórt sin beidh orainn a meicníocht seachadta, parsáil agus bailíochtú a láimhseáil, agus luachanna míchearta á láimhseáil. Mar sin, chun castacht clár a laghdú, b'fhearr dúinn líon na bparaiméadar ar féidir leo athrú ag am rite a laghdú (nó fiú deireadh a chur leo ar fad).
Ó thaobh an phoist seo ba cheart dúinn idirdhealú a dhéanamh idir paraiméadair statacha agus dinimiciúla. Má éilíonn loighic na seirbhíse athrú annamh ar roinnt paraiméadair ag am rite, is féidir linn paraiméadair dhinimiciúla a thabhairt orthu. Seachas sin tá siad statach agus d'fhéadfaí iad a chumrú ag baint úsáide as an gcur chuige atá beartaithe. D'fhéadfadh cur chuige eile a bheith ag teastáil le haghaidh athchumrú dinimiciúil. Mar shampla, d’fhéadfaí codanna den chóras a atosú leis na paraiméadair chumraíochta nua ar bhealach cosúil le próisis ar leith de chóras dáilte a atosú.
(Is é mo thuairim humhal ná athchumrú am rite a sheachaint mar go méadaíonn sé castacht an chórais.
D'fhéadfadh sé a bheith níos éasca a bheith ag brath ar thacaíocht OS chun próisis a atosú. Ach, b’fhéidir nach mbeidh sé indéanta i gcónaí.)
Gné thábhachtach amháin a bhaineann le cumraíocht statach a úsáid a chuireann daoine san áireamh uaireanta cumraíocht dhinimiciúil (gan cúiseanna eile) ná aga neamhfhónaimh seirbhíse le linn nuashonrú cumraíochta. Go deimhin, má tá orainn athruithe a dhéanamh ar chumraíocht statach, ní mór dúinn an córas a atosú ionas go mbeidh luachanna nua éifeachtach. Athraíonn na ceanglais maidir le ham neamhfhónaimh do chórais éagsúla, mar sin seans nach mbeidh sé chomh ríthábhachtach sin. Má tá sé ríthábhachtach, ní mór dúinn pleanáil chun cinn maidir le haon atosú córais. Mar shampla, d'fhéadfaimis a chur i bhfeidhm . Sa chás seo nuair is gá dúinn an córas a atosú, cuirimid tús le cás nua den chóras ag an am céanna, ansin aistrímid BOL chuige, agus ligimid don seanchóras seirbhísiú a dhéanamh ar naisc atá ann cheana féin.
Cad mar gheall ar chumraíocht a choinneáil taobh istigh de dhéantúsán versioned nó lasmuigh? Nuair a choinnítear cumraíocht taobh istigh de dhéantúsán ciallaíonn sé i bhformhór na gcásanna gur éirigh leis an gcumraíocht seo an próiseas dearbhaithe cáilíochta céanna le déantáin eile. Mar sin d'fhéadfadh duine a bheith cinnte go bhfuil an chumraíocht ar chaighdeán maith agus iontaofa. Os a choinne sin, ciallaíonn cumraíocht i gcomhad ar leith nach bhfuil aon rian ar cé a rinne athruithe ar an gcomhad sin agus cén fáth. An bhfuil sé seo tábhachtach? Creidimid gur fearr cumraíocht chobhsaí agus ardchaighdeáin a bheith ann don chuid is mó de na córais táirgthe.
Ligeann leagan den déantúsán fáil amach cathain a cruthaíodh é, cad iad na luachanna atá ann, cad iad na gnéithe atá cumasaithe / díchumasaithe, cé a bhí freagrach as gach athrú sa chumraíocht a dhéanamh. B'fhéidir go mbeadh gá le roinnt iarracht an chumraíocht a choinneáil taobh istigh de dhéantúsán agus is rogha deartha é le déanamh.
Buntáistí agus míbhuntáistí
Anseo ba mhaith linn roinnt buntáistí a aibhsiú agus roinnt míbhuntáistí a bhaineann leis an gcur chuige molta a phlé.
buntáistí
Gnéithe de chumraíocht in- tiomsaithe córais dáilte iomlán:
- Seiceáil statach na cumraíochta. Tugann sé seo leibhéal ard muiníne, go bhfuil an chumraíocht ceart i bhfianaise srianta cineáil.
- Teanga shaibhir cumraíochta. Go hiondúil bíonn cineálacha cur chuige cumraíochta eile teoranta d'ionadaíocht inathraithe ar a mhéad.
Ag baint úsáide as Scala is féidir raon leathan gnéithe teanga a úsáid chun cumraíocht a dhéanamh níos fearr. Mar shampla, is féidir linn tréithe a úsáid chun luachanna réamhshocraithe a sholáthar, rudaí chun raon feidhme difriúil a shocrú, is féidir linn tagairt a dhéanamh dóibhvals sainithe ach uair amháin sa raon feidhme seachtrach (TIRIM). Is féidir seichimh liteartha a úsáid, nó cásanna de ranganna áirithe (Seq,Map, Etc). - DSL. Tá tacaíocht mhaith ag Scala do scríbhneoirí DSL. Is féidir na gnéithe seo a úsáid chun teanga chumraíochta a bhunú atá níos áisiúla agus níos cairdiúla don úsáideoir deiridh, ionas go mbeidh an chumraíocht deiridh inléite ag úsáideoirí fearainn ar a laghad.
- Ionracas agus comhleanúnachas trasna nóid. Ceann de na buntáistí a bhaineann le cumraíocht a bheith agat don chóras dáilte iomlán in aon áit amháin ná go ndéantar na luachanna go léir a shainiú go docht uair amháin agus ansin iad a athúsáid i ngach áit a dteastaíonn uainn iad. Cinntíonn dearbhuithe calafoirt shábháilte freisin go mbeidh an teanga chéanna ag nóid an chórais i ngach cumraíocht cheart. Tá spleáchais shoiléire idir nóid rud a fhágann go bhfuil sé deacair dearmad a dhéanamh roinnt seirbhísí a sholáthar.
- Ard-chaighdeán athruithe. Bunaíonn an cur chuige foriomlán maidir le hathruithe cumraíochta a rith trí ghnáthphróiseas PR caighdeáin arda cáilíochta sa chumraíocht freisin.
- Athruithe cumraíochta comhuaineach. Nuair a dhéanaimid aon athruithe ar an gcumraíocht cinntíonn imscaradh uathoibríoch go bhfuil gach nóid á nuashonrú.
- Simpliú iarratais. Ní gá don fheidhmchlár cumraíocht a pharsáil agus a bhailíochtú agus luachanna cumraíochta míchearta a láimhseáil. Déanann sé seo an t-iarratas iomlán a shimpliú. (Tá roinnt méadú castachta sa chumraíocht féin, ach is comhbhabhtáil chomhfhiosach é i dtreo na sábháilteachta.) Tá sé simplí go leor filleadh ar an ngnáthchumraíocht - níl le déanamh ach na píosaí atá ar iarraidh a chur leis. Tá sé níos éasca tús a chur le cumraíocht tiomsaithe agus cur i bhfeidhm píosaí breise a chur siar go dtí roinnt uaireanta níos déanaí.
- Cumraíocht leagan. Mar gheall ar an bhfíric go leanann athruithe cumraíochta an próiseas forbartha céanna, mar thoradh air sin a fháil againn artifact le leagan uathúil. Ligeann sé dúinn an chumraíocht a athrú ar ais más gá. Is féidir linn fiú cumraíocht a úsáideadh bliain ó shin a imscaradh agus oibreoidh sé go díreach ar an mbealach céanna. Feabhsaíonn cumraíocht chobhsaí intuarthacht agus iontaofacht an chórais dáilte. Socraítear an chumraíocht ag am tiomsaithe agus ní féidir cur isteach go héasca ar chóras táirgthe.
- Modúlacht. Creat modúlach atá sa chreat atá beartaithe agus d’fhéadfaí modúil a chur le chéile ar bhealaí éagsúla chun
tacú le cumraíochtaí éagsúla (socruithe/leagan amach). Go háirithe, is féidir leagan amach nód aonair ar scála beag a bheith ann agus suíomh ilnód ar scála mór. Tá sé réasúnta go mbeadh leagan amach táirgeachta iolrach. - Tástáil. Chun críocha tástála d’fhéadfadh duine seirbhís bhréige a chur i bhfeidhm agus í a úsáid mar spleáchas ar bhealach cineál sábháilte. D'fhéadfaí roinnt leagan amach tástála difriúil le páirteanna éagsúla a chur in ionad bréige a choinneáil ag an am céanna.
- Tástáil chomhtháthaithe. Uaireanta i gcórais dáilte bíonn sé deacair tástálacha lánpháirtithe a rith. Ag baint úsáide as an gcur chuige a thuairiscítear maidir le cineál cumraíochta sábháilte an chórais dáilte iomlán, is féidir linn gach cuid dáilte a rith ar fhreastalaí amháin ar bhealach inrialaithe. Tá sé éasca an scéal a aithris
nuair nach mbíonn ceann de na seirbhísí ar fáil.
Míbhuntáistí
Tá an cur chuige cumraíochta tiomsaithe difriúil ó “gnáthchumraíocht” agus seans nach n-oirfeadh sé do gach riachtanas. Seo cuid de na míbhuntáistí a bhaineann leis an gcumraíocht tiomsaithe:
- Cumraíocht statach. Seans nach mbeadh sé oiriúnach do gach feidhmchlár. I gcásanna áirithe is gá an chumraíocht i dtáirgeadh a shocrú go tapa chun gach beart sábháilteachta a sheachaint. Déanann an cur chuige seo níos deacra é. Tá gá leis an tiomsú agus an ath-imscaradh tar éis aon athrú ar chumraíocht a dhéanamh. Is é seo an ghné agus an t-ualach araon.
- Giniúint cumraíochta. Nuair a ghintear cumraíocht le huirlis uathoibrithe éigin is gá an cur chuige seo a thiomsú ina dhiaidh sin (a d’fhéadfadh go dteipfeadh air ina dhiaidh sin). D'fhéadfadh go mbeadh gá le hiarracht bhreise chun an chéim bhreise seo a chomhtháthú sa chóras tógála.
- Ionstraimí. Tá neart uirlisí in úsáid inniu atá ag brath ar chumraíochtaí téacsbhunaithe. Cuid acu
ní bheidh sé infheidhme nuair a bheidh cumraíocht curtha le chéile. - Tá athrú meoin de dhíth. Tá eolas ag forbróirí agus DevOps ar chomhaid chumraíochta téacs. D'fhéadfadh an smaoineamh cumraíocht a thiomsú cuma aisteach orthu.
- Sula dtabharfar isteach cumraíocht inchurtha isteach, tá gá le próiseas forbartha bogearraí ardchaighdeáin.
Tá roinnt teorainneacha leis an sampla a cuireadh i bhfeidhm:
- Má sholáthraímid cumraíocht bhreise nach n-éilíonn cur i bhfeidhm an nód, ní chuideoidh tiomsaitheoir linn an cur i bhfeidhm as láthair a bhrath. D’fhéadfaí aghaidh a thabhairt air seo trí úsáid a bhaint as
HListnó ADTanna (cás-aicmí) le haghaidh cumraíochta nóid in ionad tréithe agus Patrún Císte. - Ní mór dúinn roinnt pláta coire a chur ar fáil sa chomhad cumraíochta: (
package,import,objectdearbhuithe;
override def's do pharaiméadair a bhfuil luachanna réamhshocraithe acu). D’fhéadfaí tabhairt faoi seo go páirteach trí úsáid a bhaint as DSL. - Sa phost seo ní chumhdaítear linn athchumrú dinimiciúil braislí de nóid chomhchosúla.
Conclúid
Sa phost seo tá plé déanta againn ar an smaoineamh ar chumraíocht a léiriú go díreach sa chód foinse ar bhealach cineál sábháilte. D’fhéadfaí an cur chuige a úsáid i go leor feidhmchlár mar ionadú ar xml- agus cumraíochtaí téacs-bhunaithe eile. In ainneoin go bhfuil ár sampla curtha i bhfeidhm i Scala, d’fhéadfaí é a aistriú go teangacha in-chomhshóite eile (cosúil le Kotlin, C#, Swift, etc.). D’fhéadfaí triail a bhaint as an gcur chuige seo i dtionscadal nua agus, ar eagla nach n-oireann sé go maith, aistriú chuig an sean-nós.
Ar ndóigh, tá próiseas forbartha ardchaighdeáin ag teastáil ó chumraíocht inchurtha. Mar chúiteamh, geallann sé cumraíocht láidir d'ardchaighdeán a sholáthar.
D’fhéadfaí an cur chuige seo a leathnú ar bhealaí éagsúla:
- D’fhéadfaí macraí a úsáid chun bailíochtú cumraíochta a dhéanamh agus go dteipfeadh orthu ag an am tiomsaithe i gcás teipeanna ar bith maidir le srianta loighice gnó.
- D’fhéadfaí DSL a chur i bhfeidhm chun cumraíocht a léiriú ar bhealach atá éasca le húsáid ag an bhfearann.
- Bainistíocht acmhainní dinimiciúil le coigeartuithe cumraíochta uathoibríoch. Mar shampla, nuair a choigeartóimid líon na nóid bhraisle b'fhéidir gur mhaith linn (1) na nóid chun cumraíocht beagán modhnaithe a fháil; (2) bainisteoir braisle chun faisnéis nóid nua a fháil.
Go raibh maith agat
Ba mhaith liom buíochas a ghabháil le Andrey Saksonov, Pavel Popov, Anton Nehaev as aiseolas spreagthach a thabhairt ar dhréacht an phoist seo a chabhraigh liom é a dhéanamh níos soiléire.
Foinse: will.com
