Cumraíocht Córas Dáilte tiomsaithe

Ba mhaith liom meicníocht shuimiúil amháin a insint duit chun oibriú le cumraíocht córais dáilte. Léirítear an chumraíocht go díreach i dteanga tiomsaithe (Scala) ag baint úsáide as cineálacha sábháilte. Soláthraíonn an post seo sampla de chumraíocht den sórt sin agus pléann sé gnéithe éagsúla de chumraíocht tiomsaithe a chur i bhfeidhm sa phróiseas forbartha iomlán.

Cumraíocht Córas Dáilte tiomsaithe

(Béarla)

Réamhrá

Ciallaíonn tógáil córas dáilte iontaofa go n-úsáideann gach nóid an chumraíocht cheart, sioncronaithe le nóid eile. De ghnáth úsáidtear teicneolaíochtaí DevOps (terraform, insible nó rud éigin mar sin) chun comhaid cumraíochta a ghiniúint go huathoibríoch (go minic sainiúil do gach nód). Ba mhaith linn a bheith cinnte freisin go bhfuil na nóid chumarsáide go léir ag baint úsáide as prótacail chomhionanna (lena n-áirítear an leagan céanna). Seachas sin, cuirfear neamh-chomhoiriúnacht isteach inár gcóras dáilte. I saol JVM, iarmhairt amháin a bhaineann leis an gceanglas seo ná go gcaithfear an leagan céanna den leabharlann ina bhfuil na teachtaireachtaí prótacail a úsáid i ngach áit.

Cad faoi chóras dáilte a thástáil? Ar ndóigh, glacaimid leis go bhfuil tástálacha aonaid ag gach comhpháirt sula ndéanaimid bogadh ar aghaidh go dtí tástáil chomhtháthaithe. (Le gur féidir linn torthaí tástála a eachtarshuíomh go dtí an t-am rite, ní mór dúinn freisin tacar comhionann leabharlann a sholáthar ag an gcéim tástála agus ag am rite.)

Agus tú ag obair le tástálacha comhtháthaithe, is minic a bhíonn sé níos éasca an cosán céanna a úsáid i ngach áit ar gach nóid. Níl le déanamh againn ach a chinntiú go n-úsáidtear an cosán ranga céanna ag am rite. (Cé gur féidir nóid éagsúla a rith le cosáin ranga éagsúla, cuireann sé seo castacht leis an gcumraíocht iomlán agus deacrachtaí le tástálacha imlonnaithe agus comhtháthaithe.) Chun críocha an phoist seo, táimid ag glacadh leis go mbainfidh gach nóid úsáid as an rangchosán céanna.

Forbraíonn an chumraíocht leis an bhfeidhmchlár. Bainimid úsáid as leaganacha chun céimeanna éagsúla éabhlóid an chláir a aithint. Dealraíonn sé go bhfuil sé loighciúil leaganacha éagsúla de chumraíochtaí a aithint freisin. Agus cuir an chumraíocht féin sa chóras rialaithe leagan. Mura bhfuil ach cumraíocht amháin i dtáirgeadh, is féidir linn an uimhir leagain a úsáid go simplí. Má úsáidimid go leor cásanna táirgthe, ansin beidh roinnt de dhíth orainn
brainsí cumraíochta agus lipéad breise sa bhreis ar an leagan (mar shampla, ainm an bhrainse). Ar an mbealach seo is féidir linn an chumraíocht chruinn a aithint go soiléir. Freagraíonn gach aitheantóir cumraíochta go uathúil le teaglaim shonrach de nóid dáilte, calafoirt, acmhainní seachtracha, agus leaganacha leabharlainne. Chun críocha an phoist seo glacfaimid leis nach bhfuil ach brainse amháin ann agus is féidir linn an chumraíocht a aithint ar an ngnáthbhealach ag baint úsáide as trí uimhir scartha le ponc (1.2.3).

I dtimpeallachtaí nua-aimseartha, is annamh a chruthaítear comhaid chumraíochta de láimh. Níos minice gintear iad le linn imscaradh agus ní dhéantar teagmháil leo a thuilleadh (ionas go mbeidh ná bris rud ar bith). Éiríonn ceist nádúrtha: cén fáth a n-úsáideann muid formáid téacs fós chun cumraíocht a stóráil? Is cosúil gur rogha inmharthana eile é an cumas cód rialta a úsáid le haghaidh cumraíochta agus leas a bhaint as seiceálacha ama tiomsaithe.

Sa phost seo déanfaimid iniúchadh ar an smaoineamh ar chumraíocht a léiriú taobh istigh de dhéantúsán tiomsaithe.

Cumraíocht tiomsaithe

Soláthraíonn an chuid seo sampla de chumraíocht statach tiomsaithe. Cuirtear dhá sheirbhís shimplí i bhfeidhm - an tseirbhís macalla agus an cliant seirbhíse macalla. Bunaithe ar an dá sheirbhís seo, cuirtear dhá rogha córais le chéile. I rogha amháin, tá an dá sheirbhís suite ar an nód céanna, i rogha eile - ar nóid éagsúla.

Go hiondúil bíonn roinnt nóid i gcóras dáilte. Is féidir leat nóid a aithint ag baint úsáide as luachanna de chineál éigin NodeId:

sealed trait NodeId
case object Backend extends NodeId
case object Frontend extends NodeId

case class NodeId(hostName: String)

nó fiú

object Singleton
type NodeId = Singleton.type

Déanann nóid róil éagsúla, ritheann siad seirbhísí agus is féidir naisc TCP/HTTP a bhunú eatarthu.

Teastaíonn uimhir phoirt ar a laghad uainn chun cur síos a dhéanamh ar nasc TCP. Ba mhaith linn freisin an prótacal a bhfuil tacaíocht aige ar an bport sin a léiriú chun a chinntiú go bhfuil an cliant agus an freastalaí araon ag baint úsáide as an bprótacal céanna. Déanfaimid cur síos ar an nasc ag baint úsáide as an rang seo a leanas:

case class TcpEndPoint[Protocol](node: NodeId, port: Port[Protocol])

i gcás Port - ach slánuimhir Int ag léiriú an raon luachanna inghlactha:

type PortNumber = Refined[Int, Closed[_0, W.`65535`.T]]

Cineálacha scagtha

Féach ar an leabharlann scagtha и mo tuarascáil. I mbeagán focal, ceadaíonn an leabharlann duit srianta a chur le cineálacha a dhéantar a sheiceáil ag am tiomsaithe. Sa chás seo, is slánuimhreacha 16-giotán iad luachanna uimhreacha calafoirt bailí. Maidir le cumraíocht tiomsaithe, níl sé éigeantach an leabharlann scagtha a úsáid, ach feabhsaíonn sé cumas an tiomsaitheora an chumraíocht a sheiceáil.

I gcás prótacail HTTP (REST), i dteannta leis an uimhir phoirt, b’fhéidir go mbeadh an cosán chuig an tseirbhís ag teastáil uainn freisin:

type UrlPathPrefix = Refined[String, MatchesRegex[W.`"[a-zA-Z_0-9/]*"`.T]]
case class PortWithPrefix[Protocol](portNumber: PortNumber, pathPrefix: UrlPathPrefix)

Cineálacha phantom

Chun an prótacal a aithint ag am tiomsaithe, úsáidimid paraiméadar cineáil nach n-úsáidtear laistigh den rang. Tá an cinneadh seo mar gheall ar an bhfíric nach n-úsáidimid sampla prótacail ag am rite, ach ba mhaith linn go ndéanfadh an tiomsaitheoir comhoiriúnacht an phrótacail a sheiceáil. Tríd an bprótacal a shonrú, ní bheimid in ann seirbhís mhíchuí a rith mar spleáchas.

Ceann de na prótacail choitianta is ea an REST API le sraithiú Json:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

i gcás RequestMessage - cineál iarratais, ResponseMessage — cineál freagartha.
Ar ndóigh, is féidir linn tuairiscí prótacail eile a úsáid a sholáthraíonn an cruinneas tuairisce a theastaíonn uainn.

Chun críocha an phoist seo, úsáidfimid leagan simplithe den phrótacal:

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

Anseo is teaghrán é an t-iarratas atá i gceangal leis an url agus is é an freagra an teaghrán a cuireadh ar ais i gcorp an fhreagra HTTP.

Déantar cur síos ar chumraíocht na seirbhíse ag ainm na seirbhíse, na poirt agus na spleáchais. Is féidir na gnéithe seo a léiriú i Scala ar bhealaí éagsúla (mar shampla, HList-s, cineálacha sonraí ailgéabracha). Chun críocha an phoist seo, úsáidfimid an Patrún Císte agus seasfaimid modúil ag baint úsáide as trait'ómh. (Ní gné riachtanach den chur chuige seo é an Patrún Císte. Níl ann ach cur i bhfeidhm féideartha amháin.)

Is féidir spleáchais idir seirbhísí a léiriú mar mhodhanna a chuireann calafoirt ar ais EndPointna 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)
  }

Chun seirbhís macalla a chruthú, níl uait ach uimhir phoirt agus comhartha go dtacaíonn an calafort leis an bprótacal macalla. Seans nach sonróidh muid port ar leith, mar... Ceadaíonn tréithe duit modhanna a dhearbhú gan cur chun feidhme (modhanna teibí). Sa chás seo, agus cumraíocht nithiúil á cruthú, d'éileodh an tiomsaitheoir dúinn cur i bhfeidhm an mhodha teibí a sholáthar agus uimhir phoirt a sholáthar. Ós rud é go bhfuil an modh curtha i bhfeidhm againn, agus cumraíocht shonrach á cruthú againn, ní féidir linn calafort difriúil a shonrú. Úsáidfear an luach réamhshocraithe.

I gcumraíocht an chliaint dearbhaímid spleáchas ar an tseirbhís macalla:

  trait EchoClientConfig[A] {
    def testMessage: String = "test"
    def pollInterval: FiniteDuration
    def echoServiceDependency: HttpSimpleGetEndPoint[_, EchoProtocol[A]]
  }

Tá an spleáchas den chineál céanna leis an tseirbhís onnmhairithe echoService. Go háirithe, sa chliant macalla ní mór dúinn an prótacal céanna. Mar sin, agus dhá sheirbhís á nascadh, is féidir linn a bheith cinnte go n-oibreoidh gach rud i gceart.

Seirbhísí a chur i bhfeidhm

Tá feidhm ag teastáil chun an tseirbhís a thosú agus a stopadh. (Tá an cumas chun seirbhís a stopadh ríthábhachtach le haghaidh tástála.) Arís, tá roinnt roghanna ann chun gné den sórt sin a chur i bhfeidhm (mar shampla, d'fhéadfaimis ranganna cineál a úsáid bunaithe ar an gcineál cumraíochta). Chun críocha an phoist seo úsáidfimid an Patrún Císte. Déanfaimid ionadaíocht ar an tseirbhís ag baint úsáide as rang cats.Resource, mar Cuireann an rang seo bealaí ar fáil cheana féin chun scaoileadh acmhainní a ráthú go sábháilte i gcás fadhbanna. Chun acmhainn a fháil, ní mór dúinn cumraíocht agus comhthéacs ama rite réamhdhéanta a sholáthar. Is féidir breathnú mar seo a dhéanamh ar fheidhm tosaithe na 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]
  }

i gcás

  • Config — cineál cumraíochta don tseirbhís seo
  • AddressResolver — réad ama rite a ligeann duit seoltaí nóid eile a fháil amach (féach thíos)

agus cineálacha eile ón leabharlann cats:

  • F[_] — cineál na héifeachta (sa chás is simplí F[A] d'fhéadfadh a bheith díreach ina fheidhm () => A. Sa phost seo úsáidfimid cats.IO.)
  • Reader[A,B] - a shamhlaítear a bheag nó a mhór le feidhm A => B
  • cats.Resource - acmhainn is féidir a fháil agus a scaoileadh
  • Timer — lasc ama (a ligeann duit titim i do chodladh ar feadh tamaill agus eatraimh ama a thomhas)
  • ContextShift - analógach ExecutionContext
  • Applicative — aicme den chineál éifeacht a ligeann duit éifeachtaí aonair a chomhcheangal (beagnach monad). I bhfeidhmchláir níos casta dealraíonn sé níos fearr a úsáid Monad/ConcurrentEffect.

Trí úsáid a bhaint as síniú feidhme 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](()))
  }

(Cm. foinse, ina gcuirtear seirbhísí eile i bhfeidhm - seirbhís macalla, cliant macalla
и rialtóirí feadh an tsaoil.)

Is réad é nód is féidir a sheoladh roinnt seirbhísí (cinntíonn an Patrún Císte seoladh slabhra acmhainní):

object SingleNodeImpl extends ZeroServiceImpl[IO]
  with EchoServiceService
  with EchoClientService
  with FiniteDurationLifecycleServiceImpl
{
  type Config = EchoConfig[String] with EchoClientConfig[String] with FiniteDurationLifecycleConfig
}

Tabhair faoi deara go bhfuil an cineál cumraíochta beacht atá ag teastáil don nód seo á shonrú againn. Má dhéanaimid dearmad ceann de na cineálacha cumraíochta a theastaíonn ó sheirbhís ar leith a shonrú, beidh earráid tiomsaithe ann. Chomh maith leis sin, ní bheimid in ann nód a thosú ach amháin má sholáthraímid réad éigin den chineál cuí leis na sonraí riachtanacha go léir.

Rún Ainm Óstach

Chun nascadh le hóstach iargúlta, ní mór dúinn seoladh IP fíor. Is féidir go dtabharfar an seoladh chun solais níos déanaí ná an chuid eile den chumraíocht. Mar sin teastaíonn feidhm uainn a mhapálann an t-aitheantas nód chuig seoladh:

case class NodeAddress[NodeId](host: Uri.Host)
trait AddressResolver[F[_]] {
  def resolve[NodeId](nodeId: NodeId): F[NodeAddress[NodeId]]
}

Tá roinnt bealaí ann chun an fheidhm seo a chur i bhfeidhm:

  1. Má bhíonn na seoltaí ar eolas againn roimh imscaradh, ansin is féidir linn cód Scala a ghiniúint le
    seoltaí agus ansin rith an tógáil. Déanfaidh sé seo tástálacha a thiomsú agus a reáchtáil.
    Sa chás seo, beidh aithne statach ar an bhfeidhm agus is féidir í a léiriú i gcód mar mhapáil Map[NodeId, NodeAddress].
  2. I gcásanna áirithe, ní fios an seoladh iarbhír ach amháin tar éis don nód tosú.
    Sa chás seo, is féidir linn “seirbhís fionnachtana” a chur i bhfeidhm a ritheann roimh nóid eile agus cláróidh gach nóid leis an tseirbhís seo agus iarrfaidh siad seoltaí nóid eile.
  3. Más féidir linn a mhodhnú /etc/hosts, ansin is féidir leat óstainmneacha réamhshainithe a úsáid (cosúil le my-project-main-node и echo-backend) agus na hainmneacha seo a nascadh go simplí
    le seoltaí IP le linn imscaradh.

Sa phost seo ní dhéanfaimid breithniú níos mine ar na cásanna seo. Le haghaidh ár
i sampla bréagán, beidh an seoladh IP céanna ag gach nóid - 127.0.0.1.

Ansin, breithnímid dhá rogha maidir le córas dáilte:

  1. Gach seirbhís a chur ar aon nód amháin.
  2. Agus an tseirbhís macalla agus an cliant macalla a óstáil ar nóid éagsúla.

Cumraíocht le haghaidh nód amháin:

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.
}

Cuireann an réad cumraíocht an chliaint agus an fhreastalaí araon. Úsáidtear cumraíocht am-go-beo freisin ionas gur tar éis an t-eatramh lifetime deireadh a chur leis an gclár. (Oibríonn Ctrl-C freisin agus saorann sé gach acmhainn i gceart.)

Is féidir an tsraith chéanna tréithe cumraíochta agus cur chun feidhme a úsáid chun córas comhdhéanta de a chruthú dhá nód ar leith:

Cumraíocht dhá nód

  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"
  }

Tábhachtach! Tabhair faoi deara conas atá na seirbhísí nasctha. Sonraímid seirbhís arna cur i bhfeidhm ag nód amháin mar chur i bhfeidhm mhodh spleáchais nód eile. Déanann an tiomsaitheoir an cineál spleáchais a sheiceáil, mar gheall ar ina bhfuil an cineál prótacail. Nuair a bheidh sé á reáchtáil, beidh an sprioc-aitheantas ceart nód sa spleáchas. A bhuí leis an scéim seo, sonraímid uimhir an chalafoirt go díreach uair amháin agus ráthaítear i gcónaí tagairt a dhéanamh don chalafort ceart.

Cur i bhfeidhm dhá nóid chórais

Don chumraíocht seo, úsáidimid na feidhmiúcháin seirbhíse céanna gan athruithe. Is é an t-aon difríocht amháin ná go bhfuil dhá chuspóir againn anois a chuireann tacair éagsúla seirbhísí i bhfeidhm:

  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 an freastalaí i bhfeidhm agus ní gá ach cumraíocht an fhreastalaí. Cuireann an dara nód an cliant i bhfeidhm agus úsáideann sé cuid eile den chumraíocht. Chomh maith leis sin is gá an dá nód a bhainistiú ar feadh an tsaoil. Ritheann an nód freastalaí ar feadh tréimhse éiginnte go dtí go stoptar é SIGTERM'om, agus críochnaíonn nód an chliaint tar éis roinnt ama. Cm. app tosaitheoir.

Próiseas forbartha ginearálta

Feicfimid conas a théann an cur chuige cumraíochta seo i bhfeidhm ar an bpróiseas forbartha iomlán.

Tiomsófar an chumraíocht mar aon leis an gcuid eile den chód agus ginfear Déantán (.jar). Dealraíonn sé ciall a bhaint as an chumraíocht a chur i Déantán ar leith. Tá sé seo toisc gur féidir linn cumraíochtaí iolracha a bheith bunaithe ar an gcód céanna. Arís, is féidir artifacts a fhreagraíonn do bhrainsí cumraíochta éagsúla a ghiniúint. Déantar spleáchais ar leaganacha sonracha de leabharlanna a shábháil mar aon leis an gcumraíocht, agus déantar na leaganacha seo a shábháil go deo nuair a shocraímid an leagan sin den chumraíocht a imscaradh.

Casann aon athrú cumraíochta isteach i athrú cód. Agus dá bhrí sin, gach ceann acu
beidh an t-athrú clúdaithe ag an ngnáthphróiseas dearbhaithe cáilíochta:

Ticéad sa rianaitheoir fabht -> PR -> athbhreithniú -> chumasc leis na brainsí ábhartha ->
comhtháthú -> imscaradh

Is iad na príomh-iarmhairtí a bhaineann le cumraíocht tiomsaithe a chur i bhfeidhm:

  1. Beidh an chumraíocht comhsheasmhach ar fud gach nóid den chóras dáilte. Mar gheall ar an bhfíric go bhfaigheann gach nóid an chumraíocht céanna ó fhoinse amháin.

  2. Tá sé fadhbach an chumraíocht a athrú i gceann amháin de na nóid. Mar sin, ní dócha go mbeidh “sruth cumraíochta” ann.

  3. Éiríonn sé níos deacra athruithe beaga a dhéanamh ar an gcumraíocht.

  4. Tarlóidh formhór na n-athruithe cumraíochta mar chuid den phróiseas forbartha iomlán agus beidh siad faoi réir athbhreithniú.

An dteastaíonn stór ar leith uaim chun an chumraíocht táirgthe a stóráil? Seans go bhfuil pasfhocail agus faisnéis íogair eile sa chumraíocht seo ar mhaith linn rochtain a shrianadh orthu. Bunaithe ar seo, is cosúil go bhfuil ciall leis an chumraíocht deiridh a stóráil i stór ar leith. Is féidir leat an chumraíocht a roinnt ina dhá chuid - ceann ina bhfuil socruithe cumraíochta atá inrochtana go poiblí agus ceann ina bhfuil socruithe srianta. Ligfidh sé seo don chuid is mó d’fhorbróirí rochtain a bheith acu ar chomhshocruithe. Is furasta an deighilt seo a bhaint amach trí úsáid a bhaint as tréithe idirmheánacha ina bhfuil luachanna réamhshocraithe.

Athruithe féideartha

Déanaimis iarracht an chumraíocht tiomsaithe a chur i gcomparáid le roinnt roghanna eile coitianta:

  1. Comhad téacs ar an meaisín sprioc.
  2. Stóras láraithe eochairluacha (etcd/zookeeper).
  3. Comhpháirteanna próisis is féidir a athchumrú/atosú gan an próiseas a atosú.
  4. Cumraíocht a stóráil lasmuigh de rialú déantán agus leagan.

Soláthraíonn comhaid téacs solúbthacht shuntasach i dtéarmaí athruithe beaga. Is féidir le riarthóir an chórais logáil isteach sa nód cianda, athruithe a dhéanamh ar na comhaid chuí agus an tseirbhís a atosú. I gcás córais mhóra, áfach, d'fhéadfadh sé nach mbeadh an tsolúbthacht sin inmhianaithe. Ní fhágann na hathruithe a rinneadh aon rian ar chórais eile. Ní dhéanann aon duine athbhreithniú ar na hathruithe. Tá sé deacair a chinneadh cé go díreach a rinne na hathruithe agus cén fáth. Ní dhéantar tástáil ar athruithe. Má dhéantar an córas a dháileadh, féadfaidh an riarthóir dearmad a dhéanamh ar an athrú comhfhreagrach ar nóid eile.

(Ba chóir a thabhairt faoi deara freisin nach ndúnann cumraíocht tiomsaithe an fhéidearthacht comhaid téacs a úsáid sa todhchaí. Beidh sé go leor parsálaí agus bailíochtóir a chur leis a tháirgeann an cineál céanna aschur Config, agus is féidir leat comhaid téacs a úsáid. Leanann sé láithreach go bhfuil castacht córais le cumraíocht tiomsaithe beagán níos lú ná an chastacht a bhaineann le córais a úsáideann comhaid téacs, mar gheall ar Teastaíonn cód breise ó chomhaid téacs.)

Is meicníocht mhaith é stór lárluacha láraithe chun meitea-pharaiméadair feidhmchlár dáilte a dháileadh. Ní mór dúinn a chinneadh cad iad paraiméadair chumraíochta agus cad iad díreach sonraí. Lig dúinn feidhm a bheith agat C => A => B, agus na paraiméadair C is annamh athruithe, agus sonraí A - go minic. Sa chás seo is féidir linn a rá go bhfuil C - paraiméadair chumraíochta, agus A - sonraí. Dealraíonn sé go bhfuil difríocht idir paraiméadair chumraíochta agus sonraí sa mhéid is go n-athraíonn siad níos minice ná sonraí. Chomh maith leis sin, de ghnáth tagann sonraí ó fhoinse amháin (ón úsáideoir), agus paraiméadair cumraíochta ó fhoinse eile (ó riarthóir an chórais).

Más gá paraiméadair a athraíonn go hannamh a nuashonrú gan an clár a atosú, is minic a bhíonn casta an chláir mar thoradh air seo, mar beidh orainn paraiméadair a sheachadadh ar bhealach éigin, stóráil, parsáil agus seiceáil, agus próiseáil luachanna mícheart. Dá bhrí sin, ó thaobh castacht an chláir a laghdú, déanann sé ciall líon na bparaiméadar is féidir a athrú le linn oibriú an chláir a laghdú (nó gan tacú le paraiméadair den sórt sin ar chor ar bith).

Chun críocha an phoist seo, déanfaimid idirdhealú idir paraiméadair statacha agus dinimiciúla. Má éilíonn loighic na seirbhíse paraiméadair a athrú le linn oibriú an chláir, ansin cuirfimid paraiméadair den sórt sin dinimiciúla. Seachas sin tá na roghanna statach agus is féidir iad a chumrú ag baint úsáide as an chumraíocht tiomsaithe. Le haghaidh athchumrú dinimiciúil, b'fhéidir go mbeadh meicníocht ag teastáil uainn chun codanna den chlár a atosú le paraiméadair nua, cosúil leis an gcaoi a ndéantar próisis an chórais oibriúcháin a atosú. (Is é ár dtuairim go bhfuil sé inmholta athchumrú fíor-ama a sheachaint, ós rud é go n-ardóidh sé seo castacht an chórais. Más féidir, is fearr na cumais OS caighdeánacha a úsáid le haghaidh próisis a atosú.)

Gné thábhachtach amháin a bhaineann le cumraíocht statach a úsáid a chuireann ar dhaoine athchumrú dinimiciúil a mheas ná an t-am a thógann sé ar an gcóras a atosú tar éis nuashonrú cumraíochta (aga aga). Go deimhin, más gá dúinn athruithe a dhéanamh ar an gcumraíocht statach, beidh orainn an córas a atosú chun go dtiocfaidh na luachanna nua i bhfeidhm. Athraíonn an fhadhb aga neamhfhónaimh do chórais éagsúla. I gcásanna áirithe, is féidir leat atosaigh a sceidealú ag am nuair a bhíonn an t-ualach íosta. Más gá duit seirbhís leanúnach a sholáthar, is féidir leat a chur i bhfeidhm Ceangal AWS ELB ag draenáil. Ag an am céanna, nuair is gá dúinn an córas a atosaigh, cuirimid tús le cás comhthreomhar den chóras seo, aistrigh an cothromóir chuige, agus fan go gcríochnófar na sean-naisc. Tar éis deireadh a chur le gach sean-nasc, stopamar sean-áis an chórais.

Breathnaímid anois ar an gceist maidir leis an gcumraíocht a stóráil laistigh nó lasmuigh den déantúsán. Má stóráilimid an chumraíocht taobh istigh de dhéantán, ansin ar a laghad bhí an deis againn cruinneas na cumraíochta a fhíorú le linn an déantáin a thionól. Má tá an chumraíocht lasmuigh den déantúsán rialaithe, tá sé deacair a rianú cé a rinne athruithe ar an gcomhad seo agus cén fáth. Cé chomh tábhachtach agus atá sé? Is é ár dtuairim, i gcás go leor córais táirgthe, tá sé tábhachtach go mbeadh cumraíocht chobhsaí agus ardcháilíochta ann.

Ceadaíonn an leagan de dhéantán duit a chinneadh nuair a cruthaíodh é, cad iad na luachanna atá ann, cad iad na feidhmeanna atá cumasaithe / díchumasaithe, agus cé atá freagrach as aon athrú ar an gcumraíocht. Ar ndóigh, tá gá le roinnt iarracht chun an chumraíocht a stóráil taobh istigh de dhéantán, mar sin ní mór duit cinneadh eolasach a dhéanamh.

Buntáistí agus Coistí

Ba mhaith liom dul i muinín na buntáistí agus na míbhuntáistí a bhaineann leis an teicneolaíocht atá beartaithe.

Buntáistí

Seo thíos liosta de na príomhghnéithe de chumraíocht córais dáilte tiomsaithe:

  1. Seiceáil cumraíochta statach. Ligeann sé duit a bheith cinnte go bhfuil
    tá an chumraíocht ceart.
  2. Teanga chumraíochta saibhir. Go hiondúil, tá modhanna cumraíochta eile teoranta d'ionadú teaghrán athróg ar a mhéad. Agus Scala in úsáid agat, tá raon leathan gnéithe teanga ar fáil chun do chumraíocht a fheabhsú. Mar shampla is féidir linn a úsáid
    tréithe le haghaidh luachanna réamhshocraithe, ag baint úsáide as rudaí le paraiméadair ghrúpa, is féidir linn tagairt a dhéanamh do vals dearbhaithe ach uair amháin (TIRIM) sa raon feidhme faoi iamh. Is féidir leat aon ranganna a chur ar an toirt go díreach laistigh den chumraíocht (Seq, Map, ranganna saincheaptha).
  3. DSL. Tá roinnt gnéithe teanga ag Scala a fhágann gur fusa DSL a chruthú. Is féidir leas a bhaint as na gnéithe seo agus teanga chumraíochta a chur i bhfeidhm atá níos áisiúla don spriocghrúpa úsáideoirí, ionas go mbeidh an chumraíocht inléite ag saineolaithe fearainn ar a laghad. Is féidir le speisialtóirí, mar shampla, páirt a ghlacadh sa phróiseas athbhreithnithe cumraíochta.
  4. Ionracas agus sioncrónú idir nóid. Ceann de na buntáistí a bhaineann le cumraíocht chórais dáilte iomlán a bheith stóráilte ag pointe amháin ná go ndearbhaítear na luachanna go léir go díreach uair amháin agus ansin go n-athúsáidtear iad cibé áit a bhfuil gá leo. Cinntíonn úsáid cineálacha phantom chun calafoirt a dhearbhú go bhfuil nóid ag baint úsáide as prótacail comhoiriúnacha i ngach cumraíocht chórais cheart. Cinntíonn spleáchas sainordaitheach idir na nóid go bhfuil gach seirbhís nasctha.
  5. Athruithe ar ardchaighdeán. Má dhéantar athruithe ar an gcumraíocht trí úsáid a bhaint as comhphróiseas forbartha is féidir caighdeáin ardchaighdeáin a bhaint amach don chumraíocht freisin.
  6. Nuashonrú cumraíochta comhuaineach. Cinntíonn imscaradh córas uathoibríoch tar éis athruithe cumraíochta go ndéantar gach nóid a nuashonrú.
  7. An t-iarratas a shimpliú. Ní gá an t-iarratas a pharsáil, seiceáil cumraíochta, nó láimhseáil luachanna mícheart. Laghdaíonn sé seo castacht an iarratais. (Ní tréith den chumraíocht tiomsaithe é cuid den chastacht cumraíochta a breathnaíodh inár sampla, ach cinneadh comhfhiosach atá á thiomáint ag an fonn chun sábháilteacht níos mó a sholáthar.) Tá sé éasca go leor filleadh ar an gcumraíocht is gnách - ach an ceann atá ar iarraidh a chur i bhfeidhm. páirteanna. Dá bhrí sin, is féidir leat, mar shampla, tosú le cumraíocht tiomsaithe, ag cur i bhfeidhm páirteanna gan ghá a chur siar go dtí an t-am nuair a bhíonn gá leis i ndáiríre.
  8. Cumraíocht fhíoraithe. Ós rud é go leanann athruithe cumraíochta gnáthchinniúint aon athruithe eile, is déantán le leagan uathúil an t-aschur a fhaighimid. Ligeann sé seo dúinn, mar shampla, filleadh ar leagan roimhe seo den chumraíocht más gá. Is féidir linn fiú an chumraíocht a úsáid bliain ó shin agus oibreoidh an córas díreach mar an gcéanna. Feabhsaíonn cumraíocht chobhsaí intuarthacht agus iontaofacht córais dáilte. Ós rud é go bhfuil an chumraíocht socraithe ag an gcéim tiomsaithe, tá sé deacair go leor é a bhréagadh i dtáirgeadh.
  9. Modúlacht. Tá an creat atá beartaithe modúlach agus is féidir na modúil a chomhcheangal ar bhealaí éagsúla chun córais éagsúla a chruthú. Go háirithe, is féidir leat an córas a chumrú chun a reáchtáil ar nód amháin i embodiment amháin, agus ar nóid iolracha i gceann eile. Is féidir leat roinnt cumraíochtaí a chruthú le haghaidh cásanna táirgeachta an chórais.
  10. Tástáil. Trí réada bréige a chur in ionad seirbhísí aonair, is féidir leat leaganacha éagsúla den chóras a fháil atá áisiúil le haghaidh tástála.
  11. Tástáil chomhtháthaithe. Trí chumraíocht amháin a bheith agat don chóras dáilte iomlán is féidir na comhpháirteanna go léir a rith i dtimpeallacht rialaithe mar chuid den tástáil chomhtháthaithe. Is furasta aithris a dhéanamh, mar shampla, ar chás ina mbíonn teacht ar roinnt nóid.

Míbhuntáistí agus teorainneacha

Tá cumraíocht tiomsaithe difriúil ó chur chuige cumraíochta eile agus b'fhéidir nach mbeadh sé oiriúnach do roinnt feidhmchlár. Seo thíos roinnt míbhuntáistí:

  1. Cumraíocht statach. Uaireanta ní mór duit an chumraíocht i dtáirgeadh a cheartú go tapa, ag seachaint na meicníochtaí cosanta go léir. Leis an gcur chuige seo is féidir é a bheith níos deacra. Ar a laghad, beidh tiomsú agus imscaradh uathoibríoch fós ag teastáil. Is gné úsáideach den chur chuige é seo agus is míbhuntáiste é i gcásanna áirithe.
  2. Giniúint cumraíochta. I gcás ina ngintear an comhad cumraíochta le huirlis uathoibríoch, d'fhéadfadh go mbeadh gá le hiarrachtaí breise chun an script tógála a chomhtháthú.
  3. Uirlisí. Faoi láthair, tá fóntais agus teicnící atá deartha chun oibriú le cumraíocht bunaithe ar chomhaid téacs. Ní bheidh gach fóntais/teicnící dá leithéid ar fáil i gcumraíocht tiomsaithe.
  4. Tá athrú ar dhearcadh ag teastáil. Tá taithí ag forbróirí agus DevOps ar chomhaid téacs. D'fhéadfadh go mbeadh an smaoineamh maidir le cumraíocht a thiomsú beagán gan choinne agus neamhghnách agus d'fhéadfadh sé a bheith ina chúis le diúltú.
  5. Tá gá le próiseas forbartha ardchaighdeáin. Chun an chumraíocht tiomsaithe a úsáid go compordach, tá gá le uathoibriú iomlán an phróisis chun an feidhmchlár a thógáil agus a imscaradh (CI/CD). Seachas sin beidh sé deacair go leor.

Lig dúinn fanacht freisin ar roinnt teorainneacha den sampla measta nach bhfuil baint acu leis an smaoineamh ar chumraíocht tiomsaithe:

  1. Má sholáthraímid faisnéis chumraíochta neamhriachtanach nach n-úsáideann an nód, ansin ní chuideoidh an tiomsaitheoir linn an cur i bhfeidhm atá ar iarraidh a bhrath. Is féidir an fhadhb seo a réiteach tríd an Patrún Císte a thréigean agus cineálacha níos dochta a úsáid, mar shampla, HList nó cineálacha sonraí ailgéabracha (cás-aicmí) chun cumraíocht a léiriú.
  2. Tá línte sa chomhad cumraíochta nach mbaineann leis an gcumraíocht féin: (package, import, dearbhuithe réad; override def's do pharaiméadair a bhfuil luachanna réamhshocraithe acu). Is féidir é seo a sheachaint go páirteach má chuireann tú do DSL féin i bhfeidhm. Ina theannta sin, cuireann cineálacha eile cumraíochta (mar shampla, XML) srianta áirithe ar struchtúr an chomhaid.
  3. Chun críocha an phoist seo, nílimid ag smaoineamh ar athchumrú dinimiciúil a dhéanamh ar bhraisle de nóid chosúla.

Conclúid

Sa phost seo, rinneamar iniúchadh ar an smaoineamh ar chumraíocht a léiriú i gcód foinse ag baint úsáide as cumais chun cinn an chórais cineál Scala. Is féidir an cur chuige seo a úsáid in iarratais éagsúla mar ionadú ar mhodhanna cumraíochta traidisiúnta bunaithe ar xml nó comhaid téacs. Cé go gcuirtear ár sampla i bhfeidhm i Scala, is féidir na smaointe céanna a aistriú go teangacha tiomsaithe eile (mar Kotlin, C#, Swift, ...). Is féidir leat an cur chuige seo a thriail i gceann de na tionscadail seo a leanas, agus, mura n-oibríonn sé, bogadh ar aghaidh go dtí an comhad téacs, ag cur na codanna atá ar iarraidh.

Ar ndóigh, éilíonn cumraíocht tiomsaithe próiseas forbartha ardchaighdeáin. Mar chúiteamh, áirithítear ardchaighdeán agus iontaofacht na bhfoirmíochtaí.

Is féidir an cur chuige breithnithe a leathnú:

  1. Is féidir leat macraí a úsáid chun seiceálacha ama tiomsaithe a dhéanamh.
  2. Is féidir leat DSL a chur i bhfeidhm chun an chumraíocht a chur i láthair ar bhealach atá inrochtana d’úsáideoirí deiridh.
  3. Is féidir leat bainistíocht acmhainní dinimiciúil a chur i bhfeidhm le coigeartú cumraíochta uathoibríoch. Mar shampla, éilíonn athrú ar líon na nóid i mbraisle go (1) go bhfaighidh gach nód cumraíocht beagán difriúil; (2) fuair an bainisteoir braisle faisnéis faoi nóid nua.

Buíochas

Ba mhaith liom buíochas a ghabháil le Andrei Saksonov, Pavel Popov agus Anton Nekhaev as a gcáineadh cuiditheach ar an dréacht-alt.

Foinse: will.com

Add a comment