Ukucushwa Kwesistimu Ehlanganisiwe Ehlanganisiwe

Ngingathanda ukukutshela indlela eyodwa ethokozisayo yokusebenza nokucushwa kwesistimu esabalalisiwe. Ukucushwa kumelelwe ngokuqondile ngolimi oluhlanganisiwe (i-Scala) kusetshenziswa izinhlobo eziphephile. Lokhu okuthunyelwe kunikeza isibonelo sokucushwa okunjalo futhi kudingida izici ezahlukahlukene zokwenza ukucushwa okuhlanganisiwe kube yinqubo yokuthuthukisa iyonke.

Ukucushwa Kwesistimu Ehlanganisiwe Ehlanganisiwe

(IsiZulu)

Isingeniso

Ukwakha uhlelo olusabalalisiwe oluthembekile kusho ukuthi wonke ama-node asebenzisa ukumisa okulungile, okuvunyelaniswe namanye ama-node. Ubuchwepheshe be-DevOps (i-terraform, i-ansible noma into efana naleyo) ngokuvamile busetshenziselwa ukukhiqiza ngokuzenzakalelayo amafayela okumisa (ngokuvamile aqondene nendawo ngayinye). Singathanda futhi ukwenza isiqiniseko sokuthi wonke amanodi okuxhumana asebenzisa izivumelwano ezifanayo (kuhlanganise nenguqulo efanayo). Uma kungenjalo, ukungahambisani kuzokwakhiwa kusistimu yethu esabalalisiwe. Emhlabeni we-JVM, umphumela owodwa wale mfuneko ukuthi inguqulo efanayo yelabhulali equkethe imilayezo yephrothokholi kufanele isetshenziswe yonke indawo.

Kuthiwani ngokuhlola isistimu esabalalisiwe? Yebo, sicabanga ukuthi zonke izingxenye zineyunithi yokuhlola ngaphambi kokuthi sidlulele ekuhlolweni kokuhlanganisa. (Ukuze siveze imiphumela yokuhlolwa esikhathini sokusebenza, kufanele futhi sinikeze isethi efanayo yamalabhulali esigabeni sokuhlola nangesikhathi sokusebenza.)

Lapho usebenza ngokuhlolwa kokuhlanganisa, ngokuvamile kulula ukusebenzisa indlela yeklasi efanayo yonke indawo kuwo wonke ama-node. Okufanele sikwenze ukuqinisekisa ukuthi i-classpath efanayo iyasetshenziswa ngesikhathi sokusebenza. (Nakuba kungenzeka ngokuphelele ukusebenzisa ama-node ahlukene ngezindlela zeklasi ezihlukene, lokhu kwengeza ubunkimbinkimbi ekucushweni okuphelele kanye nobunzima ngokuhlolwa kokuthunyelwa nokuhlanganiswa.) Ngezinjongo zalokhu okuthunyelwe, sithatha ngokuthi wonke ama-node azosebenzisa indlela yeklasi efanayo.

Ukucushwa kuvela nohlelo lokusebenza. Sisebenzisa izinguqulo ukuhlonza izigaba ezahlukahlukene zokuvela kohlelo. Kubonakala kunengqondo ukukhomba nezinguqulo ezihlukene zokucushwa. Futhi ubeke ukucushwa ngokwako ohlelweni lokulawula inguqulo. Uma kunokucushwa okukodwa kuphela ekukhiqizeni, singavele sisebenzise inombolo yenguqulo. Uma sisebenzisa izimo zokukhiqiza eziningi, sizodinga ezimbalwa
amagatsha okumisa kanye nelebula eyengeziwe ngaphezu kwenguqulo (isibonelo, igama legatsha). Ngale ndlela singakwazi ukubona ngokucacile ukucushwa okuqondile. Inkomba ngayinye yokucushwa ihambelana ngokukhethekile nenhlanganisela ethile yamanodi asabalalisiwe, izimbobo, izinsiza zangaphandle, nezinguqulo zelabhulali. Ngezinhloso zalokhu okuthunyelwe sizothatha ukuthi kunegatsha elilodwa kuphela futhi singakwazi ukubona ukumisa ngendlela evamile sisebenzisa izinombolo ezintathu ezihlukaniswe ichashazi (1.2.3).

Ezimweni zesimanje, amafayela okumisa awavamile ukudalwa mathupha. Kaningi zikhiqizwa ngesikhathi sokuthunyelwa futhi azisathintwa (ukuze ungaphuli lutho). Kuphakama umbuzo wemvelo: kungani sisasebenzisa ifomethi yombhalo ukugcina ukucushwa? Okunye okusebenzayo kubonakala kuyikhono lokusebenzisa ikhodi evamile ukuze ucushwe futhi uzuze ekuhloleni isikhathi sokuhlanganisa.

Kulokhu okuthunyelwe sizohlola umbono wokumela ukucushwa ngaphakathi kwe-artifact ehlanganisiwe.

Ukucushwa okuhlanganisiwe

Lesi sigaba sinikeza isibonelo sokucushwa okuhlanganisiwe okumile. Izinsizakalo ezimbili ezilula ziyasetshenziswa - isevisi ye-echo kanye neklayenti lesevisi ye-echo. Ngokusekelwe kulezi zinsizakalo ezimbili, izinketho ezimbili zesistimu zihlanganisiwe. Kokunye, zombili izinsizakalo zitholakala endaweni efanayo, kwenye inketho - kuma-node ahlukene.

Ngokuvamile isistimu esabalalisiwe iqukethe amanodi amaningana. Ungakwazi ukubona ama-node usebenzisa amanani ohlobo oluthile NodeId:

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

noma

case class NodeId(hostName: String)

noma ngisho

object Singleton
type NodeId = Singleton.type

Ama-Node enza izindima ezihlukahlukene, asebenzisa izinsizakalo futhi ukuxhumana kwe-TCP/HTTP kungasungulwa phakathi kwawo.

Ukuchaza uxhumano lwe-TCP sidinga okungenani inombolo yembobo. Singathanda futhi ukukhombisa iphrothokholi esekelwa kuleyo mbobo ukuze siqinisekise ukuthi kokubili iklayenti neseva zisebenzisa iphrothokholi efanayo. Sizochaza ukuxhumana sisebenzisa isigaba esilandelayo:

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

kuphi Port - inamba nje Int okubonisa ububanzi bamanani amukelekayo:

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

Izinhlobo ezicwengisisiwe

Bona umtapo wolwazi kuhlanjululwe ΠΈ wami umbiko. Ngamafuphi, umtapo wolwazi ikuvumela ukuthi ungeze imingcele ezinhlotsheni ezithintwayo ngesikhathi sokuhlanganiswa. Kulokhu, amanani embobo evumelekile ayizinombolo ezingu-16-bit. Ekucushweni okuhlanganisiwe, ukusebenzisa umtapo wolwazi ocolisisiwe akuphoqelekile, kodwa kuthuthukisa ikhono lomhlanganisi lokuhlola ukucushwa.

Kumaphrothokholi e-HTTP (REST), ngaphezu kwenombolo yembobo, singase futhi sidinge indlela eya kusevisi:

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

Izinhlobo ze-Phantom

Ukuze sihlonze iphrothokholi ngesikhathi sokuhlanganisa, sisebenzisa uhlobo lwepharamitha engasetshenziswa ngaphakathi kwekilasi. Lesi sinqumo singenxa yokuthi asisebenzisi isibonelo sephrothokholi ngesikhathi sokusebenza, kodwa singathanda ukuthi umdidiyeli ahlole ukuhambisana kwephrothokholi. Ngokucacisa iphrothokholi, ngeke sikwazi ukudlulisa isevisi engafanele njengokuncika.

Enye yezimiso ezivamile yi-REST API ene-Json serialization:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

kuphi RequestMessage - uhlobo lwesicelo, ResponseMessage - uhlobo lokuphendula.
Impela, singasebenzisa ezinye izincazelo zephrothokholi ezinikeza ukunemba kwencazelo esiyidingayo.

Ngezinjongo zalokhu okuthunyelwe, sizosebenzisa inguqulo eyenziwe lula yephrothokholi:

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

Lapha isicelo siyiyunithi yezinhlamvu enamathiselwe ku-url futhi impendulo iyiyunithi yezinhlamvu ebuyisiwe emzimbeni wempendulo ye-HTTP.

Ukucushwa kwesevisi kuchazwa ngegama lesevisi, izimbobo, nezincika. Lezi zakhi zingamelwa ku-Scala ngezindlela ezimbalwa (isibonelo, HList-s, izinhlobo zedatha ye-algebraic). Ngezinjongo zalokhu okuthunyelwe, sizosebenzisa Iphethini Yekhekhe futhi simele amamojula sisebenzisa trait'ov. (Iphethini Yekhekhe ayiyona ingxenye edingekayo yale ndlela yokwenza. Iwukusebenza okukodwa okungenzeka.)

Ukuncika phakathi kwamasevisi kungamelwa njengezindlela ezibuyisela izimbobo EndPointkwamanye ama-node:

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

Ukuze udale isevisi ye-echo, okudingayo nje inombolo yembobo kanye nenkomba yokuthi ichweba lisekela umthetho olandelwayo we-echo. Singase singacacisi imbobo ethile, ngoba... izici zikuvumela ukuthi umemezele izindlela ngaphandle kokuqaliswa (izindlela ezingabonakali). Kulesi simo, lapho udala ukucushwa okukhonkolo, umhlanganisi uzodinga ukuthi sinikeze ukusetshenziswa kwendlela engabonakali futhi sinikeze inombolo yembobo. Njengoba sisebenzise indlela, lapho sidala ukucushwa okuthile, singase singacacisi imbobo ehlukile. Inani elizenzakalelayo lizosetshenziswa.

Ekucushweni kweklayenti simemezela ukuncika kusevisi ye-echo:

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

Ukuncika kuwuhlobo olufanayo nesevisi ethunyelwa ngaphandle echoService. Ikakhulukazi, kuklayenti le-echo sidinga iphrothokholi efanayo. Ngakho-ke, lapho uxhuma izinsizakalo ezimbili, singaqiniseka ukuthi konke kuzosebenza kahle.

Ukuqaliswa kwezinsizakalo

Kudingeka umsebenzi ukuqalisa nokumisa isevisi. (Ikhono lokumisa isevisi libalulekile ekuhlolweni.) Futhi, kukhona izinketho ezimbalwa zokuqalisa isici esinjalo (isibonelo, singasebenzisa amakilasi ohlobo olusekelwe ohlotsheni lokucushwa). Ngenhloso yalokhu okuthunyelwe sizosebenzisa Iphethini Yekhekhe. Sizomela isevisi sisebenzisa ikilasi cats.Resource, ngoba Leli klasi selivele lihlinzeka ngezindlela zokuqinisekisa ngokuphephile ukukhishwa kwezisetshenziswa uma kuba nezinkinga. Ukuze sithole insiza, sidinga ukuhlinzeka ngokucushwa kanye nomongo wesikhathi sokusebenza osenziwe ngomumo. Umsebenzi wokuqalisa isevisi ungabukeka kanje:

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

kuphi

  • Config β€” uhlobo lokucushwa kwale sevisi
  • AddressResolver - into yesikhathi sokusebenza ekuvumela ukuthi uthole amakheli amanye ama-node (bona ngezansi)

nezinye izinhlobo ezivela kulabhulali cats:

  • F[_] - uhlobo lomphumela (esimweni esilula F[A] kungaba umsebenzi nje () => A. Kulesi sihloko sizosebenzisa cats.IO.)
  • Reader[A,B] - okuningi noma okuncane kufana nomsebenzi A => B
  • cats.Resource - insiza engatholakala futhi ikhululwe
  • Timer - timer (ikuvumela ukuthi ulale isikhashana futhi ulinganise izikhawu zesikhathi)
  • ContextShift - i-analogue ExecutionContext
  • Applicative - ikilasi lohlobo lomphumela elikuvumela ukuthi uhlanganise imiphumela ngayinye (cishe i-monad). Kuzinhlelo zokusebenza eziyinkimbinkimbi kubonakala kungcono ukuzisebenzisa Monad/ConcurrentEffect.

Ngokusebenzisa lesi siginesha somsebenzi singasebenzisa amasevisi ambalwa. Isibonelo, isevisi engenzi lutho:

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

(Cm. ikhodi yomthombo, lapho ezinye izinkonzo zenziwa khona - isevisi ye-echo, iklayenti le-echo
ΠΈ izilawuli zokuphila konke.)

I-node yinto engavula izinsiza ezimbalwa (ukwethulwa kochungechunge lwezinsiza kuqinisekiswa Iphethini Yekhekhe):

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

Sicela uqaphele ukuthi sicacisa uhlobo oluqondile lokucushwa oludingekayo kule nodi. Uma sikhohlwa ukucacisa eyodwa yezinhlobo zokucushwa ezidingwa isevisi ethile, kuzoba nephutha lokuhlanganisa. Futhi, ngeke sikwazi ukuqalisa indawo ngaphandle kokuthi sinikeze into ethile yohlobo olufanele ngayo yonke idatha edingekayo.

Isixazululo Segama Lomsingathi

Ukuze sixhume kumsingathi werimothi, sidinga ikheli le-IP langempela. Kungenzeka ukuthi ikheli lizokwaziwa kamuva kunakho konke ukucushwa. Ngakho-ke sidinga umsebenzi obonisa i-ID ye-node ekhelini:

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

Kunezindlela eziningana zokwenza lo msebenzi:

  1. Uma amakheli aziwa yithi ngaphambi kokuthunyelwa, singakwazi ukukhiqiza ikhodi ye-Scala ngayo
    amakheli bese uqalisa ukwakha. Lokhu kuzohlanganisa futhi kuqalise izivivinyo.
    Kulokhu, umsebenzi uzokwaziwa ngokwezibalo futhi ungamelwa ngekhodi njengemephu Map[NodeId, NodeAddress].
  2. Kwezinye izimo, ikheli langempela laziwa kuphela ngemva kokuba i-node iqalile.
    Kulesi simo, singasebenzisa "isevisi yokutholwa" esebenza ngaphambi kwamanye ama-node futhi wonke ama-node azobhalisa le sevisi futhi acele amakheli amanye ama-node.
  3. Uma singashintsha /etc/hosts, bese ungasebenzisa amagama omethuleli achazwe ngaphambilini (njenge my-project-main-node ΠΈ echo-backend) bese umane uxhumanise lawa magama
    namakheli e-IP ngesikhathi sokuthunyelwa.

Kulokhu okuthunyelwe ngeke sicabangele lezi zimo ngokuningiliziwe. Okwethu
esibonelweni sethoyizi, wonke ama-node azoba nekheli le-IP elifanayo - 127.0.0.1.

Okulandelayo, sibheka izinketho ezimbili zesistimu esabalalisiwe:

  1. Ukubeka zonke izinsiza endaweni eyodwa.
  2. Futhi ibamba insiza ye-echo kanye neklayenti le-echo kumanodi ahlukene.

Ukucushwa kwe indawo eyodwa:

Ukucushwa kwenodi eyodwa

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

Into isebenzisa ukucushwa kwakho kokubili iklayenti neseva. Ukucushwa kwesikhathi sokuphila kuyasetshenziswa futhi ukuze emva kwesikhawu lifetime vala uhlelo. (I-Ctrl-C iphinde isebenze futhi ikhulule zonke izinsiza ngendlela efanele.)

Isethi efanayo yokucushwa kanye nezici zokuqalisa ingasetshenziswa ukudala isistimu ehlanganisa ama-node amabili ahlukene:

Ukucushwa kwama-node amabili

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

Okubalulekile! Qaphela ukuthi izinsiza zixhunywe kanjani. Sicacisa isevisi esetshenziswa inodi eyodwa njengokusetshenziswa kwendlela yokuncika kwenye indawo. Uhlobo lokuncika lubhekwa ngumqambi, ngoba iqukethe uhlobo lwephrothokholi. Uma isetshenziswa, ukuncika kuzoqukatha i-ID yenodi eqondiwe efanele. Ngenxa yalolu hlelo, sicacisa inombolo yembobo kanye ncamashi futhi siqinisekiswa njalo ukuthi sibhekisela embobeni elungile.

Ukusetshenziswa kwamanodi esistimu amabili

Kulokhu kucushwa, sisebenzisa ukusetshenziswa kwesevisi efanayo ngaphandle kwezinguquko. Umehluko kuphela ukuthi manje sinezinto ezimbili ezisebenzisa amasethi ahlukene wezinsizakalo:

  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
  }

I-node yokuqala isebenzisa iseva futhi idinga ukucushwa kweseva kuphela. I-node yesibili isebenzisa iklayenti futhi isebenzisa ingxenye ehlukile yokucushwa. Futhi womabili ama-node adinga ukuphathwa impilo yonke. I-node yeseva isebenza ngokungenamkhawulo ize imiswe SIGTERM'om, futhi inodi yeklayenti iyanqamuka ngemva kwesikhathi esithile. Cm. uhlelo lokusebenza lwesiqalisi.

Inqubo yokuthuthukiswa okujwayelekile

Ake sibone ukuthi le ndlela yokumisa iyithinta kanjani yonke inqubo yokuthuthukisa.

Ukulungiselelwa kuzohlanganiswa kanye nayo yonke enye ikhodi futhi kuzokwenziwa i-artifact (.jar). Kubonakala kunengqondo ukubeka ukucushwa ku-artifact ehlukile. Lokhu kungenxa yokuthi singaba nokulungiselelwa okuningi okusekelwe kukhodi efanayo. Futhi, kungenzeka ukukhiqiza ama-artifacts ahambisana namagatsha okucushwa ahlukene. Ukuncika kuzinguqulo ezithile zamalabhulali kugcinwa kanye nokucushwa, futhi lezi zinguqulo zilondolozwa unomphela noma nini lapho sinquma ukusebenzisa leyo nguqulo yokucushwa.

Noma iluphi ushintsho lokucushwa lushintsha lube ukushintsha kwekhodi. Futhi ngakho-ke, ngamunye
ushintsho luzohlanganiswa yinqubo evamile yokuqinisekisa ikhwalithi:

Ithikithi ku-tracker yesiphazamisi -> PR -> buyekeza -> hlanganisa namagatsha afanele ->
ukuhlanganiswa -> ukuthunyelwa

Imiphumela eyinhloko yokusebenzisa ukucushwa okuhlanganisiwe yilezi:

  1. Ukucushwa kuzohambisana kuwo wonke ama-node wesistimu esabalalisiwe. Ngenxa yokuthi wonke ama-node athola ukucushwa okufanayo emthonjeni owodwa.

  2. Kuyinkinga ukushintsha ukumisa endaweni eyodwa kuphela. Ngakho-ke, "ukukhukhuleka kokucushwa" akunakwenzeka.

  3. Kuba nzima kakhulu ukwenza izinguquko ezincane ekucushweni.

  4. Izinguquko eziningi zokucushwa zizokwenzeka njengengxenye yenqubo yokuthuthukisa iyonke futhi zizobuyekezwa.

Ingabe ngidinga indawo yokugcina ehlukile ukuze ngigcine ukucushwa kokukhiqiza? Lokhu kulungiselelwa kungase kuqukathe amagama ayimfihlo nolunye ulwazi olubucayi esingathanda ukukhawulela ukufinyelela kulo. Ngokusekelwe kulokhu, kubonakala kunengqondo ukugcina ukucushwa kokugcina endaweni yokugcina ehlukile. Ungakwazi ukuhlukanisa ukulungiselelwa kube izingxenye ezimbiliβ€”eyodwa equkethe izilungiselelo ezifinyeleleka esidlangalaleni neyodwa equkethe izilungiselelo ezikhawulelwe. Lokhu kuzovumela onjiniyela abaningi ukuthi babe nokufinyelela kuzilungiselelo ezivamile. Lokhu kuhlukaniswa kulula ukukufeza kusetshenziswa izici eziphakathi nendawo eziqukethe amanani azenzakalelayo.

Izinguquko ezingenzeka

Ake sizame ukuqhathanisa ukucushwa okuhlanganisiwe nezinye izindlela ezivamile:

  1. Ifayela lombhalo emshinini oqondiwe.
  2. Isitolo senani elingukhiye esimaphakathi (etcd/zookeeper).
  3. Izingxenye zokucubungula ezingahlelwa kabusha/ziqalwe kabusha ngaphandle kokuqalisa kabusha inqubo.
  4. Ukugcina ukulungiselelwa ngaphandle kwe-artifact nokulawula inguqulo.

Amafayela ombhalo anikeza ukuguquguquka okuphawulekayo mayelana nezinguquko ezincane. Umlawuli wesistimu angangena ku-node eyihlane, enze izinguquko kumafayela afanele futhi aqale kabusha isevisi. Nokho, kumasistimu amakhulu, ukuguquguquka okunjalo kungase kungafiseleki. Izinguquko ezenziwe azishiyi lutho kwezinye izinhlelo. Akekho obuyekeza izinguquko. Kunzima ukunquma ukuthi ubani ngempela owenze izinguquko futhi ngasiphi isizathu. Izinguquko azihloliwe. Uma uhlelo lusatshalaliswa, khona-ke umlawuli angase akhohlwe ukwenza ushintsho oluhambisanayo kwamanye ama-node.

(Kufanele futhi kuqashelwe ukuthi ukusebenzisa ukucushwa okuhlanganisiwe akuvali amathuba okusebenzisa amafayela ombhalo esikhathini esizayo. Kuyokwanela ukwengeza umhlahleli nesiqinisekisi esikhiqiza uhlobo olufanayo nokuphumayo. Config, futhi ungasebenzisa amafayela ombhalo. Ngokushesha kulandela ukuthi inkimbinkimbi yesistimu enokumiswa okuhlanganisiwe incane kancane kunobunzima besistimu esebenzisa amafayela ombhalo, ngoba amafayela ombhalo adinga ikhodi eyengeziwe.)

Isitolo senani elingukhiye esimaphakathi siyindlela enhle yokusabalalisa imingcele ye-meta yohlelo lokusebenza olusabalalisiwe. Sidinga ukunquma ukuthi iyini imingcele yokumisa nokuthi iyini idatha nje. Ake sibe nomcimbi C => A => B, kanye nemingcele C akuvamile ukushintsha, kanye nedatha A - ngokuvamile. Kulokhu singasho lokho C - ukucushwa kwemingcele, kanye A - idatha. Kubonakala sengathi amapharamitha wokucupha ayahluka kudatha ngoba ngokuvamile ashintsha kancane kunedatha. Futhi, idatha ngokuvamile ivela emthonjeni owodwa (kumsebenzisi), kanye nemingcele yokumisa isuka komunye (kusuka kumphathi wesistimu).

Uma amapharamitha angashintshile adinga ukubuyekezwa ngaphandle kokuqalisa kabusha uhlelo, khona-ke lokhu kungaholela enkingeni yohlelo, ngoba sizodinga ngandlela thize ukuletha amapharamitha, sigcine, sihlaziye futhi sihlole, futhi sicubungule amanani angalungile. Ngakho-ke, ngokombono wokunciphisa inkimbinkimbi yohlelo, kunengqondo ukunciphisa inani lemingcele engashintsha ngesikhathi sokusebenza kohlelo (noma ukungasekeli imingcele enjalo nhlobo).

Ngezinjongo zalokhu okuthunyelwe, sizohlukanisa phakathi kwamapharamitha amile kanye naguqukayo. Uma i-logic yesevisi idinga ukushintsha amapharamitha ngesikhathi sokusebenza kohlelo, khona-ke sizobiza amapharamitha anjalo ashukumisayo. Uma kungenjalo izinketho zimile futhi zingalungiselelwa kusetshenziswa ukucushwa okuhlanganisiwe. Ngokulungisa kabusha okuguquguqukayo, singase sidinge indlela yokuqalisa kabusha izingxenye zohlelo ngamapharamitha amasha, afana nendlela izinqubo zesistimu yokusebenza eziqalwa ngayo kabusha. (Ngokombono wethu, kuhle ukugwema ukumiswa kabusha kwesikhathi sangempela, njengoba lokhu kwandisa inkimbinkimbi yesistimu. Uma kungenzeka, kungcono ukusebenzisa amakhono ajwayelekile we-OS ukuze uqalise kabusha izinqubo.)

Isici esisodwa esibalulekile sokusebenzisa ukucushwa okumile okwenza abantu bacabangele ukucushwa kabusha okuguquguqukayo isikhathi esisithathayo ukuze isistimu iqalise kabusha ngemva kwesibuyekezo sokucushwa (isikhathi sokuphumula). Eqinisweni, uma sidinga ukwenza izinguquko ekucushweni okumile, kuzodingeka siqale kabusha isistimu ukuze amanani amasha aqale ukusebenza. Inkinga yesikhathi sokuphumula iyahlukahluka ngobukhulu bezinhlelo ezahlukene. Kwezinye izimo, ungakwazi ukuhlela ukuqalisa kabusha ngesikhathi lapho umthwalo umncane. Uma udinga ukuhlinzeka ngesevisi eqhubekayo, ungaqalisa Ukukhipha uxhumano lwe-AWS ELB. Ngesikhathi esifanayo, uma sidinga ukuqalisa kabusha isistimu, siqalisa isibonelo esifanayo sale sistimu, sishintshele kuso isilinganisi, bese silinda ukuxhuma okudala ukuthi kuqedwe. Ngemuva kokuthi konke ukuxhumana okudala kunqanyuliwe, sivala isibonelo esidala sesistimu.

Manje ake sicabangele indaba yokugcina ukucushwa ngaphakathi noma ngaphandle kwe-artifact. Uma sigcina ukucushwa ngaphakathi kwe-artifact, okungenani sibe nethuba lokuqinisekisa ukulunga kokucushwa ngesikhathi sokuhlanganiswa kwe-artifact. Uma ukulungiselelwa kungaphandle kwe-artifact elawulwayo, kunzima ukulandelela ukuthi ubani owenze izinguquko kuleli fayela nokuthi kungani. Ibaluleke kangakanani? Ngokombono wethu, ezinhlelweni eziningi zokukhiqiza kubalulekile ukuba nokucushwa okuzinzile nokusezingeni eliphezulu.

Inguqulo ye-artifact ikuvumela ukuthi unqume ukuthi yadalwa nini, yimaphi amanani ayiqukethe, imiphi imisebenzi enikwe amandla/ikhutshaziwe, nokuthi ubani onesibopho sanoma yiluphi ushintsho ekucushweni. Yebo, ukugcina ukucushwa ngaphakathi kwe-artifact kudinga umzamo othile, ngakho udinga ukwenza isinqumo unolwazi.

Ubuhle nobubi

Ngingathanda ukuhlala ngobuhle nobubi bobuchwepheshe obuhlongozwayo.

Izinzuzo

Ngezansi uhlu lwezici eziyinhloko zokucushwa kwesistimu esabalalisiwe ehlanganisiwe:

  1. Ukuhlola ukucushwa okumile. Ikuvumela ukuthi uqiniseke ukuthi
    ukumisa kulungile.
  2. Ulimi lokucupha olucebile. Ngokuvamile, ezinye izindlela zokumisa zikhawulelwe ekushintsheni okuguquguqukayo kweyunithi yezinhlamvu kakhulu. Uma usebenzisa i-Scala, izici eziningi zolimi ziyatholakala ukuthuthukisa ukucushwa kwakho. Ngokwesibonelo singasebenzisa
    izici zamanani azenzakalelayo, sisebenzisa izinto ukuze sihlanganise amapharamitha, singabhekisela kumaval amenyezwe kanye kuphela (DRY) kusikophu esivalekile. Ungakwazi ukufakazela noma yimaphi amakilasi ngqo ngaphakathi kokucushwa (Seq, Map, amakilasi ngokwezifiso).
  3. I-DSL. I-Scala inezici eziningi zolimi ezenza kube lula ukwakha i-DSL. Kungenzeka ukusebenzisa lezi zici futhi usebenzise ulimi lokumisa olulungele iqembu eliqondiwe labasebenzisi, ukuze ukulungiselelwa okungenani kufundeke ochwepheshe besizinda. Ochwepheshe, ngokwesibonelo, bangabamba iqhaza kunqubo yokubuyekeza ukucushwa.
  4. Ubuqotho nokuvumelanisa phakathi kwamanodi. Enye yezinzuzo zokuba nokucushwa kwayo yonke isistimu esabalalisiwe egcinwe endaweni eyodwa ukuthi wonke amanani amenyezelwa kanye kanye abese esetshenziswa kabusha nomaphi lapho edingeka khona. Ukusebenzisa izinhlobo ze-phantom ukumemezela izimbobo kuqinisekisa ukuthi ama-node asebenzisa amaphrothokholi ahambisanayo kukho konke ukulungiselelwa okulungile kwesistimu. Ukuba nokuncika okuyisibopho okucacile phakathi kwama-node kuqinisekisa ukuthi zonke izinsiza zixhunyiwe.
  5. Izinguquko zekhwalithi ephezulu. Ukwenza izinguquko ekucushweni usebenzisa inqubo evamile yokuthuthukisa kwenza kube nokwenzeka ukufeza izindinganiso zekhwalithi eziphezulu zokucushwa futhi.
  6. Isibuyekezo sokumisa ngesikhathi esisodwa. Ukuthunyelwa kwesistimu okuzenzakalelayo ngemva kwezinguquko zokumisa kuqinisekisa ukuthi wonke ama-node ayabuyekezwa.
  7. Ukwenza lula isicelo. Uhlelo lokusebenza aludingi ukuhlukaniswa, ukuhlolwa kokumisa, noma ukuphatha amanani angalungile. Lokhu kunciphisa inkimbinkimbi yohlelo lokusebenza. (Obunye ubunkimbinkimbi bokucushwa obubonwa esibonelweni sethu akusona isibaluli sokucushwa okuhlanganisiwe, kodwa isinqumo esiphusile kuphela esiqhutshwa isifiso sokuhlinzeka ngohlobo olukhulu lokuphepha.) Kulula kakhulu ukubuyela ekucushweni okuvamile - vele usebenzise okungekho. izingxenye. Ngakho-ke, ungakwazi, isibonelo, ukuqala ngokucushwa okuhlanganisiwe, ukuhlehlisa ukuqaliswa kwezingxenye ezingadingekile kuze kufike isikhathi lapho kudingekile ngempela.
  8. Ukucushwa okuqinisekisiwe. Njengoba izinguquko zokumisa zilandela isiphetho esivamile sanoma yiziphi ezinye izinguquko, okukhiphayo esikutholayo kuyi-artifact enenguqulo ehlukile. Lokhu kusivumela, isibonelo, ukuthi sibuyele enguqulweni yangaphambilini yokucushwa uma kudingeka. Singasebenzisa nokucushwa kusukela onyakeni odlule futhi uhlelo luzosebenza ngendlela efanayo. Ukucushwa okuzinzile kuthuthukisa ukubikezelwa nokuthembeka kwesistimu esabalalisiwe. Njengoba ukucushwa kugxilile esigabeni sokuhlanganiswa, kunzima kakhulu ukukukhohlisa ekukhiqizeni.
  9. I-Modularity. Uhlaka oluhlongozwayo luyi-modular futhi amamojula angahlanganiswa ngezindlela ezihlukene ukuze akhe amasistimu ahlukene. Ikakhulukazi, ungamisa uhlelo ukuthi lusebenze endaweni eyodwa ku-embodiment eyodwa, nasemakhaleni amaningi kwenye. Ungadala izilungiselelo ezimbalwa zezenzakalo zokukhiqiza zesistimu.
  10. Ukuhlola. Ngokushintshanisa izinsiza ngazinye ngezinto eziyimbumbulu, ungathola izinguqulo ezimbalwa zesistimu ezilungele ukuhlolwa.
  11. Ukuhlolwa kokuhlanganisa. Ukuba nokulungiselelwa okukodwa kwayo yonke isistimu esabalalisiwe kwenza kube nokwenzeka ukusebenzisa zonke izingxenye endaweni elawulwayo njengengxenye yokuhlolwa kokuhlanganiswa. Kulula ukulingisa, isibonelo, isimo lapho amanye ama-node efinyeleleka khona.

Ukungalungi nokulinganiselwa

Ukucushwa okuhlanganisiwe kuyahluka kwezinye izindlela zokumisa futhi kungase kungazifaneli ezinye izinhlelo zokusebenza. Ngezansi kukhona okunye okungalungile:

  1. Ukucushwa okumile. Kwesinye isikhathi udinga ukulungisa ngokushesha ukucushwa ekukhiqizeni, udlule zonke izindlela zokuvikela. Ngale ndlela kungaba nzima kakhulu. Okungenani, ukuhlanganiswa nokuthunyelwa okuzenzakalelayo kusazodingeka. Lokhu kokubili kuyisici esiwusizo sendlela yokwenza kanye nokubi kwezinye izimo.
  2. Ukwakhiwa kokucushwa. Uma kwenzeka ifayela lokumisa likhiqizwa ithuluzi elizenzakalelayo, kungase kudingeke imizamo eyengeziwe ukuze kuhlanganiswe umbhalo wokwakha.
  3. Amathuluzi. Njengamanje, izinsiza namasu akhelwe ukusebenza ngokucushwa asekelwe kumafayela ombhalo. Akuzona zonke izinsiza/amasu anjalo azotholakala ekucushweni okuhlanganisiwe.
  4. Kudingeka ushintsho esimweni sengqondo. Onjiniyela kanye ne-DevOps bajwayele amafayela ombhalo. Wona kanye umqondo wokuhlanganisa ukumisa ungase ube ongalindelekile ngandlela-thile futhi ungajwayelekile futhi ubangele ukwenqatshwa.
  5. Kudingeka inqubo yokuthuthukiswa kwekhwalithi ephezulu. Ukuze usebenzise ngokunethezeka ukucushwa okuhlanganisiwe, ukuzenzekelayo okugcwele kwenqubo yokwakha nokuthumela isicelo (CI/CD) kuyadingeka. Uma kungenjalo kuzoba nzima kakhulu.

Ake futhi sigxile emikhawulweni eminingi yesibonelo esicatshangelwe esingahlobene nomqondo wokucushwa okuhlanganisiwe:

  1. Uma sihlinzeka ngolwazi olungadingekile lokumisa olungasetshenziswa yi-node, khona-ke umhlanganisi ngeke asisize sithole ukuqaliswa okungekho. Le nkinga ingaxazululwa ngokushiya iphethini yekhekhe nokusebenzisa izinhlobo eziqinile, ngokwesibonelo, HList noma izinhlobo zedatha ye-algebraic (izigaba eziyizikesi) ukumela ukucushwa.
  2. Kunemigqa efayeleni yokumisa engahlobene nokucushwa ngokwako: (package, import,izimemezelo zento; override def's yamapharamitha anamanani azenzakalelayo). Lokhu kungagwenywa uma usebenzisa eyakho i-DSL. Ngaphezu kwalokho, ezinye izinhlobo zokucushwa (isibonelo, i-XML) nazo zibeka imingcele ethile esakhiweni sefayela.
  3. Ngezinjongo zalokhu okuthunyelwe, asicabangi ukumisa kabusha okuguquguqukayo kweqoqo lamanodi afanayo.

isiphetho

Kulokhu okuthunyelwe, sihlole umbono wokumela ukucushwa kukhodi yomthombo sisebenzisa amakhono athuthukile ohlelo lohlobo lwe-Scala. Le ndlela ingasetshenziswa ezinhlelweni ezihlukene njengokuthatha indawo yezindlela zokumisa ezijwayelekile ezisuselwe ku-xml noma kumafayela ombhalo. Noma isibonelo sethu senziwa ku-Scala, imibono efanayo ingadluliselwa kwezinye izilimi ezihlanganisiwe (ezifana ne-Kotlin, C #, Swift, ...). Ungazama le ndlela kwenye yamaphrojekthi alandelayo, futhi, uma ingasebenzi, dlulela kufayela lombhalo, wengeze izingxenye ezingekho.

Ngokwemvelo, ukucushwa okuhlanganisiwe kudinga inqubo yokuthuthukiswa kwekhwalithi ephezulu. Ngokubuyisela, ikhwalithi ephezulu nokuthembeka kokucushwa kuqinisekiswa.

Indlela ecatshangelwayo inganwetshwa:

  1. Ungasebenzisa amamakhro ukwenza ukuhlola kwesikhathi sokuhlanganisa.
  2. Ungakwazi ukusebenzisa i-DSL ukuze wethule ukucushwa ngendlela efinyeleleka kubasebenzisi bokugcina.
  3. Ungakwazi ukusebenzisa ukuphathwa kwensiza enamandla ngokulungisa okuzenzakalelayo kokucushwa. Isibonelo, ukushintsha inani lamanodi kuqoqo kudinga ukuthi (1) indawo ngayinye ithole ukucushwa okuhluke kancane; (2) umphathi weqoqo uthole ulwazi mayelana namanodi amasha.

Ukubonga

Ngithanda ukubonga u-Andrei Saksonov, uPavel Popov no-Anton Nekhaev ngokugxeka okwakhayo kwesihloko esisalungiswa.

Source: www.habr.com

Engeza amazwana