Co-rèiteachadh siostam sgaoilte

Anns an dreuchd seo bu mhath leinn dòigh inntinneach a roinn air dèiligeadh ri rèiteachadh siostam sgaoilte.
Tha an rèiteachadh air a riochdachadh gu dìreach ann an cànan Scala ann an dòigh sàbhailte. Tha eisimpleir de bhuileachadh air a mhìneachadh gu mionaideach. Bithear a’ beachdachadh air diofar thaobhan den mholadh, a’ gabhail a-steach buaidh air a’ phròiseas leasachaidh iomlan.

Co-rèiteachadh siostam sgaoilte

(ann an Ruisis)

Ro-ràdh

Le bhith a’ togail shiostaman sgaoilte làidir feumar rèiteachadh ceart is ciallach a chleachdadh air a h-uile nod. Is e fuasgladh àbhaisteach a bhith a’ cleachdadh tuairisgeul cleachdadh teacsa (terraform, ansible no rudeigin le chèile) agus faidhlichean rèiteachaidh air an cruthachadh gu fèin-ghluasadach (gu tric - coisrigte airson gach nód / dreuchd). Bhiodh sinn cuideachd airson na h-aon phròtacalan de na h-aon dreachan a chleachdadh air gach nod conaltraidh (air neo bhiodh cùisean neo-fhreagarrachd againn). Ann an saoghal JVM tha seo a’ ciallachadh gum bu chòir co-dhiù an leabharlann teachdaireachdan a bhith den aon dreach air a h-uile nod conaltraidh.

Dè mu dheidhinn deuchainn a dhèanamh air an t-siostam? Gu dearbh, bu chòir deuchainnean aonad a bhith againn airson a h-uile pàirt mus tig sinn gu deuchainnean amalachaidh. Gus a bhith comasach air toraidhean deuchainn a chuir a-mach air àm ruith, bu chòir dhuinn dèanamh cinnteach gu bheil na dreachan de na leabharlannan uile air an cumail co-ionann an dà chuid ann an ùine ruith agus àrainneachdan deuchainn.

Nuair a bhios tu a’ ruith deuchainnean amalachaidh, gu tric tha e fada nas fhasa an aon shlighe clas a bhith agad air a h-uile nod. Feumaidh sinn dèanamh cinnteach gu bheil an aon shlighe clas air a chleachdadh nuair a bhios sinn ga chleachdadh. (Tha e comasach slighean clas eadar-dhealaichte a chleachdadh air diofar nodan, ach tha e nas duilghe an rèiteachadh seo a riochdachadh agus a chleachdadh gu ceart.) Mar sin gus cùisean a chumail sìmplidh cha bhith sinn a’ beachdachadh ach air slighean clas co-ionann air a h-uile nod.

Tha an rèiteachadh buailteach a thighinn air adhart còmhla ris a’ bhathar-bog. Mar as trice bidh sinn a’ cleachdadh dreachan gus diofar a chomharrachadh
ìrean de leasachadh bathar-bog. Tha e coltach gu bheil e reusanta rèiteachadh a chòmhdach fo riaghladh dreach agus diofar rèiteachaidhean a chomharrachadh le cuid de bhileagan. Mura h-eil ach aon rèiteachadh ann an riochdachadh, faodaidh sinn dreach singilte a chleachdadh mar aithnichear. Aig amannan is dòcha gum bi grunn àrainneachdan cinneasachaidh againn. Agus airson gach àrainneachd is dòcha gu feum sinn meur rèiteachaidh air leth. Mar sin dh’ fhaodadh rèiteachaidhean a bhith air an ainmeachadh le meur agus dreach gus diofar rèiteachaidhean aithneachadh. Bidh gach leubail meur agus dreach a’ freagairt ri aon mheasgachadh de nodan sgaoilte, puirt, goireasan taobh a-muigh, dreachan leabharlainn slighe clas air gach nód. An seo cha bhith sinn a’ còmhdach ach an aon mheur agus a’ comharrachadh rèiteachaidhean le dreach deicheach trì pàirtean (1.2.3), san aon dòigh ri artifacts eile.

Ann an àrainneachdan an latha an-diugh chan eil faidhlichean rèiteachaidh air an atharrachadh le làimh tuilleadh. Mar as trice bidh sinn a’ gineadh
config faidhlichean aig àm cleachdadh agus na suil riu às deidh sin. Mar sin dh’ fhaodadh duine faighneachd carson a tha sinn fhathast a’ cleachdadh cruth teacsa airson faidhlichean rèiteachaidh? Is e roghainn obrachaidh an rèiteachadh a chuir am broinn aonad cruinneachaidh agus buannachd fhaighinn bho dhearbhadh rèiteachadh ùine cruinneachaidh.

Anns an dreuchd seo nì sinn sgrùdadh air a’ bheachd a bhith a’ cumail an rèiteachaidh anns an artifact cruinnichte.

Rèiteachadh a ghabhas cur ri chèile

Anns an earrainn seo bruidhnidh sinn air eisimpleir de rèiteachadh statach. Tha dà sheirbheis shìmplidh - seirbheis mac-talla agus neach-dèiligidh an t-seirbheis mac-talla gan rèiteachadh agus gan cur an gnìomh. An uairsin tha dà shiostam sgaoilte eadar-dhealaichte leis an dà sheirbheis air an cur sa bhad. Tha aon airson rèiteachadh aon nód agus fear eile airson rèiteachadh dà nod.

Tha siostam cuairteachaidh àbhaisteach air a dhèanamh suas de ghrunn nodan. Faodar na nodan aithneachadh le bhith a’ cleachdadh seòrsa de sheòrsa:

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

no dìreach

case class NodeId(hostName: String)

no fiù 's

object Singleton
type NodeId = Singleton.type

Bidh na nodan sin a’ coileanadh diofar dhleastanasan, a’ ruith cuid de sheirbheisean agus bu chòir dhaibh a bhith comasach air conaltradh leis na nodan eile tro cheanglaichean TCP/HTTP.

Airson ceangal TCP tha feum air àireamh port co-dhiù. Tha sinn cuideachd airson dèanamh cinnteach gu bheil teachdaiche agus frithealaiche a’ bruidhinn air an aon phròtacal. Gus ceangal a dhealbhadh eadar nodan, leig dhuinn an clas a leanas ainmeachadh:

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

far a bheil Port dìreach na Int taobh a-staigh an raon ceadaichte:

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

Seòrsan ath-leasaichte

Faicibh mìorbhaileach leabharlann. Ann an ùine ghoirid, leigidh e leat cuingealachadh ùine a chuir ri chèile gu seòrsachan eile. Anns a 'chùis seo Int chan eil e ceadaichte ach luachan 16-bit a bhith agad a dh’ fhaodadh àireamh puirt a riochdachadh. Chan eil feum air an leabharlann seo a chleachdadh airson an dòigh rèiteachaidh seo. Tha e dìreach coltach gu bheil e a’ freagairt gu math.

Airson HTTP (REST) ​​​​is dòcha gum feum sinn slighe den t-seirbheis cuideachd:

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

Seòrsa phantom

Gus protocol a chomharrachadh aig àm cur ri chèile tha sinn a’ cleachdadh feart Scala ann a bhith ag ainmeachadh argamaid seòrsa Protocol nach eil air a chleachdadh sa chlas. Tha e mar sin ris an canar seòrsa phantom. Aig àm ruith is ann ainneamh a bhios feum againn air eisimpleir de aithnichear protocol, is e sin as coireach nach bi sinn ga stòradh. Aig àm cur ri chèile tha an seòrsa phantom seo a’ toirt seachad sàbhailteachd a bharrachd. Chan urrainn dhuinn port a thoirt seachad le protocol ceàrr.

Is e aon de na protocolaidhean as fharsainge a chleachdar REST API le sreathachadh Json:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

far a bheil RequestMessage an seòrsa teachdaireachdan bunaiteach as urrainn don neach-dèiligidh a chuir chun t-seirbheisiche agus ResponseMessage 's e an teachdaireachd freagairt bhon fhrithealaiche. Gu dearbh, is dòcha gun cruthaich sinn tuairisgeulan protocol eile a bhios a ’sònrachadh a’ phròtacal conaltraidh leis a ’mhearachdachd a tha thu ag iarraidh.

Airson adhbharan na dreuchd seo cleachdaidh sinn dreach nas sìmplidh den phròtacal:

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

Anns an iarrtas pròtacal seo tha teachdaireachd an cois url agus thèid an teachdaireachd freagairt a thilleadh mar sreang shìmplidh.

Dh’ fhaodadh suidheachadh seirbheis a bhith air a mhìneachadh le ainm na seirbheis, cruinneachadh de phuirt agus cuid de eisimeileachd. Tha grunn dhòighean comasach air na h-eileamaidean sin uile a riochdachadh ann an Scala (mar eisimpleir, HList, seòrsaichean dàta ailseabra). Airson adhbharan na dreuchd seo cleachdaidh sinn Pàtran Cèic agus riochdaichidh sinn pìosan (modalan) a ghabhas cothlamadh mar fheartan. (Chan eil Pàtran Cèic mar riatanas airson an dòigh-obrach rèiteachaidh seo. Is e dìreach aon bhuileachadh a dh’ fhaodadh a bhith air a ’bheachd.)

Dh’ fhaodadh eisimeileachd a bhith air a riochdachadh le bhith a’ cleachdadh Pàtran nan Cèic mar phuingean crìochnachaidh nodan 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)
  }

Chan fheum seirbheis mac-talla ach port air a rèiteachadh. Agus tha sinn a’ cur an cèill gu bheil am port seo a’ toirt taic do phròtacal mac-talla. Thoir an aire nach fheum sinn port sònraichte a shònrachadh aig an àm seo, leis gu bheil feartan a’ ceadachadh dearbhadh mu dhòighean eas-chruthach. Ma chleachdas sinn dòighean eas-chruthach, bidh feum aig an neach-cruinneachaidh air buileachadh ann an suidheachadh rèiteachaidh. An seo tha sinn air am buileachadh a thoirt seachad (8081) agus thèid a chleachdadh mar an luach bunaiteach ma sguabas sinn e ann an rèiteachadh concrait.

Is urrainn dhuinn eisimeileachd ainmeachadh ann an rèiteachadh an neach-dèiligidh seirbheis mac-talla:

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

Tha an aon sheòrsa aig eisimeileachd ris an echoService. Gu sònraichte, tha e ag iarraidh an aon phròtacal. Mar sin, faodaidh sinn a bhith cinnteach ma cheanglas sinn an dà eisimeileachd sin gun obraich iad gu ceart.

Cur an gnìomh seirbheisean

Feumaidh seirbheis gnìomh airson tòiseachadh agus dùnadh gu gràsmhor. (Tha comas air seirbheis a dhùnadh deatamach airson deuchainn.) A-rithist tha beagan roghainnean ann airson a leithid de ghnìomh a shònrachadh airson config sònraichte (mar eisimpleir, dh’ fhaodadh sinn clasaichean seòrsa a chleachdadh). Airson an dreuchd seo cleachdaidh sinn Cake Pattern a-rithist. Faodaidh sinn riochdachadh seirbheis a 'cleachdadh cats.Resource a tha mar-thà a’ toirt seachad bracaid agus sgaoileadh ghoireasan. Gus goireas fhaighinn bu chòir dhuinn rèiteachadh agus beagan co-theacs runtime a thoirt seachad. Mar sin is dòcha gum bi an gnìomh tòiseachaidh seirbheis coltach:

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

far a bheil

  • Config - an seòrsa rèiteachaidh a dh’ fheumas an neach-tòiseachaidh seirbheis seo
  • AddressResolver - nì runtime aig a bheil comas fìor sheòlaidhean fhaighinn de nodan eile (cumaibh a’ leughadh airson mion-fhiosrachadh).

thig na seòrsaichean eile cats:

  • F[_] - seòrsa buaidh (Anns a’ chùis as sìmplidh F[A] dh'fhaodadh a bhith dìreach () => A. Anns an dreuchd seo cleachdaidh sinn cats.IO.)
  • Reader[A,B] - gu ìre mhòr na cho-fhacal airson gnìomh A => B
  • cats.Resource - tha dòighean ann airson faighinn agus leigeil ma sgaoil
  • Timer - a’ ceadachadh ùine cadail / tomhas
  • ContextShift - analog de ExecutionContext
  • Applicative - còmhdach de ghnìomhan ann an èifeachd (cha mhòr monad) (is dòcha gun cuir sinn rudeigin eile na àite aig a’ cheann thall)

A’ cleachdadh an eadar-aghaidh seo is urrainn dhuinn beagan sheirbheisean a chur an gnìomh. Mar eisimpleir, seirbheis nach dèan dad:

  trait ZeroServiceImpl[F[_]] extends ServiceImpl[F] {
    type Config <: Any
    def resource(...): ResourceReader[F, Config, Unit] =
      Reader(_ => Resource.pure[F, Unit](()))
  }

(Faic Còd tùs airson seirbheisean eile a chur an gnìomh - seirbheis mac-talla,
neach-dèiligidh mac-talla agus luchd-riaghlaidh fad beatha.)

Is e aon nì a th’ ann an nód a bhios a’ ruith beagan sheirbheisean (tha tòiseachadh air sreath de ghoireasan air a chomasachadh le Pàtran Cèic):

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

Thoir an aire gu bheil sinn a 'sònrachadh an dearbh sheòrsa rèiteachaidh a tha a dhìth air an nód seo anns an nód seo. Cha leig an compiler leinn an rud (Cèic) a thogail gun sheòrsa gu leòr, oir tha gach feart seirbheis a’ nochdadh cuingealachadh air an Config seòrsa. Cuideachd cha bhith e comasach dhuinn nód a thòiseachadh gun a bhith a’ toirt seachad rèiteachadh iomlan.

Fuasgladh seòladh nod

Gus ceangal a stèidheachadh feumaidh sinn fìor sheòladh aoigheachd airson gach nód. Is dòcha gu bheil fios nas fhaide air adhart na pàirtean eile den rèiteachadh. Mar sin, feumaidh sinn dòigh air mapadh a sholarachadh eadar nod id agus an fhìor sheòladh aige. Tha gnìomh aig a’ mhapa seo:

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

Tha grunn dhòighean ann airson a leithid de dhleastanas a chuir an gnìomh.

  1. Ma tha fios againn air fìor sheòlaidhean mus tèid an cleachdadh, nuair a bhios sinn a’ toirt aoigheachd do nód, is urrainn dhuinn còd Scala a ghineadh leis na fìor sheòlaidhean agus an togail a ruith às deidh sin (a bhios a’ dèanamh sgrùdaidhean ùine agus an uairsin a’ ruith sreath deuchainn amalachaidh). Anns a’ chùis seo tha ar gnìomh mapaidh aithnichte gu staitigeach agus faodar a dhèanamh nas sìmplidhe gu rudeigin mar a Map[NodeId, NodeAddress].
  2. Aig amannan gheibh sinn fìor sheòlaidhean dìreach aig àm nas fhaide air adhart nuair a thèid an nód a thòiseachadh, no chan eil seòlaidhean nodan againn nach deach tòiseachadh fhathast. Anns a’ chùis seo is dòcha gum bi seirbheis lorg againn a thèid a thòiseachadh ron a h-uile nod eile agus dh’ fhaodadh gach nód a sheòladh san t-seirbheis sin a shanasachadh agus ballrachd a thoirt dha eisimeileachd.
  3. Mas urrainn dhuinn atharrachadh /etc/hosts, is urrainn dhuinn ainmean aoigheachd ro-mhìnichte a chleachdadh (mar my-project-main-node agus echo-backend) agus dìreach ceangail an t-ainm seo le seòladh ip aig àm cleachdadh.

Anns an dreuchd seo cha bhith sinn a’ còmhdach nan cùisean sin nas mionaidiche. Gu dearbh anns an eisimpleir dèideag againn bidh an aon sheòladh IP aig a h-uile nod - 127.0.0.1.

Anns an dreuchd seo beachdaichidh sinn air dà chruth siostam sgaoilte:

  1. Cruth nód singilte, far a bheil a h-uile seirbheis air a chuir air aon nód.
  2. Cruth dà nód, far a bheil seirbheis agus teachdaiche air diofar nodan.

An t-suidheachadh airson a nód singilte tha an cruth mar a leanas:

Suidheachadh aon-nòd

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

An seo bidh sinn a’ cruthachadh aon rèiteachadh a leudaicheas an dà chuid rèiteachadh frithealaiche is teachdaiche. Cuideachd bidh sinn a’ rèiteachadh rianadair cuairt-beatha a thig gu crìch mar as trice teachdaiche agus frithealaiche às deidh sin lifetime pasan eadar-amail.

Faodar an aon sheata de bhuileachadh seirbheis agus rèiteachadh a chleachdadh gus cruth siostam a chruthachadh le dà nod fa leth. Feumaidh sinn dìreach a chruthachadh dà config nód fa leth leis na seirbheisean iomchaidh:

Suidheachadh dà phuing

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

Faic mar a tha sinn a 'sònrachadh an eisimeileachd. Bidh sinn a’ toirt iomradh air seirbheis a thug an nòta eile seachad mar eisimeileachd air an nód gnàthach. Tha an seòrsa eisimeileachd air a sgrùdadh leis gu bheil seòrsa phantom ann a tha a’ toirt cunntas air protocol. Agus aig àm ruith bidh an id nód ceart againn. Is e seo aon de na taobhan cudromach den dòigh rèiteachaidh a thathar a’ moladh. Bheir e dhuinn comas port a shuidheachadh dìreach aon turas agus dèanamh cinnteach gu bheil sinn a’ toirt iomradh air a’ phort cheart.

Cur an gnìomh dà phuing

Airson an rèiteachadh seo bidh sinn a’ cleachdadh na h-aon ghnìomhan seirbheis. Gun atharraichean idir. Ach, cruthaichidh sinn dà bhuileachadh nodan eadar-dhealaichte anns a bheil diofar sheata de sheirbheisean:

  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
  }

Bidh a’ chiad nód a’ cur an gnìomh frithealaiche agus chan fheum e ach rèiteachadh taobh an fhrithealaiche. Bidh an dàrna nód a’ cur an gnìomh teachdaiche agus feumach air pàirt eile de config. Feumaidh an dà nod beagan sònrachadh fad-beatha. Airson adhbharan na seirbheis puist seo bidh beatha gun chrìoch a dh’ fhaodadh a bhith air a chleachdadh SIGTERM, fhad ‘s a thig neach-dèiligidh mac-talla gu crìch às deidh an ùine chrìochnaichte a chaidh a rèiteachadh. Faic an tagradh tòiseachaidh airson mion-fhiosrachadh.

Pròiseas leasachaidh iomlan

Chì sinn mar a tha an dòigh-obrach seo ag atharrachadh an dòigh sa bheil sinn ag obair le rèiteachadh.

Thèid an rèiteachadh mar chòd a chur ri chèile agus bheir e a-mach artifact. Tha e coltach gu bheil e reusanta artifact rèiteachaidh a sgaradh bho artifacts còd eile. Gu tric is urrainn dhuinn grunn rèiteachaidhean a bhith againn air an aon bhunait còd. Agus gu dearbh, is urrainn dhuinn iomadh dreach a bhith againn de dhiofar mheuran rèiteachaidh. Ann an rèiteachadh is urrainn dhuinn dreachan sònraichte de leabharlannan a thaghadh agus bidh seo seasmhach nuair a chleachdas sinn an rèiteachadh seo.

Bidh atharrachadh rèiteachaidh gu bhith na atharrachadh còd. Mar sin bu chòir dha a bhith air a chòmhdach leis an aon phròiseas gealltanas càileachd:

Tiogaid -> PR -> lèirmheas -> tighinn còmhla -> amalachadh leantainneach -> cleachdadh leantainneach

Tha na buaidhean a leanas aig an dòigh-obrach:

  1. Tha an rèiteachadh co-chòrdail airson eisimpleir siostam sònraichte. Tha e coltach nach eil dòigh ann air ceangal ceàrr a bhith eadar nodan.
  2. Chan eil e furasta an rèiteachadh atharrachadh dìreach ann an aon nód. Tha e coltach gu bheil e mì-reusanta logadh a-steach agus cuid de fhaidhlichean teacsa atharrachadh. Mar sin bidh gluasad rèiteachaidh cho comasach.
  3. Chan eil e furasta atharrachaidhean beaga rèiteachaidh a dhèanamh.
  4. Leanaidh a’ mhòr-chuid de na h-atharrachaidhean rèiteachaidh an aon phròiseas leasachaidh, agus thèid e seachad air beagan ath-bhreithneachaidh.

A bheil feum againn air stòr air leth airson rèiteachadh cinneasachaidh? Dh’ fhaodadh gum bi fiosrachadh mothachail anns an rèiteachadh toraidh a bu mhath leinn a chumail a-mach à ruigsinneachd mòran dhaoine. Mar sin is dòcha gum b’ fhiach e stòr air leth a chumail le ruigsinneachd cuibhrichte anns am bi an rèiteachadh toraidh. Faodaidh sinn an rèiteachadh a roinn ann an dà phàirt - aon anns a bheil na crìochan toraidh as fhosgailte agus aon anns a bheil am pàirt dìomhair den rèiteachadh. Bheireadh seo cothrom don mhòr-chuid de luchd-leasachaidh faighinn chun a’ mhòr-chuid de pharamadairean agus aig an aon àm a’ cuingealachadh ruigsinneachd gu rudan fìor mhothachail. Tha e furasta seo a choileanadh le bhith a’ cleachdadh comharran eadar-mheadhanach le luachan paramadair bunaiteach.

Caochlaidhean

Chì sinn buannachdan agus eas-bhuannachdan an dòigh-obrach a thathar a’ moladh an taca ris na dòighean riaghlaidh rèiteachaidh eile.

An toiseach, nì sinn liosta de ghrunn roghainnean eile seach na diofar thaobhan den dòigh a thathar a’ moladh airson dèiligeadh ri rèiteachadh:

  1. Faidhle teacsa air an inneal targaid.
  2. Stòradh luach-iuchrach meadhanaichte (mar etcd/zookeeper).
  3. Co-phàirtean fo-phròiseas a dh’ fhaodadh a bhith air an ath-dhealbhadh / ath-thòiseachadh gun a bhith ag ath-thòiseachadh a’ phròiseas.
  4. Configuration taobh a-muigh artifact agus smachd dreach.

Tha faidhle teacsa a’ toirt beagan sùbailteachd a thaobh fuasglaidhean ad-hoc. Faodaidh rianadair siostam logadh a-steach don nód targaid, atharrachadh a dhèanamh agus dìreach an t-seirbheis ath-thòiseachadh. Is dòcha nach bi seo cho math airson siostaman nas motha. Chan eil comharran sam bith air fhàgail às deidh an atharrachaidh. Chan eil an t-atharrachadh air ath-sgrùdadh le paidhir shùilean eile. Is dòcha gum bi e duilich faighinn a-mach dè a dh’ adhbhraich an t-atharrachadh. Cha deach deuchainn a dhèanamh air. Bho shealladh siostam sgaoilte faodaidh rianadair dìreach dìochuimhneachadh an rèiteachadh ùrachadh ann an aon de na nodan eile.

(Btw, ma bhios feum air tòiseachadh air faidhlichean config teacsa a chleachdadh aig a’ cheann thall, cha bhith againn ach parser + validator a chur ris a dh’ fhaodadh an aon rud a thoirt gu buil. Config seòrsa agus bhiodh sin gu leòr airson tòiseachadh air configs teacsa a chleachdadh. Tha seo cuideachd a’ sealltainn gu bheil iom-fhillteachd rèiteachadh ùine cruinneachaidh beagan nas lugha na iom-fhillteachd configs stèidhichte air teacsa, oir ann an dreach stèidhichte air teacsa feumaidh sinn còd a bharrachd.)

Tha stòradh meadhan-luach na dhòigh math airson meta paramadairean tagraidh a sgaoileadh. An seo feumaidh sinn smaoineachadh air na tha sinn a 'meas mar luachan rèiteachaidh agus dè dìreach dàta. Air sgàth gnìomh C => A => B mar as trice chanas sinn luachan a tha ag atharrachadh ach ainneamh C "rèiteachadh", fhad 'sa tha dàta air atharrachadh gu tric A - dìreach cuir a-steach dàta. Bu chòir rèiteachadh a thoirt don ghnìomh nas tràithe na an dàta A. Leis a’ bheachd seo is urrainn dhuinn a ràdh gu bheil tricead atharrachaidhean ris a bheil dùil dè a ghabhadh a chleachdadh gus dàta rèiteachaidh a dhealachadh bho dìreach dàta. Cuideachd mar as trice thig dàta bho aon stòr (cleachdaiche) agus thig an rèiteachadh bho thùs eile (rianachd). Le bhith a’ dèiligeadh ri paramadairean a ghabhas atharrachadh às deidh a’ phròiseas tòiseachaidh bidh àrdachadh ann an iom-fhillteachd tagraidh. Airson crìochan mar sin feumaidh sinn an uidheamachd lìbhrigidh aca a làimhseachadh, parsadh agus dearbhadh, a’ làimhseachadh luachan ceàrr. Mar sin, gus iom-fhillteachd phrògraman a lughdachadh, b’ fheàrr dhuinn an àireamh de pharamadairean as urrainn atharrachadh aig àm ruith a lughdachadh (no eadhon cuir às dhiubh gu tur).

Bho shealladh na dreuchd seo bu chòir dhuinn eadar-dhealachadh a dhèanamh eadar paramadairean statach agus fiùghantach. Ma dh’ fheumas loidsig seirbheis atharrachadh ainneamh air cuid de pharamadairean aig àm ruith, is dòcha gun can sinn paramadairean fiùghantach riutha. Mur eil, tha iad statach agus dh’ fhaodadh iad a bhith air an rèiteachadh leis an dòigh-obrach a thathar a’ moladh. Airson ath-dhealbhadh fiùghantach dh’ fhaodadh gum bi feum air dòighean-obrach eile. Mar eisimpleir, dh’ fhaodadh pàirtean den t-siostam ath-thòiseachadh leis na paramadairean rèiteachaidh ùr san aon dòigh ri pròiseasan fa-leth de shiostam sgaoilte ath-thòiseachadh.
(Is e mo bheachd iriosal ath-dhealbhadh runtime a sheachnadh oir tha e a’ meudachadh iom-fhillteachd an t-siostaim.
Is dòcha gum biodh e nas fhasa a bhith dìreach an urra ri taic OS airson pròiseasan ath-thòiseachadh. Ach, is dòcha nach bi e an-còmhnaidh comasach.)

Is e aon taobh chudromach de bhith a’ cleachdadh rèiteachadh statach a bhios uaireannan a’ toirt air daoine beachdachadh air rèiteachadh fiùghantach (gun adhbharan eile) ùine downt seirbheis rè ùrachadh rèiteachaidh. Gu dearbh, ma dh'fheumas sinn atharrachaidhean a dhèanamh air rèiteachadh statach, feumaidh sinn an siostam ath-thòiseachadh gus am bi luachan ùra èifeachdach. Bidh na riatanasan airson ùine downt ag atharrachadh airson diofar shiostaman, agus mar sin is dòcha nach bi e cho deatamach. Ma tha e deatamach, feumaidh sinn planadh air adhart airson siostam sam bith ath-thòiseachadh. Mar eisimpleir, b 'urrainn dhuinn a chur an gnìomh Ceangal AWS ELB a’ drèanadh. Anns an t-suidheachadh seo nuair a dh’ fheumas sinn an siostam ath-thòiseachadh, tòisichidh sinn eisimpleir ùr den t-siostam aig an aon àm, an uairsin atharraichidh sinn ELB thuige, agus sinn a’ leigeil leis an t-seann shiostam seirbheiseachadh nan ceanglaichean a th’ ann mar-thà a chrìochnachadh.

Dè mu dheidhinn rèiteachadh a chumail taobh a-staigh artifact dreach no taobh a-muigh? Tha a bhith a’ cumail rèiteachadh taobh a-staigh artifact a’ ciallachadh sa mhòr-chuid de chùisean gu bheil an rèiteachadh seo air a dhol seachad air an aon phròiseas gealltanas càileachd ri artifacts eile. Mar sin dh’ fhaodadh neach a bhith cinnteach gu bheil an rèiteachadh de dheagh chàileachd agus earbsach. Air an làimh eile tha rèiteachadh ann am faidhle air leth a’ ciallachadh nach eil lorg sam bith air cò agus carson a rinn atharrachaidhean air an fhaidhle sin. A bheil seo cudromach? Tha sinn den bheachd gu bheil e nas fheàrr rèiteachadh seasmhach agus àrd-inbhe a bhith aig a’ mhòr-chuid de shiostaman toraidh.

Leigidh dreach den artifact faighinn a-mach cuin a chaidh a chruthachadh, dè na luachan a th’ ann, dè na feartan a tha comasach / ciorramach, cò air an robh uallach airson gach atharrachadh san rèiteachadh a dhèanamh. Is dòcha gu feum e beagan oidhirp gus rèiteachadh a chumail taobh a-staigh artifact agus is e roghainn dealbhaidh a tha ann.

Pros & cons

An seo bu mhath leinn cuid de bhuannachdan a chomharrachadh agus beachdachadh air cuid de eas-bhuannachdan an dòigh-obrach a thathar a’ moladh.

buannachdan

Feartan rèiteachaidh rèiteachaidh siostam sgaoilte iomlan:

  1. Sgrùdadh statach air rèiteachadh. Bheir seo ìre àrd de mhisneachd, gu bheil an rèiteachadh ceart leis na cuingeadan seòrsa.
  2. Cànan rèiteachaidh beairteach. Mar as trice tha dòighean rèiteachaidh eile cuingealaichte ri ionadachadh caochlaideach aig a’ mhòr-chuid.
    Le bhith a’ cleachdadh Scala faodaidh aon raon farsaing de fheartan cànain a chleachdadh gus rèiteachadh a dhèanamh nas fheàrr. Mar eisimpleir, is urrainn dhuinn feartan a chleachdadh gus luachan bunaiteach a thoirt seachad, nithean gus raon eadar-dhealaichte a shuidheachadh, is urrainn dhuinn iomradh a thoirt air vals air a mhìneachadh dìreach aon turas anns an raon a-muigh (DRY). Tha e comasach sreathan litireil a chleachdadh, no eisimpleirean de chlasaichean sònraichte (Seq, Map, msaa).
  3. DSL. Tha taic mhath aig Scala do sgrìobhadairean DSL. Faodaidh aon na feartan sin a chleachdadh gus cànan rèiteachaidh a stèidheachadh a tha nas goireasaiche agus nas fhasa a chleachdadh, gus am bi an rèiteachadh deireannach co-dhiù ri leughadh le luchd-cleachdaidh fearainn.
  4. Ionracas agus co-leanailteachd thar nodan. Is e aon de na buannachdan bho bhith a’ rèiteachadh an t-siostam sgaoilte gu lèir ann an aon àite gu bheil na luachan uile air am mìneachadh gu teann aon uair agus an uairsin air an ath-chleachdadh anns a h-uile àite far a bheil feum againn orra. Dèan cuideachd dearbhaidhean puirt sàbhailte dèan cinnteach gum bi an aon chànan aig nodan an t-siostaim anns a h-uile rèiteachadh ceart. Tha eisimeileachd soilleir eadar nodan a tha ga dhèanamh duilich dìochuimhneachadh cuid de sheirbheisean a thoirt seachad.
  5. Àrd càileachd atharrachaidhean. Tha an dòigh-obrach iomlan airson atharrachadh rèiteachaidh tro phròiseas PR àbhaisteach a’ stèidheachadh ìrean càileachd àrd cuideachd ann an rèiteachadh.
  6. Atharraichean rèiteachaidh aig an aon àm. Nuair a nì sinn atharrachaidhean sam bith air an rèiteachadh bidh cleachdadh fèin-ghluasadach a’ dèanamh cinnteach gu bheilear ag ùrachadh a h-uile nod.
  7. Iarrtas simplidh. Chan fheum an aplacaid rèiteachadh a pharsadh agus a dhearbhadh agus luachan rèiteachaidh ceàrr a làimhseachadh. Bidh seo a 'sìmpleachadh an tagraidh iomlan. (Tha beagan àrdachadh iom-fhillteachd anns an rèiteachadh fhèin, ach tha e na ghluasad mothachail a dh’ ionnsaigh sàbhailteachd.) Tha e gu math sìmplidh tilleadh gu rèiteachadh àbhaisteach - dìreach cuir ris na pìosan a tha a dhìth. Tha e nas fhasa tòiseachadh le rèiteachadh cruinn agus cur an gnìomh pìosan a bharrachd a chuir dheth gu amannan nas fhaide air adhart.
  8. Rèiteachadh dreach. Leis gu bheil atharrachaidhean rèiteachaidh a’ leantainn an aon phròiseas leasachaidh, mar thoradh air an sin gheibh sinn artifact le dreach sònraichte. Leigidh e leinn rèiteachadh atharrachadh air ais ma tha feum air. Faodaidh sinn eadhon rèiteachadh a chleachdadh a chaidh a chleachdadh o chionn bliadhna agus obraichidh e san aon dòigh. Bidh rèiteachadh seasmhach a’ leasachadh ro-innseachd agus earbsachd an t-siostam sgaoilte. Tha an rèiteachadh stèidhichte aig àm cruinneachaidh agus chan urrainnear a chuir an sàs gu furasta air siostam cinneasachaidh.
  9. Modalachd. Tha am frèam a thathar a’ moladh modular agus dh’ fhaodadh modalan a bhith air an cur còmhla ann an diofar dhòighean gus
    cuir taic ri diofar rèiteachaidhean (rèiteachaidhean / cruth). Gu sònraichte, tha e comasach cruth aon nód singilte a bhith agad agus suidheachadh ioma-nòd air sgèile mhòr. Tha e reusanta iomadh cruth toraidh a bhith agad.
  10. Deuchainn. Airson adhbharan deuchainn dh’ fhaodadh neach seirbheis meallta a chuir an gnìomh agus a chleachdadh mar eisimeileachd ann an dòigh shàbhailte. Dh’ fhaodadh grunn chruthan deuchainn eadar-dhealaichte le diofar phàirtean a chuir nan àite magadh a bhith air an cumail aig an aon àm.
  11. Deuchainn amalachadh. Aig amannan ann an siostaman sgaoilte tha e duilich deuchainnean amalachaidh a ruith. A’ cleachdadh an dòigh-obrach a chaidh a mhìneachadh airson seòrsa de rèiteachadh sàbhailte den t-siostam sgaoilte iomlan, is urrainn dhuinn a h-uile pàirt sgaoilte a ruith air aon fhrithealaiche ann an dòigh a ghabhas smachdachadh. Tha e furasta an suidheachadh aithris
    nuair nach eil aon de na seirbheisean rim faighinn.

Eas-bhuannachdan

Tha an dòigh rèiteachaidh cruinnichte eadar-dhealaichte bho rèiteachadh “àbhaisteach” agus is dòcha nach bi e a’ freagairt air a h-uile feum. Seo cuid de na h-eas-bhuannachdan a tha aig an config a chaidh a chur ri chèile:

  1. Suidheachadh statach. Is dòcha nach bi e freagarrach airson a h-uile tagradh. Ann an cuid de chùisean tha feum air an rèiteachadh ann an cinneasachadh a chàradh gu sgiobalta, a’ dol seachad air a h-uile ceum sàbhailteachd. Tha an dòigh-obrach seo ga dhèanamh nas duilghe. Tha feum air an cruinneachadh agus an ath-shuidheachadh às deidh atharrachadh sam bith a dhèanamh air an rèiteachadh. Is e seo an dà chuid am feart agus an eallach.
  2. Ginealach rèiteachaidh. Nuair a thèid config a chruthachadh le inneal fèin-ghluasaid feumaidh an dòigh-obrach seo a bhith air a chruinneachadh às deidh sin (a dh’ fhaodadh sin fàiligeadh). Is dòcha gu feum e oidhirp a bharrachd gus an ceum a bharrachd seo fhilleadh a-steach don t-siostam togail.
  3. Innealan-ciùil. Tha gu leòr innealan gan cleachdadh an-diugh a tha an urra ri rèiteachaidhean teacsa. Cuid dhiubh
    cha bhith e iomchaidh nuair a thèid an rèiteachadh a chuir ri chèile.
  4. Tha feum air atharrachadh inntinn. Tha luchd-leasachaidh agus DevOps eòlach air faidhlichean rèiteachaidh teacsa. Is dòcha gu bheil am beachd air rèiteachadh a chuir ri chèile a’ nochdadh neònach dhaibh.
  5. Mus cuir thu a-steach rèiteachadh cruinneachaidh tha feum air pròiseas leasachadh bathar-bog àrd-inbhe.

Tha cuid de chuingealachaidhean air an eisimpleir a chaidh a chuir an gnìomh:

  1. Ma bheir sinn seachad rèiteachadh a bharrachd nach eil air iarraidh le gnìomhachadh an nód, cha chuidich an compiler sinn gus am buileachadh neo-làthaireach a lorg. Dh’ fhaodadh seo a bhith air a làimhseachadh le bhith a’ cleachdadh HList no ADTs (clasaichean cùise) airson rèiteachadh nód an àite feartan agus Pàtran Cèic.
  2. Feumaidh sinn beagan boilerplate a thoirt seachad ann am faidhle config: (package, import, object dearbhaidhean;
    override def's airson paramadairean aig a bheil luachan bunaiteach). Dh’ fhaodadh gun tèid dèiligeadh ri seo gu ìre le bhith a’ cleachdadh DSL.
  3. Anns an dreuchd seo chan eil sinn a’ còmhdach ath-dhealbhadh fiùghantach cruinneachaidhean de nodan co-chosmhail.

Co-dhùnadh

Anns an dreuchd seo tha sinn air beachdachadh air a 'bheachd a bhith a' riochdachadh rèiteachadh gu dìreach anns a 'chòd stòr ann an dòigh sàbhailte. Dh’ fhaodadh an dòigh-obrach a bhith air a chleachdadh ann am mòran thagraidhean an àite xml- agus rèiteachaidhean teacsa eile. A dh 'aindeoin gun deach an eisimpleir againn a chuir an gnìomh ann an Scala, dh' fhaodadh e cuideachd a bhith air eadar-theangachadh gu cànanan eile a ghabhas cur ri chèile (mar Kotlin, C #, Swift, msaa). Dh’ fhaodadh duine an dòigh-obrach seo fheuchainn ann am pròiseact ùr agus, air eagal ‘s nach eil e a’ freagairt gu math, gluais chun t-seann dòigh.

Gu dearbh, feumaidh rèiteachadh cruinneachaidh pròiseas leasachaidh àrd-inbhe. Mar thoradh air an sin tha e a’ gealltainn rèiteachadh làidir de chàileachd a cheart cho àrd.

Faodar an dòigh-obrach seo a leudachadh ann an diofar dhòighean:

  1. Dh’ fhaodadh aon macros a chleachdadh gus dearbhadh rèiteachaidh a dhèanamh agus fàiligeadh aig àm cruinneachaidh gun fhios nach biodh cuingealachaidhean gnìomhachais ann.
  2. Dh’ fhaodadh DSL a bhith air a chuir an gnìomh gus rèiteachadh a riochdachadh ann an dòigh a tha furasta a chleachdadh leis an àrainn.
  3. Riaghladh ghoireasan dinamach le atharrachaidhean rèiteachaidh fèin-ghluasadach. Mar eisimpleir, nuair a dh’ atharraicheas sinn an àireamh de nodan cnuasachaidh a dh’ fhaodadh sinn a bhith ag iarraidh (1) na nodan gus rèiteachadh beagan atharraichte fhaighinn; (2) manaidsear brabhsair gus fiosrachadh nodan ùra fhaighinn.

Mòran taing

Bu mhath leam taing a thoirt do Andrey Saksonov, Pavel Popov, Anton Nehaev airson fios air ais brosnachail a thoirt seachad air dreach na dreuchd seo a chuidich mi gus a dhèanamh nas soilleire.

Source: www.habr.com