Rèiteachadh siostam cuairteachaidh air a chur ri chèile

Bu mhath leam aon dòigh inntinneach innse dhut airson a bhith ag obair le rèiteachadh siostam sgaoilte. Tha an rèiteachadh air a riochdachadh gu dìreach ann an cànan cruinnichte (Scala) a’ cleachdadh seòrsaichean sàbhailte. Tha an dreuchd seo a’ toirt seachad eisimpleir de leithid de rèiteachadh agus a’ beachdachadh air diofar thaobhan de bhith a’ buileachadh rèiteachadh cruinnichte a-steach don phròiseas leasachaidh iomlan.

Rèiteachadh siostam cuairteachaidh air a chur ri chèile

(Sasannach)

Ro-ràdh

Le bhith a’ togail siostam sgaoilte earbsach tha sin a’ ciallachadh gum bi a h-uile nodan a’ cleachdadh an rèiteachadh ceart, air a shioncronachadh le nodan eile. Mar as trice bidh teicneòlasan DevOps (terraform, ansible no rudeigin mar sin) air an cleachdadh gus faidhlichean rèiteachaidh a ghineadh gu fèin-ghluasadach (gu tric sònraichte airson gach nód). Bu mhath leinn cuideachd a bhith cinnteach gu bheil a h-uile nod conaltraidh a’ cleachdadh protocolaidhean co-ionann (a’ toirt a-steach an aon dreach). Rud eile, thèid neo-fhreagarrachd a thoirt a-steach don t-siostam sgaoilte againn. Ann an saoghal JVM, is e aon bhuil air an riatanas seo gum feumar an aon dreach den leabharlann anns a bheil na teachdaireachdan protocol a chleachdadh anns a h-uile àite.

Dè mu dheidhinn deuchainn air siostam sgaoilte? Gu dearbh, tha sinn a’ gabhail ris gu bheil deuchainnean aonad aig a h-uile pàirt mus gluais sinn air adhart gu deuchainn amalachaidh. (Gus an urrainn dhuinn toraidhean deuchainn a chuir a-mach gu àm ruith, feumaidh sinn cuideachd an aon sheata de leabharlannan a thoirt seachad aig ìre deuchainn agus aig àm ruith.)

Nuair a bhios tu ag obair le deuchainnean amalachaidh, gu tric tha e nas fhasa an aon shlighe clas a chleachdadh anns a h-uile àite air a h-uile nod. Chan eil againn ach dèanamh cinnteach gun tèid an aon shlighe clas a chleachdadh aig àm ruith. (Ged a tha e gu tur comasach diofar nodan a ruith le slighean clas eadar-dhealaichte, tha seo a’ cur iom-fhillteachd ris an rèiteachadh iomlan agus duilgheadasan le deuchainnean cleachdadh agus amalachaidh.) Airson adhbharan na dreuchd seo, tha sinn a’ gabhail ris gun cleachd a h-uile nodan an aon shlighe clas.

Bidh an rèiteachadh ag atharrachadh leis an tagradh. Cleachdaidh sinn dreachan gus diofar ìrean de mean-fhàs phrògraman a chomharrachadh. Tha e coltach gu bheil e loidsigeach cuideachd diofar dhreachan de rèiteachaidhean aithneachadh. Agus cuir an rèiteachadh fhèin anns an t-siostam smachd dreach. Mura h-eil ach aon rèiteachadh ann an riochdachadh, is urrainn dhuinn dìreach àireamh an tionndaidh a chleachdadh. Ma chleachdas sinn iomadh suidheachadh toraidh, bidh feum againn air grunn
meuran rèiteachaidh agus bileag a bharrachd a bharrachd air an dreach (mar eisimpleir, ainm a 'mheur). San dòigh seo is urrainn dhuinn gu soilleir an dearbh rèiteachadh a chomharrachadh. Bidh gach aithnichear rèiteachaidh a’ freagairt gu h-annasach ri measgachadh sònraichte de nodan sgaoilte, puirt, goireasan taobh a-muigh, agus dreachan leabharlainn. Airson adhbharan na dreuchd seo gabhaidh sinn ris nach eil ann ach aon mheur agus is urrainn dhuinn an rèiteachadh aithneachadh san dòigh àbhaisteach a’ cleachdadh trì àireamhan air an sgaradh le dot (1.2.3).

Ann an àrainneachdan an latha an-diugh, is ann ainneamh a thèid faidhlichean rèiteachaidh a chruthachadh le làimh. Nas trice bidh iad air an gineadh aig àm cleachdadh agus chan eilear a’ suathadh orra (gus am bi na briseadh càil). Tha ceist nàdarra ag èirigh: carson a tha sinn fhathast a’ cleachdadh cruth teacsa gus rèiteachadh a stòradh? Tha e coltach gur e roghainn obrachaidh eile an comas còd cunbhalach a chleachdadh airson rèiteachadh agus buannachd fhaighinn bho sgrùdaidhean ùine cruinneachaidh.

Anns an dreuchd seo nì sinn sgrùdadh air a’ bheachd a bhith a’ riochdachadh rèiteachadh taobh a-staigh artifact cruinnichte.

Rèiteachadh cruinnichte

Tha an earrann seo a’ toirt seachad eisimpleir de rèiteachadh cruinnichte statach. Tha dà sheirbheis shìmplidh air an cur an gnìomh - an t-seirbheis mac-talla agus an neach-dèiligidh seirbheis mac-talla. Stèidhichte air an dà sheirbheis seo, tha dà roghainn siostam air an cruinneachadh. Ann an aon roghainn, tha an dà sheirbheis suidhichte air an aon nód, ann an roghainn eile - air diofar nodan.

Mar as trice tha grunn nodan ann an siostam sgaoilte. Faodaidh tu nodan aithneachadh le bhith a’ cleachdadh luachan de sheòrsa air choreigin NodeId:

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

no

case class NodeId(hostName: String)

no eadhon

object Singleton
type NodeId = Singleton.type

Bidh nodan a’ coileanadh diofar dhleastanasan, bidh iad a’ ruith sheirbheisean agus faodar ceanglaichean TCP/HTTP a stèidheachadh eatorra.

Gus cunntas a thoirt air ceangal TCP feumaidh sinn àireamh puirt co-dhiù. Bu mhath leinn cuideachd am pròtacal a tha a’ faighinn taic air a’ phort sin a nochdadh gus dèanamh cinnteach gu bheil an neach-dèiligidh agus an frithealaiche a’ cleachdadh an aon phròtacal. Bheir sinn cunntas air a’ cheangal a’ cleachdadh a’ chlas a leanas:

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

far a bheil Port - dìreach àireamh iomlan Int a’ comharrachadh an raon de luachan iomchaidh:

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

Seòrsan ath-leasaichte

Faic an leabharlann mìorbhaileach и mo aithisg. Ann an ùine ghoirid, leigidh an leabharlann leat cuingeachaidhean a chuir ri seòrsachan a thèid a sgrùdadh aig àm cruinneachaidh. Anns a 'chùis seo, tha luachan àireamh puirt dligheach nan àireamhan 16-bit. Airson rèiteachadh cruinnichte, chan eil e riatanach an leabharlann ath-leasaichte a chleachdadh, ach leasaichidh e comas an neach-cruinneachaidh sgrùdadh a dhèanamh air an rèiteachadh.

Airson protocols HTTP (REST), a bharrachd air àireamh a’ phuirt, is dòcha gum feum sinn an t-slighe chun t-seirbheis cuideachd:

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

Seòrsan phantom

Gus am pròtacal a chomharrachadh aig àm cruinneachaidh, bidh sinn a’ cleachdadh paramadair seòrsa nach eilear a’ cleachdadh taobh a-staigh a’ chlas. Tha an co-dhùnadh seo mar thoradh air nach bi sinn a’ cleachdadh eisimpleir protocol aig àm ruith, ach bu mhath leinn gun dèan an neach-cruinneachaidh sgrùdadh air co-chòrdalachd protocol. Le bhith a 'sònrachadh a' phròtacal, cha bhith e comasach dhuinn seirbheis neo-iomchaidh a thoirt seachad mar eisimeileachd.

Is e aon de na protocolaidhean cumanta an REST API le sreathachadh Json:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

far a bheil RequestMessage - seòrsa iarrtas, ResponseMessage - seòrsa freagairt.
Gu dearbh, is urrainn dhuinn tuairisgeulan protocol eile a chleachdadh a bheir seachad an cruinneas tuairisgeul a tha a dhìth oirnn.

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

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

An seo tha an t-iarrtas na shreang ceangailte ris an url agus is e am freagairt an sreang a chaidh a thilleadh ann am bodhaig freagairt HTTP.

Tha suidheachadh na seirbheis air a mhìneachadh le ainm na seirbheis, puirt, agus eisimeileachd. Faodar na h-eileamaidean sin a riochdachadh ann an Scala ann an grunn dhòighean (mar eisimpleir, HList-s, seòrsaichean dàta ailseabra). Airson adhbharan na dreuchd seo, bidh sinn a 'cleachdadh a' Chèic Pàtran agus riochdachadh mhodalan a 'cleachdadh trait'abh. (Chan eil am Pàtran Cèic na phàirt riatanach den dòigh-obrach seo. Is e dìreach aon bhuileachadh a dh’ fhaodadh a bhith ann.)

Faodar eisimeileachd eadar seirbheisean a riochdachadh mar dhòighean a thilleas puirt EndPointnan nòsan 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)
  }

Gus seirbheis mac-talla a chruthachadh, chan eil agad ach àireamh puirt agus comharra gu bheil am port a’ toirt taic don phròtacal mac-talla. Is dòcha nach ainmich sinn port sònraichte, oir ... Leigidh feartan leat dòighean ainmeachadh gun bhuileachadh (modhan geàrr-chunntas). Anns a 'chùis seo, nuair a bhios sinn a' cruthachadh rèiteachadh concrait, dh'fheumadh an neach-cruinneachaidh dhuinn buileachadh den dòigh eas-chruthach a thoirt seachad agus àireamh port a thoirt seachad. Leis gu bheil sinn air an dòigh a chuir an gnìomh, nuair a chruthaicheas sinn rèiteachadh sònraichte, is dòcha nach ainmich sinn port eile. Thèid an luach bunaiteach a chleachdadh.

Ann an rèiteachadh an neach-dèiligidh bidh sinn a’ cur an cèill eisimeileachd air an t-seirbheis mac-talla:

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

Tha an eisimeileachd den aon sheòrsa ris an t-seirbheis às-mhalairt echoService. Gu sònraichte, anns an neach-dèiligidh mac-talla feumaidh sinn an aon phròtacal. Mar sin, nuair a cheanglas sinn dà sheirbheis, faodaidh sinn a bhith cinnteach gun obraich a h-uile càil ceart.

Cur an gnìomh seirbheisean

Tha feum air gnìomh gus an t-seirbheis a thòiseachadh agus a stad. (Tha an comas stad a chuir air seirbheis deatamach airson deuchainn.) A-rithist, tha grunn roghainnean ann airson a leithid de fheart a chuir an gnìomh (mar eisimpleir, dh’ fhaodadh sinn clasaichean seòrsa a chleachdadh stèidhichte air an t-seòrsa rèiteachaidh). Airson adhbharan na dreuchd seo cleachdaidh sinn am Pàtran Cèic. Riochdaichidh sinn an t-seirbheis a’ cleachdadh clas cats.Resource, oir Tha an clas seo mar-thà a’ toirt seachad dòighean gus gealltainn gu sàbhailte gun tèid goireasan a leigeil ma sgaoil gun fhios nach bi duilgheadasan ann. Gus goireas fhaighinn, feumaidh sinn rèiteachadh agus co-theacsa runtime deiseil a thoirt seachad. Faodaidh gnìomh tòiseachaidh seirbheis coimhead mar seo:

  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 - seòrsa rèiteachaidh airson na seirbheis seo
  • AddressResolver - nì runtime a leigeas leat seòlaidhean nodan eile a lorg (faic gu h-ìosal)

agus seòrsaichean eile bhon leabharlann cats:

  • F[_] - seòrsa de bhuaidh (anns a 'chùis as sìmplidhe F[A] dh’ fhaodadh a bhith dìreach mar ghnìomh () => A. Anns an dreuchd seo cleachdaidh sinn cats.IO.)
  • Reader[A,B] - gu ìre mhòr co-chosmhail ri gnìomh A => B
  • cats.Resource - goireas a gheibhear agus a leigeil ma sgaoil
  • Timer - timer (a’ leigeil leat tuiteam na chadal airson greiseag agus amannan ùine a thomhas)
  • ContextShift - analog ExecutionContext
  • Applicative - clas seòrsa buaidh a leigeas leat buaidhean fa leth a chur còmhla (cha mhòr monad). Ann an tagraidhean nas iom-fhillte tha e coltach gu bheil e nas fheàrr a chleachdadh Monad/ConcurrentEffect.

A’ cleachdadh an ainm-sgrìobhte gnìomh seo is urrainn dhuinn grunn sheirbheisean a chuir 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](()))
  }

(Cm. stòr, anns a bheil seirbheisean eile air an cur an gnìomh - seirbheis mac-talla, neach-dèiligidh mac-talla
и luchd-riaghlaidh fad beatha.)

Is e rud a th’ ann an nód a dh’ fhaodas grunn sheirbheisean a chuir air bhog (tha cur air bhog sreath de ghoireasan air a dhèanamh cinnteach leis a’ phà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 airson an nód seo. Ma dhìochuimhnicheas sinn aon de na seòrsaichean rèiteachaidh a dh’ fheumas seirbheis shònraichte a shònrachadh, bidh mearachd cruinneachaidh ann. Cuideachd, cha bhith e comasach dhuinn nód a thòiseachadh mura toir sinn seachad rudeigin den t-seòrsa iomchaidh leis an dàta riatanach gu lèir.

Fuasgladh Ainm an òstair

Gus ceangal ri aoigheachd iomallach, feumaidh sinn fìor sheòladh IP. Tha e comasach gum bi fios air an t-seòladh nas fhaide na an còrr den rèiteachadh. Mar sin feumaidh sinn gnìomh a tha a’ mapadh ID an nód gu seòladh:

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

Tha grunn dhòighean ann gus an gnìomh seo a chuir an gnìomh:

  1. Ma dh’ aithnicheas sinn na seòlaidhean mus tèid an cleachdadh, is urrainn dhuinn còd Scala a ghineadh le
    seòlaidhean agus an uairsin ruith an togail. Cuiridh seo ri chèile agus ruithidh iad deuchainnean.
    Anns a 'chùis seo, bidh an gnìomh aithnichte gu staitigeach agus faodar a riochdachadh ann an còd mar mhapa Map[NodeId, NodeAddress].
  2. Ann an cuid de chùisean, chan eil fios air an fhìor sheòladh ach às deidh don nód tòiseachadh.
    Anns a ’chùis seo, is urrainn dhuinn“ seirbheis lorg ”a chuir an gnìomh a bhios a’ ruith ro nodan eile agus bidh a h-uile nodan a ’clàradh leis an t-seirbheis seo agus ag iarraidh seòlaidhean nodan eile.
  3. Mas urrainn dhuinn atharrachadh /etc/hosts, an uairsin faodaidh tu ainmean aoigheachd ro-mhìnichte a chleachdadh (mar my-project-main-node и echo-backend) agus dìreach ceangail na h-ainmean sin
    le seòlaidhean IP aig àm cleachdadh.

Anns an dreuchd seo cha bhith sinn a’ beachdachadh air na cùisean sin nas mionaidiche. Airson ar
ann an eisimpleir dèideag, bidh an aon sheòladh IP aig a h-uile nod - 127.0.0.1.

An ath rud, beachdaichidh sinn air dà roghainn airson siostam sgaoilte:

  1. A 'cur a h-uile seirbheis air aon nód.
  2. Agus a’ toirt aoigheachd don t-seirbheis mac-talla agus neach-dèiligidh mac-talla air diofar nodan.

Suidheachadh airson aon nod:

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

Bidh an nì a 'cur an gnìomh rèiteachadh an dà chuid an neach-dèiligidh agus an fhrithealaiche. Bithear a’ cleachdadh rèiteachadh ùine-gu-beò cuideachd gus an tèid às deidh an eadar-ama lifetime cuir crìoch air a’ phrògram. (Bidh Ctrl-C cuideachd ag obair agus a’ saoradh a h-uile goireas gu ceart.)

Faodar an aon sheata de fheartan rèiteachaidh agus buileachaidh a chleachdadh gus siostam a chruthachadh anns a bheil dà nod fa leth:

Dà rèiteachadh node

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

Cudromach! Mothaich mar a tha na seirbheisean ceangailte. Bidh sinn a’ sònrachadh seirbheis air a chuir an gnìomh le aon nód mar bhuileachadh air dòigh eisimeileachd nòta eile. Tha an seòrsa eisimeileachd air a sgrùdadh leis an neach-cruinneachaidh, oir tha an seòrsa protocol ann. Nuair a thèid a ruith, bidh an ID nód targaid ceart anns an eisimeileachd. Taing don sgeama seo, bidh sinn a’ sònrachadh àireamh a’ phuirt dìreach aon turas agus tha sinn an-còmhnaidh cinnteach gun toir sinn iomradh air a’ phort cheart.

Cur an gnìomh dà nodan siostam

Airson an rèiteachadh seo, bidh sinn a’ cleachdadh na h-aon ghnìomhan seirbheis gun atharrachaidhean. Is e an aon eadar-dhealachadh gu bheil dà rud againn a-nis a bhios a’ cur an gnìomh 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’ buileachadh an fhrithealaiche agus chan fheum e ach rèiteachadh an fhrithealaiche. Bidh an dàrna nód a’ cur an neach-dèiligidh an gnìomh agus a’ cleachdadh pàirt eile den rèiteachadh. Cuideachd feumaidh an dà nodan riaghladh fad-beatha. Bidh nód an fhrithealaiche a 'ruith gu bràth gus an tèid a stad SIGTERM'om, agus thig an nód teachdaiche gu crìch an dèidh beagan ùine. Cm. app launcher.

Pròiseas leasachaidh coitcheann

Chì sinn mar a bheir an dòigh rèiteachaidh seo buaidh air a’ phròiseas leasachaidh iomlan.

Thèid an rèiteachadh a chur ri chèile còmhla ris a’ chòrr den chòd agus thèid artifact (.jar) a chruthachadh. Tha e coltach gu bheil e ciallach an rèiteachadh a chuir ann an artifact air leth. Tha seo air sgàth gum faod grunn rèiteachaidhean a bhith againn stèidhichte air an aon chòd. A-rithist, tha e comasach artifacts a ghineadh a fhreagras ri diofar mheuran rèiteachaidh. Bithear a’ sàbhaladh eisimeileachd air dreachan sònraichte de leabharlannan còmhla ris an rèiteachadh, agus thèid na dreachan sin a shàbhaladh gu bràth nuair a cho-dhùnas sinn an dreach sin den rèiteachadh a chleachdadh.

Bidh atharrachadh rèiteachaidh sam bith a’ tionndadh gu atharrachadh còd. Agus mar sin, gach aon
bidh an t-atharrachadh air a chòmhdach leis a’ phròiseas dearbhaidh càileachd àbhaisteach:

Tiogaid san rianadair bug -> PR -> lèirmheas -> cuir còmhla ri meuran iomchaidh ->
amalachadh -> cleachdadh

Is iad na prìomh bhuaidhean bho bhith a’ cur an gnìomh rèiteachadh cruinnichte:

  1. Bidh an rèiteachadh cunbhalach thar gach nod den t-siostam sgaoilte. Leis gu bheil a h-uile nodan a 'faighinn an aon rèiteachadh bho aon stòr.

  2. Tha e duilich an rèiteachadh atharrachadh ann an aon de na nodan a-mhàin. Mar sin, chan eil coltas ann gu bheil “drift rèiteachaidh”.

  3. Bidh e nas duilghe atharrachaidhean beaga a dhèanamh air an rèiteachadh.

  4. Bidh a’ mhòr-chuid de dh’ atharrachaidhean rèiteachaidh a’ tachairt mar phàirt den phròiseas leasachaidh iomlan agus bidh iad fo sgrùdadh.

A bheil feum agam air stòr air leth airson an rèiteachadh toraidh a stòradh? Faodaidh gu bheil faclan-faire agus fiosrachadh mothachail eile anns an rèiteachadh seo air am bu mhath leinn ruigsinneachd a chuingealachadh. Stèidhichte air seo, tha e coltach gu bheil e ciallach an rèiteachadh deireannach a stòradh ann an stòr air leth. Faodaidh tu an rèiteachadh a roinn ann an dà phàirt - aon le roghainnean rèiteachaidh ruigsinneach don phoball agus aon le roghainnean cuibhrichte. Leigidh seo leis a’ mhòr-chuid de luchd-leasachaidh faighinn gu roghainnean cumanta. Tha an dealachadh seo furasta a choileanadh le bhith a’ cleachdadh comharran eadar-mheadhanach anns a bheil luachan bunaiteach.

Caochlaidhean a dh ’fhaodadh a bhith ann

Feuchaidh sinn ri coimeas a dhèanamh eadar an rèiteachadh cruinnichte le cuid de roghainnean cumanta eile:

  1. Faidhle teacsa air an inneal targaid.
  2. Stòr luach-iuchrach meadhanaichte (etcd/zookeeper).
  3. Co-phàirtean pròiseas a ghabhas ath-dhealbhadh / ath-thòiseachadh gun a bhith ag ath-thòiseachadh a’ phròiseas.
  4. A’ stòradh rèiteachadh taobh a-muigh artifact agus smachd dreach.

Tha faidhlichean teacsa a’ toirt sùbailteachd mòr a thaobh atharrachaidhean beaga. Faodaidh rianadair an t-siostaim logadh a-steach don nód iomallach, atharrachaidhean a dhèanamh air na faidhlichean iomchaidh agus an t-seirbheis ath-thòiseachadh. Airson siostaman mòra, ge-tà, is dòcha nach bi an leithid de shùbailteachd feumail. Chan eil na h-atharrachaidhean a chaidh a dhèanamh a’ fàgail lorg sam bith ann an siostaman eile. Chan eil duine a 'dèanamh lèirmheas air na h-atharrachaidhean. Tha e duilich faighinn a-mach cò dìreach a rinn na h-atharrachaidhean agus carson. Chan eil atharrachaidhean air an deuchainn. Ma thèid an siostam a sgaoileadh, faodaidh an rianadair dìochuimhneachadh an atharrachadh co-fhreagarrach a dhèanamh air nodan eile.

(Bu chòir a thoirt fa-near cuideachd nach bi cleachdadh rèiteachadh cruinnichte a’ dùnadh a’ chothroim air faidhlichean teacsa a chleachdadh san àm ri teachd. Bidh e gu leòr parser agus dearbhadair a chur ris a chruthaicheas an aon sheòrsa ri toradh Config, agus faodaidh tu faidhlichean teacsa a chleachdadh. Tha e a’ leantainn sa bhad gu bheil iom-fhillteachd siostam le rèiteachadh cruinnichte beagan nas lugha na iom-fhillteachd siostam a’ cleachdadh faidhlichean teacsa, air sgàth feumaidh faidhlichean teacsa còd a bharrachd.)

Tha stòr luach-iuchrach meadhanaichte na dhòigh math airson a bhith a’ cuairteachadh paramadairean meta de thagradh sgaoilte. Feumaidh sinn co-dhùnadh dè a th’ ann am paramadairean rèiteachaidh agus dè dìreach dàta. Leig leinn gnìomh a bhith againn C => A => B, agus na crìochan C atharrachaidhean ainneamh, agus dàta A - tric. Anns a 'chùis seo faodaidh sinn a ràdh C - crìochan rèiteachaidh, agus A - dàta. Tha e coltach gu bheil crìochan rèiteachaidh eadar-dhealaichte bho dhàta leis nach bi iad ag atharrachadh cho tric ri dàta. Cuideachd, mar as trice bidh dàta a 'tighinn bho aon stòr (bhon neach-cleachdaidh), agus crìochan rèiteachaidh bho fhear eile (bho rianadair an t-siostaim).

Ma dh’ fheumar paramadairean atharrachadh ainneamh ùrachadh gun a bhith ag ath-thòiseachadh a ’phrògram, faodaidh seo gu tric leantainn gu iom-fhillteachd a’ phrògraim, oir feumaidh sinn dòigh air choireigin paramadairean a lìbhrigeadh, stòradh, parsadh is sgrùdadh, agus làimhseachadh luachan ceàrr. Mar sin, bho thaobh a bhith a 'lùghdachadh iom-fhillteachd a' phrògraim, tha e ciallach lùghdachadh a dhèanamh air an àireamh de pharamadairean a dh'fhaodas atharrachadh rè obrachadh a 'phrògraim (no gun a bhith a' toirt taic dha na crìochan sin idir).

Airson adhbharan na dreuchd seo, nì sinn eadar-dhealachadh eadar crìochan statach agus fiùghantach. Ma tha loidsig na seirbheis a 'feumachdainn paramadairean atharrachadh rè obrachadh a' phrògraim, an uairsin canaidh sinn na paramadairean sin fiùghantach. Rud eile tha na roghainnean statach agus faodar an rèiteachadh a’ cleachdadh an rèiteachadh cruinnichte. Airson ath-dhealbhadh fiùghantach, is dòcha gu feum sinn uidheamachd gus pàirtean den phrògram ath-thòiseachadh le paramadairean ùra, coltach ri mar a thèid pròiseasan siostam obrachaidh ath-thòiseachadh. (Nar beachd-sa, tha e ciallach ath-dhealbhadh fìor-ùine a sheachnadh, leis gu bheil seo a’ meudachadh iom-fhillteachd an t-siostaim. Ma ghabhas e dèanamh, tha e nas fheàrr na comasan àbhaisteach OS a chleachdadh airson pròiseasan ath-thòiseachadh.)

Is e aon taobh chudromach de bhith a’ cleachdadh rèiteachadh statach a bheir air daoine beachdachadh air ath-dhealbhadh fiùghantach an ùine a bheir e air an t-siostam ath-thòiseachadh às deidh ùrachadh rèiteachaidh (ùine downt). Gu dearbh, ma dh'fheumas sinn atharrachaidhean a dhèanamh air an rèiteachadh statach, feumaidh sinn an siostam ath-thòiseachadh airson na luachan ùra a thoirt gu buil. Tha duilgheadas ùine downt ag atharrachadh a thaobh cho dona sa tha diofar shiostaman. Ann an cuid de chùisean, faodaidh tu ath-thòiseachadh a chlàradh aig àm nuair nach eil an luchd cho beag. Ma dh'fheumas tu seirbheis leantainneach a thoirt seachad, faodaidh tu a bhuileachadh Ceangal AWS ELB a’ drèanadh. Aig an aon àm, nuair a dh'fheumas sinn an siostam ath-thòiseachadh, bidh sinn a 'cur air bhog eisimpleir co-shìnte den t-siostam seo, atharraich an cothromachadh thuige, agus feitheamh gus an tèid na seann cheanglaichean a chrìochnachadh. Às deidh a h-uile seann cheangal a thighinn gu crìch, dùin sinn an seann eisimpleir den t-siostam.

Leig dhuinn a-nis beachdachadh air a ’cheist mu bhith a’ stòradh an rèiteachaidh taobh a-staigh no taobh a-muigh an artifact. Ma chumas sinn an rèiteachadh taobh a-staigh artifact, an uairsin co-dhiù bha cothrom againn dearbhadh dè cho ceart ‘s a bha an rèiteachadh aig àm co-chruinneachadh an artifact. Ma tha an rèiteachadh taobh a-muigh an artifact fo smachd, tha e duilich lorg cò rinn atharrachaidhean air an fhaidhle seo agus carson. Dè cho cudromach 'sa tha e? Nar beachd-sa, airson mòran de shiostaman toraidh tha e cudromach gum bi rèiteachadh seasmhach agus àrd-inbhe ann.

Leigidh an dreach de artifact leat faighinn a-mach cuin a chaidh a chruthachadh, dè na luachan a th’ ann, dè na gnìomhan a tha comasach / ciorramach, agus cò a tha an urra ri atharrachadh sam bith san rèiteachadh. Gu dearbh, tha feum air beagan oidhirp gus an rèiteachadh a stòradh taobh a-staigh artifact, agus mar sin feumaidh tu co-dhùnadh fiosraichte a dhèanamh.

Pros agus consum

Bu mhath leam fuireach air na buannachdan agus na h-eas-bhuannachdan a tha an lùib an teicneòlais a tha san amharc.

buannachdan

Gu h-ìosal tha liosta de na prìomh fheartan ann an rèiteachadh siostam sgaoilte cruinn:

  1. Sgrùdadh rèiteachaidh statach. A’ leigeil leat a bhith cinnteach sin
    tha an rèiteachadh ceart.
  2. Cànan rèiteachaidh beairteach. Mar as trice, bidh dòighean rèiteachaidh eile cuingealaichte ri ionadachadh caochlaideach sreang aig a’ char as motha. Nuair a bhios tu a’ cleachdadh Scala, tha raon farsaing de fheartan cànain rim faighinn gus do rèiteachadh a leasachadh. Mar eisimpleir, is urrainn dhuinn a chleachdadh
    feartan airson luachan bunaiteach, a’ cleachdadh nithean gu paramadairean buidhne, is urrainn dhuinn iomradh a thoirt air vals a chaidh ainmeachadh dìreach aon turas (DRY) anns an raon cuairteachaidh. Faodaidh tu clasaichean sam bith a chuir gu dìreach taobh a-staigh an rèiteachaidh (Seq, Map, clasaichean àbhaisteach).
  3. DSL. Tha grunn fheartan cànain aig Scala a tha ga dhèanamh nas fhasa DSL a chruthachadh. Tha e comasach brath a ghabhail air na feartan sin agus cànan rèiteachaidh a chuir an gnìomh a tha nas freagarraiche don bhuidheann targaid de luchd-cleachdaidh, gus am bi an rèiteachadh co-dhiù ri leughadh le eòlaichean fearainn. Faodaidh eòlaichean, mar eisimpleir, pàirt a ghabhail anns a’ phròiseas ath-bhreithneachaidh rèiteachaidh.
  4. Ionracas agus sioncronadh eadar nodan. Is e aon de na buannachdan bho bhith a’ rèiteachadh siostam sgaoilte gu lèir a bhith air a stòradh aig aon àm gu bheil na luachan uile air an ainmeachadh dìreach aon uair agus an uairsin air an ath-chleachdadh ge bith càite a bheil feum orra. Le bhith a’ cleachdadh seòrsaichean phantom gus puirt ainmeachadh, nì sin cinnteach gu bheil nodan a’ cleachdadh protocolaidhean co-fhreagarrach anns a h-uile rèiteachadh siostam ceart. Le bhith a’ faighinn eisimeileachd èigneachail soilleir eadar nodan nì sin cinnteach gu bheil a h-uile seirbheis ceangailte.
  5. Atharrachaidhean àrd-inbhe. Le bhith a’ dèanamh atharrachaidhean air an rèiteachadh a’ cleachdadh pròiseas leasachaidh cumanta bidh e comasach ìrean càileachd àrd a choileanadh airson an rèiteachaidh cuideachd.
  6. Ùrachadh rèiteachaidh aig an aon àm. Bidh cleachdadh siostam fèin-ghluasadach às deidh atharrachaidhean rèiteachaidh a’ dèanamh cinnteach gu bheil na nodan uile air an ùrachadh.
  7. A 'sìmplidh an tagraidh. Chan fheum an tagradh parsadh, sgrùdadh rèiteachaidh, no làimhseachadh luachan ceàrr. Bidh seo a 'lùghdachadh iom-fhillteachd an tagraidh. (Chan eil cuid den iom-fhillteachd rèiteachaidh a chaidh fhaicinn san eisimpleir againn na fheart den rèiteachadh a chaidh a chuir ri chèile, ach dìreach co-dhùnadh mothachail air a stiùireadh leis a’ mhiann barrachd sàbhailteachd seòrsa a thoirt seachad.) Tha e gu math furasta tilleadh chun rèiteachadh àbhaisteach - dìreach cuir an gnìomh an rud a tha a dhìth. pàirtean. Mar sin, faodaidh tu, mar eisimpleir, tòiseachadh le rèiteachadh cruinn, a ’cur dheth buileachadh pàirtean neo-riatanach gus an àm nuair a tha feum air.
  8. Suidheachadh dearbhte. Leis gu bheil atharrachaidhean rèiteachaidh a’ leantainn mar a tha àbhaisteach atharrachaidhean sam bith eile, is e artifact le dreach sònraichte an toradh a gheibh sinn. Leigidh seo leinn, mar eisimpleir, tilleadh gu dreach roimhe den rèiteachadh ma tha sin riatanach. Faodaidh sinn eadhon an rèiteachadh a chleachdadh o chionn bliadhna agus obraichidh an siostam dìreach mar an ceudna. Bidh rèiteachadh seasmhach a’ leasachadh ro-innseachd agus earbsachd siostam sgaoilte. Leis gu bheil an rèiteachadh stèidhichte aig an ìre cruinneachaidh, tha e gu math duilich a mhealladh ann an cinneasachadh.
  9. Modalachd. Tha am frèam a tha san amharc modular agus faodar na modalan a chur còmhla ann an diofar dhòighean gus diofar shiostaman a chruthachadh. Gu sònraichte, faodaidh tu an siostam a rèiteachadh gus ruith air aon nód ann an aon sgeadachadh, agus air grunn nodan ann an tè eile. Faodaidh tu grunn rèiteachaidhean a chruthachadh airson suidheachaidhean cinneasachaidh den t-siostam.
  10. Deuchainn. Le bhith a’ cur stuthan meallta an àite sheirbheisean fa-leth, gheibh thu grunn dhreachan den t-siostam a tha goireasach airson deuchainn.
  11. Deuchainn amalachadh. Le bhith a’ faighinn aon rèiteachadh airson an t-siostam sgaoilte gu lèir bidh e comasach na pàirtean uile a ruith ann an àrainneachd fo smachd mar phàirt de dheuchainn amalachaidh. Tha e furasta aithris a dhèanamh, mar eisimpleir, suidheachadh far am bi cuid de nodan ruigsinneach.

Eas-bhuannachdan agus crìochan

Tha rèiteachadh cruinn eadar-dhealaichte bho dhòighean rèiteachaidh eile agus is dòcha nach bi e freagarrach airson cuid de thagraidhean. Gu h-ìosal tha cuid de na h-eas-bhuannachdan:

  1. Suidheachadh statach. Aig amannan feumaidh tu an rèiteachadh ann an cinneasachadh a cheartachadh gu sgiobalta, a ’dol seachad air a h-uile uidheamachd dìon. Leis an dòigh-obrach seo faodaidh e a bhith nas duilghe. Aig a’ char as lugha, bidh feum fhathast air cruinneachadh agus cleachdadh fèin-ghluasadach. Tha seo an dà chuid na fheart feumail den dòigh-obrach agus na ana-cothrom ann an cuid de chùisean.
  2. Ginealach rèiteachaidh. Ma thèid am faidhle rèiteachaidh a chruthachadh le inneal fèin-ghluasadach, is dòcha gum feumar oidhirpean a bharrachd gus an sgriobt togail fhilleadh a-steach.
  3. Innealan. An-dràsta, tha goireasan agus dòighean air an dealbhadh gus obrachadh le rèiteachadh stèidhichte air faidhlichean teacsa. Cha bhi a h-uile goireas / innleachd mar sin ri fhaighinn ann an rèiteachadh cruinnichte.
  4. Tha feum air atharrachadh ann am beachdan. Tha luchd-leasachaidh agus DevOps cleachdte ri faidhlichean teacsa. Faodaidh an dearbh bheachd air rèiteachadh a chuir ri chèile a bhith rudeigin ris nach robh dùil agus neo-àbhaisteach agus adhbhar a dhiùltadh.
  5. Tha feum air pròiseas leasachaidh àrd-inbhe. Gus an rèiteachadh cruinnichte a chleachdadh gu comhfhurtail, tha feum air làn fèin-ghluasad den phròiseas togail agus cleachdadh an tagraidh (CI / CD). Mur eil, bidh e gu math mì-ghoireasach.

Leig leinn cuideachd fuireach air grunn chuingealachaidhean den eisimpleir air a bheilear a ’beachdachadh nach eil co-cheangailte ris a’ bheachd air rèiteachadh cruinn:

  1. Ma bheir sinn seachad fiosrachadh rèiteachaidh neo-riatanach nach eil air a chleachdadh leis an nód, cha chuidich an compiler sinn gus am buileachadh a tha a dhìth a lorg. Faodar an duilgheadas seo fhuasgladh le bhith a’ trèigsinn am Pàtran Cèic agus a’ cleachdadh seòrsaichean nas cruaidhe, mar eisimpleir, HList no seòrsaichean dàta ailseabra (clasaichean cùise) gus rèiteachadh a riochdachadh.
  2. Tha loidhnichean anns an fhaidhle rèiteachaidh nach eil co-cheangailte ris an rèiteachadh fhèin: (package, import, dearbhaidhean cuspair; override def's airson paramadairean aig a bheil luachan bunaiteach). Faodar seo a sheachnadh gu ìre ma chuireas tu an DSL agad an gnìomh. A bharrachd air an sin, tha seòrsachan rèiteachaidh eile (mar eisimpleir, XML) cuideachd a’ cur cuid de chuingealachaidhean air structar an fhaidhle.
  3. Airson adhbharan na dreuchd seo, chan eil sinn a’ beachdachadh air ath-dhealbhadh fiùghantach de bhuidheann de nodan coltach ris.

co-dhùnadh

Anns an dreuchd seo, rannsaich sinn am beachd a bhith a’ riochdachadh rèiteachadh ann an còd stòr a’ cleachdadh comasan adhartach siostam seòrsa Scala. Faodar an dòigh-obrach seo a chleachdadh ann an grunn thagraidhean an àite dòighean rèiteachaidh traidiseanta stèidhichte air xml no faidhlichean teacsa. Eadhon ged a tha an eisimpleir againn air a chuir an gnìomh ann an Scala, faodar na h-aon bheachdan a ghluasad gu cànanan cruinnichte eile (leithid Kotlin, C#, Swift, ...). Faodaidh tu an dòigh-obrach seo fheuchainn ann an aon de na pròiseactan a leanas, agus, mura h-eil e ag obair, gluais air adhart chun fhaidhle teacsa, a 'cur ris na pàirtean a tha a dhìth.

Gu nàdarra, feumaidh rèiteachadh cruinnichte pròiseas leasachaidh àrd-inbhe. Mar thoradh air an sin, thathas a’ dèanamh cinnteach à càileachd àrd agus earbsachd nan rèiteachaidhean.

Faodar an dòigh-obrach air a bheilear a’ beachdachadh a leudachadh:

  1. Faodaidh tu macros a chleachdadh gus sgrùdaidhean ùine cruinneachaidh a dhèanamh.
  2. Faodaidh tu DSL a chuir an gnìomh gus an rèiteachadh a thaisbeanadh ann an dòigh a tha ruigsinneach don luchd-cleachdaidh deireannach.
  3. Faodaidh tu riaghladh ghoireasan fiùghantach a chuir an gnìomh le atharrachadh rèiteachaidh fèin-ghluasadach. Mar eisimpleir, ag atharrachadh an àireamh de nodan ann am brabhsair feumaidh (1) gum faigh gach nód rèiteachadh beagan eadar-dhealaichte; (2) fhuair am manaidsear brabhsair fiosrachadh mu nodan ùra.

Buidheachas

Bu mhath leam taing a thoirt do Andrei Saksonov, Pavel Popov agus Anton Nekhaev airson an càineadh cuideachail air an dreachd artaigil.

Source: www.habr.com

Cuir beachd ann