Ukucushwa okuhlanganisiwe kwesistimu esabalalisiwe

Kulokhu okuthunyelwe sithanda ukwabelana ngendlela ethokozisayo yokubhekana nokucushwa kwesistimu esabalalisiwe.
Ukucushwa kumelelwe ngokuqondile ngolimi lwe-Scala ngohlobo oluphephile. Ukuqaliswa kwesibonelo kuchazwe ngemininingwane. Kuxoxiswana ngezinto ezehlukene zesiphakamiso, okuhlanganisa nomthelela kuyo yonke inqubo yentuthuko.

Ukucushwa okuhlanganisiwe kwesistimu esabalalisiwe

(ngesiRashiya)

Isingeniso

Ukwakha amasistimu asabalalisiwe aqinile kudinga ukusetshenziswa kokucushwa okulungile nokuhambisanayo kuwo wonke ama-node. Isixazululo esijwayelekile ukusebenzisa incazelo yombhalo (i-terraform, i-ansible noma into efanayo) kanye namafayela okumisa akhiqizwa ngokuzenzakalela (ngokuvamile - anikezelwe inodi/indima ngayinye). Sizophinde futhi sifune ukusebenzisa izimiso ezifanayo zezinguqulo ezifanayo endaweni ngayinye yokuxhumana (ngaphandle kwalokho sizoba nezinkinga zokungahambelani). Emhlabeni we-JVM lokhu kusho ukuthi okungenani umtapo wolwazi kufanele ube wenguqulo efanayo kuwo wonke ama-node okuxhumana.

Kuthiwani ngokuhlola uhlelo? Yebo, kufanele sibe nokuhlolwa kweyunithi kuzo zonke izingxenye ngaphambi kokuza ekuhlolweni kokuhlanganisa. Ukuze sikwazi ukwelula imiphumela yokuhlolwa ngesikhathi sokusebenza, kufanele siqinisekise ukuthi izinguqulo zawo wonke amalabhulali zigcinwa zifana kukho kokubili isikhathi sokusebenza nezimo zokuhlola.

Uma usebenzisa izivivinyo zokuhlanganisa, ngokuvamile kulula kakhulu ukuba nendlela yeklasi efanayo kuwo wonke ama-node. Sidinga nje ukwenza isiqiniseko sokuthi i-classpath efanayo iyasetshenziswa ekusetshenzisweni. (Kuyenzeka ukusebenzisa izindlela zekilasi ezihlukene kumanodi ahlukene, kodwa kunzima kakhulu ukumela lokhu kumisa nokukusebenzisa ngendlela efanele.) Ngakho-ke ukuze sigcine izinto zilula sizocubungula izindlela zekilasi ezifanayo kuwo wonke ama-node.

Ukucushwa kuvame ukuvela kanye nesofthiwe. Ngokuvamile sisebenzisa izinguqulo ukuhlonza okuhlukahlukene
izigaba zokuvela kwesoftware. Kubonakala kunengqondo ukumboza ukucushwa ngaphansi kokuphathwa kwenguqulo nokuhlonza ukulungiselelwa okuhlukile ngamanye amalebula. Uma kunokucushwa okukodwa kuphela ekukhiqizeni, singasebenzisa inguqulo eyodwa njengesihlonzi. Kwesinye isikhathi singase sibe nezindawo eziningi zokukhiqiza. Futhi endaweni ngayinye singadinga igatsha elihlukile lokucushwa. Ngakho-ke ukulungiselelwa kungase kufakwe ilebula yegatsha nenguqulo ukuze kukhonjwe ngokukhethekileyo ukulungiselelwa okuhlukile. Ilebula legatsha ngalinye kanye nenguqulo ihambisana nenhlanganisela eyodwa yamanodi asabalalisiwe, izimbobo, izinsiza zangaphandle, izinguqulo zelabhulali ye-classpath kunodi ngayinye. Lapha sizovala igatsha elilodwa kuphela futhi sikhombe ukumiswa ngenguqulo yedesimali yezingxenye ezintathu (1.2.3), ngendlela efanayo nezinye izinto zobuciko.

Ezimweni zesimanje amafayela okucupha awasalungiswa mathupha. Ngokuvamile sikhiqiza
config amafayela ngesikhathi sokuthunyelwa kanye ungalokothi ubathinte ngemva kwalokho. Ngakho-ke umuntu angabuza ukuthi kungani sisasebenzisa ifomethi yombhalo kumafayela okumisa? Inketho esebenzayo ukubeka ukucushwa ngaphakathi kweyunithi yokuhlanganisa futhi uzuze ekuqinisekiseni ukulungiselelwa kokuhlanganisa isikhathi.

Kulokhu okuthunyelwe sizohlola umbono wokugcina ukucushwa ku-artifact ehlanganisiwe.

Ukucushwa okuhambisanayo

Kulesi sigaba sizoxoxa ngesibonelo sokumisa okumile. Izinsizakalo ezimbili ezilula - isevisi ye-echo kanye neklayenti lensizakalo ye-echo kuyahlelwa futhi kuyasetshenziswa. Bese kuthi amasistimu amabili ahlukene asabalalisiwe anazo zombili izinkonzo aqiniswe. Eyodwa ingeyokucushwa kwenodi eyodwa kanti enye eyokucushwa kwamanodi amabili.

Isistimu esabalalisiwe evamile iqukethe amanodi ambalwa. Ama-node angabonwa kusetshenziswa uhlobo oluthile:

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

noma nje

case class NodeId(hostName: String)

noma ngisho

object Singleton
type NodeId = Singleton.type

Lawa ma-node enza izindima ezihlukene, asebenzisa amanye amasevisi futhi kufanele akwazi ukuxhumana namanye ama-node ngokusebenzisa ukuxhumana kwe-TCP/HTTP.

Ukuze uthole uxhumano lwe-TCP okungenani inombolo yembobo iyadingeka. Sifuna futhi ukwenza isiqiniseko sokuthi iklayenti neseva zikhuluma ngendlela efanayo yomthetho. Ukuze wenze imodeli yokuxhumana phakathi kwama-node ake simemezele isigaba esilandelayo:

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

lapho Port kuyinto nje Int phakathi kwebanga elivunyelwe:

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

Izinhlobo ezicwengisisiwe

Bona kuhlanjululwe umtapo wolwazi. Ngamafuphi, kuvumela ukwengeza ukuhlanganisa izithiyo zesikhathi kwezinye izinhlobo. Esimweni esinjalo Int ivunyelwe kuphela ukuba namanani angu-16-bit angamela inombolo yembobo. Asikho isidingo sokusebenzisa le labhulali kule ndlela yokumisa. Ibonakala ingena kahle kakhulu.

Nge-HTTP (REST) ​​​​singadinga nendlela yesevisi:

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

Uhlobo lwe-Phantom

Ukuze sihlonze iphrothokholi ngesikhathi sokuhlanganiswa sisebenzisa isici se-Scala sokumemezela uhlobo lwe-agumenti Protocol engasetshenziswa ekilasini. Kubizwa kanjalo uhlobo lwe-phantom. Ngesikhathi sokusebenza asivamisile ukudinga isibonelo sesihlonzi sephrothokholi, yingakho singasigcini. Ngesikhathi sokuhlanganiswa lolu hlobo lwe-phantom lunikeza ukuphepha kohlobo olwengeziwe. Asikwazi ukudlula imbobo ngephrothokholi engalungile.

Enye yezinqubo ezisetshenziswa kakhulu yi-REST API ene-Json serialization:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

lapho RequestMessage uhlobo oluyisisekelo lwemilayezo iklayenti elingathumela kuseva futhi ResponseMessage umyalezo wempendulo ovela kuseva. Impela, singase sidale ezinye izincazelo zephrothokholi ezicacisa iphrothokholi yokuxhumana ngokunemba esikufunayo.

Ngezinjongo zalokhu okuthunyelwe sizosebenzisa inguqulo elula yephrothokholi:

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

Kulo mlayezo wesicelo sephrothokholi yengezwe ku-url futhi umlayezo wokuphendula ubuyiselwa njengeyunithi yezinhlamvu engenalutho.

Ukumiswa kwesevisi kungachazwa ngegama lesevisi, iqoqo lezimbobo nokunye okuncikile. Kunezindlela ezimbalwa ezingenzeka zokumela zonke lezi zici ku-Scala (isibonelo, HList, izinhlobo zedatha ye-algebraic). Ngezinjongo zalokhu okuthunyelwe sizosebenzisa Iphethini Yekhekhe futhi simele izingcezu ezihlangene (amamojula) njengezici. (Iphethini yekhekhe ayiyona imfuneko yale ndlela yokuhlela ehlanganisiwe. Iwukusetshenziswa okukodwa okungenzeka kombono.)

Ukuncika kungamelwa kusetshenziswa Iphethini Yekhekhe njengeziphetho zamanye amanodi:

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

Isevisi ye-Echo idinga kuphela imbobo elungiselelwe. Futhi simemezela ukuthi leli chweba lisekela i-echo protocol. Qaphela ukuthi asikho isidingo sokucacisa imbobo ethile okwamanje, ngoba i-trait's ivumela ukumenyezelwa kwezindlela ezingabonakali. Uma sisebenzisa izindlela ezingabonakali, umhlanganisi uzodinga ukuqaliswa esimweni sokulungiselela. Lapha sinikeze ukuqaliswa (8081) futhi izosetshenziswa njengenani elizenzakalelayo uma siyeqa ekucushweni kukakhonkolo.

Singamemezela ukuncika ekucushweni kweklayenti lesevisi ye-echo:

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

Ukuncika kunohlobo olufanayo ne echoService. Ikakhulukazi, idinga inqubo efanayo. Ngakho-ke, singaqiniseka ukuthi uma sixhuma lezi zincika ezimbili zizosebenza ngendlela efanele.

Ukuqaliswa kwezinsizakalo

Isevisi idinga umsebenzi ukuze iqale futhi ivalwe kahle. (Ikhono lokuvala isevisi libalulekile ekuhlolweni.) Futhi kukhona izinketho ezimbalwa zokucacisa umsebenzi onjalo wokulungiselelwa okunikeziwe (isibonelo, singasebenzisa amakilasi ohlobo). Kulokhu okuthunyelwe sizosebenzisa Iphethini Yekhekhe futhi. Singamela isevisi sisebenzisa cats.Resource esevele ihlinzeka ngokubakaki nokukhululwa kwezinsiza. Ukuze sithole insiza kufanele sinikeze ukucushwa kanye nengqikithi yesikhathi sokusebenza. Ngakho-ke umsebenzi wokuqalisa isevisi ungase ubukeke 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]
  }

lapho

  • Config — uhlobo lokumisa oludingwa yilesi siqalisi sesevisi
  • AddressResolver — into yesikhathi sokusebenza enekhono lokuthola amakheli angempela amanye ama-node (qhubeka ufunda ukuze uthole imininingwane).

ezinye izinhlobo zivela cats:

  • F[_] - uhlobo lomphumela (Ezimweni ezilula kakhulu F[A] kungaba nje () => A. Kulokhu okuthunyelwe sizosebenzisa cats.IO.)
  • Reader[A,B] — kusho igama elifanayo lomsebenzi othile A => B
  • cats.Resource - kunezindlela zokuthola nokukhulula
  • Timer - Ivumela ukulala/ukulinganisa isikhathi
  • ContextShift - i-analogue ye ExecutionContext
  • Applicative - isengezo semisebenzi esebenzayo (cishe i-monad) (singase ekugcineni siyimisele ngenye into)

Ngokusebenzisa lesi sixhumanisi singasebenzisa izinsiza ezimbalwa. Isibonelo, isevisi engenzi lutho:

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

(Bheka Ikhodi yomthombo kwezinye izinhlelo zokusebenza - isevisi ye-echo,
iklayenti le-echo futhi izilawuli zokuphila konke.)

I-node yinto eyodwa esebenzisa izinsiza ezimbalwa (ukuqala uchungechunge lwezinsiza kunikwe amandla Iphethini Yekhekhe):

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

Qaphela ukuthi ku-node sicacisa uhlobo oluqondile lokucushwa oludingwa yile nodi. Umhlanganisi ngeke asivumele ukuthi sakhe into (Ikhekhe) ngohlobo olunganele, ngoba isici ngasinye sesevisi simemezela umkhawulo Config uhlobo. Futhi ngeke sikwazi ukuqalisa i-node ngaphandle kokunikeza ukucushwa okuphelele.

Ukulungiswa kwekheli lenodi

Ukuze sisungule uxhumano sidinga ikheli langempela lokusingatha indawo ngayinye. Ingase yaziwe kamuva kunezinye izingxenye zokucushwa. Ngakho-ke, sidinga indlela yokuhlinzeka ngemephu phakathi kwe-node id nekheli layo langempela. Lokhu kumephu kuwumsebenzi:

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

Kunezindlela ezimbalwa zokwenza umsebenzi onjalo.

  1. Uma siwazi amakheli angempela ngaphambi kokuthunyelwa, ngesikhathi somsingathi we-node, singase sikwazi ukukhiqiza ikhodi ye-Scala ngamakheli angempela futhi siqalise ukwakha ngemva kwalokho (okwenza ukuhlola isikhathi sokuhlanganisa bese kusebenzisa uhlelo lokuhlola lokuhlanganisa). Kulokhu umsebenzi wethu wokwenza imephu waziwa ngokwezibalo futhi ungenziwa lula into efana ne-a Map[NodeId, NodeAddress].
  2. Ngezinye izikhathi sithola amakheli angempela kuphela ngemva kwesikhathi lapho i-node isiqalisiwe, noma asinawo amakheli wamanodi angakaqalwa. Kulokhu singase sibe nesevisi yokuthola eqalwa ngaphambi kwawo wonke amanye ama-node futhi inodi ngayinye ingase ikhangise ikheli layo kuleyo sevisi futhi ibhalisele ukuncika.
  3. Uma singashintsha /etc/hosts, singasebenzisa amagama abasingathi achazwe ngaphambilini (njenge my-project-main-node futhi echo-backend) bese uvele uhlobanise leli gama nekheli lasesizindeni se-inthanethi ngesikhathi sokuthunyelwa.

Kulokhu okuthunyelwe asiwafaki la macala ngemininingwane eyengeziwe. Eqinisweni esibonelweni sethu samathoyizi wonke ama-node azoba nekheli le-IP elifanayo - 127.0.0.1.

Kulokhu okuthunyelwe sizocubungula izakhiwo ezimbili zesistimu esabalalisiwe:

  1. Isakhiwo se-node eyodwa, lapho zonke izinkonzo zibekwe endaweni eyodwa.
  2. Isakhiwo samanodi amabili, lapho isevisi neklayenti kutholakala ezindaweni ezahlukene.

Ukucushwa kwe-a indawo eyodwa isakhiwo simi kanje:

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

Lapha sakha ukucushwa okukodwa okunweba kokubili ukucushwa kweseva neklayenti. Futhi silungiselela isilawuli somjikelezo wempilo esizovala iklayenti neseva ngemva kwalokho lifetime ukudlula kwesikhawu.

Isethi efanayo yokuqaliswa kwesevisi kanye nezilungiselelo zingasetshenziswa ukudala isakhiwo sesistimu ngamanodi amabili ahlukene. Sidinga nje ukudala ama-node amabili ahlukene okucushwa ngamasevisi afanele:

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

Bona ukuthi sikucacisa kanjani ukuncika. Sisho insizakalo ehlinzekiwe yenye nodi njengokuncika kwenodi yamanje. Uhlobo lokuncika luyahlolwa ngoba luqukethe uhlobo lwe-phantom oluchaza iphrothokholi. Futhi ngesikhathi sokusebenza sizoba ne-id eyi-node elungile. Lesi esinye sezici ezibalulekile zendlela yokumisa ehlongozwayo. Kusinikeza ikhono lokusetha imbobo kanye kuphela futhi siqinisekise ukuthi siqondisa imbobo elungile.

Ukuqaliswa kwamanodi amabili

Kulokhu kulungiselelwa sisebenzisa ukuqaliswa kwezinsizakalo ezifanayo ncamashi. Azikho izinguquko nhlobo. Kodwa-ke, sakha ukusetshenziswa kwe-node okubili okuqukethe isethi ehlukile yezinsizakalo:

  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 kuphela ukulungiselelwa kohlangothi lweseva. I-node yesibili isebenzisa iklayenti futhi idinga enye ingxenye ye-config. Womabili ama-node adinga ukucaciswa kwempilo yonke. Ngezinjongo zale nodi yesevisi yeposi izoba nempilo engapheli enganqanyulwa kusetshenziswa SIGTERM, kuyilapho iklayenti le-echo lizonqanyulwa ngemva kwesikhathi esinqunyiwe esimisiwe. Bona i- isicelo sokuqala ukuze uthole imininingwane.

Inqubo yokuthuthukiswa iyonke

Ake sibone ukuthi le ndlela yokusebenzela iyishintsha kanjani indlela esisebenza ngayo nokucushwa.

Ukucushwa njengekhodi kuzohlanganiswa futhi kukhiqize i-artifact. Kubonakala kunengqondo ukuhlukanisa i-artifact yokucushwa kwamanye ama-artifact ekhodi. Ngokuvamile singaba nenqwaba yokucushwa kusisekelo sekhodi esifanayo. Futhi-ke, singaba nezinguqulo eziningi zamagatsha okucushwa ahlukahlukene. Ekucushweni singakhetha izinguqulo ezithile zamalabhulali futhi lokhu kuzohlala kungashintshi noma nini lapho sisebenzisa lokhu kumisa.

Ushintsho lokucushwa luba ushintsho lwekhodi. Ngakho-ke kufanele kuhlanganiswe inqubo yokuqinisekisa ikhwalithi efanayo:

Ithikithi -> PR -> buyekeza -> hlanganisa -> ukuhlanganiswa okuqhubekayo -> ukuthunyelwa okuqhubekayo

Kunemiphumela elandelayo yendlela yokwenza:

  1. Ukucushwa kuhambisana nesibonelo sesistimu ethile. Kubonakala sengathi ayikho indlela yokuba nokuxhumana okungalungile phakathi kwama-node.
  2. Akulula ukushintsha ukumisa endaweni eyodwa kuphela. Kubonakala kungenangqondo ukungena nokushintsha amanye amafayela ombhalo. Ngakho-ke ukukhukhuleka kokucushwa kuba kuncane okunokwenzeka.
  3. Izinguquko ezincane zokumisa akulula ukuzenza.
  4. Iningi lezinguquko zokucushwa zizolandela inqubo efanayo yokuthuthukisa, futhi izodlula isibuyekezo.

Ingabe sidinga inqolobane ehlukile yokucushwa kokukhiqiza? Ukulungiselelwa kokukhiqiza kungase kuqukathe ulwazi olubucayi esingathanda ukulugcina lukude nabantu abaningi. Ngakho-ke kungase kudingeke ukuthi kugcinwe inqolobane ehlukile enokufinyelela okukhawulelwe okuzoqukatha ukulungiselelwa kokukhiqiza. Singase sihlukanise ukucushwa kube izingxenye ezimbili - eyodwa equkethe imingcele evuleke kakhulu yokukhiqiza kanye nengxenye equkethe ingxenye eyimfihlo yokucushwa. Lokhu kuzonika amandla ukufinyelela konjiniyela abaningi kumingcele eminingi kuyilapho kukhawulela ukufinyelela ezintweni ezibucayi ngempela. Kulula ukufeza lokhu usebenzisa izici ezimaphakathi ezinamavelu epharamitha azenzakalelayo.

Ukuhluka

Ake sibone okuhle nobubi bendlela ehlongozwayo uma kuqhathaniswa namanye amasu okuphatha okucushwa.

Okokuqala, sizoklelisa ezinye izindlela ezimbalwa ezicini ezihlukene zendlela ehlongozwayo yokubhekana nokucushwa:

  1. Ifayela lombhalo emshinini oqondiwe.
  2. Isitoreji senani elingukhiye esimaphakathi (njenge etcd/zookeeper).
  3. Izingxenye zenqubo engaphansi ezingase zimiswe kabusha/ziqalwe kabusha ngaphandle kokuqalisa kabusha inqubo.
  4. Ukucushwa ngaphandle kwe-artifact nokulawula inguqulo.

Ifayela lombhalo linikeza ukuguquguquka okuthile mayelana nokulungiswa kwe-ad-hoc. Umlawuli wesistimu angangena ku-node eqondiwe, enze ushintsho futhi avele aqale kabusha isevisi. Lokhu kungase kungabi kuhle kumasistimu amakhulu. Akukho mikhondo esele ngemuva koshintsho. Ushintsho alubuyekezwa ngelinye ipheya lamehlo. Kungase kube nzima ukuthola ukuthi yini ebangele ushintsho. Ayikahlolwa. Ngokombono wesistimu esabalalisiwe umlawuli angavele akhohlwe ukubuyekeza ukucushwa kwenye yezindawo.

(Btw, uma ekugcineni kuzoba nesidingo sokuqala ukusebenzisa amafayela okuhlelwa kombhalo, kuzodingeka kuphela sengeze umhlaseli + oqinisekisayo ongakhiqiza okufanayo. Config thayipha futhi lokho kuyokwanela ukuqala ukusebenzisa ukulungiselelwa kombhalo. Lokhu futhi kubonisa ukuthi inkimbinkimbi yokucushwa kwesikhathi sokuhlanganisa incane kakhulu kunobunzima bokucushwa okusekelwe embhalweni, ngoba enguqulweni esekelwe embhalweni sidinga ikhodi eyengeziwe.)

Isitoreji senani elingukhiye endaweni eyodwa siyindlela enhle yokusabalalisa imingcele ye-meta yohlelo lokusebenza. Lapha sidinga ukucabanga ngalokho esikubheka njengamagugu okucushwa nokuthi iyiphi idatha nje. Inikezwe umsebenzi C => A => B ngokuvamile sibiza amanani angavamile ukushintsha C "ukumisa", kuyilapho idatha ishintshwa njalo A - faka idatha nje. Ukucushwa kufanele kunikezwe umsebenzi ngaphambi kwedatha A. Ngokunikezwa lo mbono singasho ukuthi kulindelekile imvamisa yezinguquko lokho okungasetshenziswa ukuhlukanisa idatha yokumisa kudatha nje. Futhi idatha ngokuvamile ivela kumthombo owodwa (umsebenzisi) futhi ukucushwa kuvela kumthombo ohlukile (umlawuli). Ukubhekana namapharamitha angashintshwa ngemva kwenqubo yokuqalisa kuholela ekwandeni kobunzima bohlelo lokusebenza. Kumapharamitha anjalo kuzodingeka siphathe indlela yokulethwa kwawo, ukucozulula nokuqinisekisa, ukuphatha amanani angalungile. Ngakho-ke, ukuze kwehliswe inkimbinkimbi yohlelo, singasehlisa kangcono inani lamapharamitha angashintsha ngesikhathi sokusebenza (noma ukuwaqeda ngokuphelele).

Ngokombono walokhu okuthunyelwe kufanele senze umehluko phakathi kwemingcele emile kanye ne-dynamic. Uma ingqondo yesevisi idinga ushintsho olungajwayelekile kwamanye amapharamitha ngesikhathi sokusebenza, singase sikubize ngamapharamitha aguqukayo. Uma kungenjalo amile futhi angalungiselelwa kusetshenziswa indlela ehlongozwayo. Ukuze ulungise kabusha okuguquguqukayo ezinye izindlela zingadingeka. Isibonelo, izingxenye zesistimu zingase ziqalwe kabusha ngamapharamitha amasha wokulungiselela ngendlela efanayo ukuze kuqalwe kabusha izinqubo ezihlukene zesistimu esabalalisiwe.
(Umbono wami othobekile uwukugwema ukumiswa kabusha kwesikhathi sokusebenza ngoba kwandisa inkimbinkimbi yesistimu.
Kungase kucace kakhudlwana ukuthembela nje ekusekelweni kwe-OS kokuqalisa kabusha izinqubo. Nokho, kungase kungenzeki ngaso sonke isikhathi.)

Isici esisodwa esibalulekile sokusebenzisa ukumisa okumile okwenza ngezinye izikhathi abantu bacabange ukucushwa okuguquguqukayo (ngaphandle kwezinye izizathu) isikhathi sokuphumula sesevisi phakathi nokubuyekezwa kokucushwa. Ngempela, uma kufanele senze izinguquko ekucushweni okumile, kufanele siqale kabusha isistimu ukuze amanani amasha asebenze. Izidingo zesikhathi sokuphumula ziyahlukahluka kumasistimu ahlukene, ngakho-ke kungase kungabi bucayi kangako. Uma kubalulekile, kuzomele sihlele kusenesikhathi nganoma yikuphi ukuqaliswa kabusha kwesistimu. Ngokwesibonelo, singasebenzisa Ukukhipha uxhumano lwe-AWS ELB. Kulesi simo noma nini lapho sidinga ukuqalisa kabusha isistimu, siqala isibonelo esisha sesistimu ngokuhambisana, bese sishintsha i-ELB kuso, kuyilapho sivumela isistimu endala ukuthi iqedele ukusevisa uxhumo olukhona.

Kuthiwani ngokugcina ukucushwa ngaphakathi kwe-artifact yenguqulo noma ngaphandle? Ukugcina ukucushwa ngaphakathi kwe-artifact kusho ukuthi ezimweni eziningi lokhu kulungiselelwa kudlule inqubo yokuqinisekisa ikhwalithi efanayo namanye ama-artifact. Ngakho-ke umuntu angase aqiniseke ukuthi ukucushwa kungokwekhwalithi enhle futhi enokwethenjelwa. Ngokuphambene nokucushwa efayeleni elihlukile kusho ukuthi akukho mkhondo wokuthi ubani futhi kungani enze izinguquko kulelo fayela. Ingabe lokhu kubalulekile? Sikholelwa ukuthi kumasistimu amaningi okukhiqiza kungcono ukuba nokucushwa okuzinzile nokuphezulu.

Inguqulo ye-artifact ivumela ukuthola ukuthi yadalwa nini, yimaphi amanani equkethe, yiziphi izici ezinikwe amandla/ezikhutshaziwe, ubani owayenesibopho sokwenza ushintsho ngalunye ekucushweni. Kungase kudinge umzamo othile ukugcina ukucushwa ngaphakathi kwe-artifact futhi kuwukukhetha komklamo ongakwenza.

Izinzuzo nezingozi

Lapha sithanda ukugqamisa izinzuzo ezithile kanye nokuxoxa ngobubi bendlela ehlongozwayo.

Izinzuzo

Izici zokucushwa okuhlanganisiwe kwesistimu ephelele esabalalisiwe:

  1. Ukuhlola okumile kokucushwa. Lokhu kunikeza izinga eliphezulu lokuzethemba, ukuthi ukucushwa kulungile uma kunikezwe uhlobo lwezingqinamba.
  2. Ulimi olucebile lokucushwa. Ngokujwayelekile ezinye izindlela zokumisa zikhawulelwe ekushintsheni okuguquguqukayo okuningi.
    Ukusebenzisa i-Scala umuntu angasebenzisa izinhlobonhlobo zezici zolimi ukwenza ukumisa kube ngcono. Ngokwesibonelo, singasebenzisa izici ukuze sinikeze amanani azenzakalelayo, izinto zokusetha ububanzi obuhlukile, esingabhekisela kuzo vals ichazwe kanye kuphela kububanzi obungaphandle (DRY). Kungenzeka ukusebenzisa ukulandelana kwangempela, noma izimo zezigaba ezithile (Seq, Map, Njll).
  3. I-DSL. I-Scala inokwesekwa okuhloniphekile kubabhali be-DSL. Umuntu angasebenzisa lezi zici ukuze asungule ulimi lokumisa olufaneleka kakhulu futhi olusebenziseka kalula, ukuze ukulungiselelwa kokugcina kufundeke okungenani abasebenzisi besizinda.
  4. Ubuqotho nokuhambisana kuzo zonke izindawo. Enye yezinzuzo zokuba nokucushwa kwayo yonke isistimu esabalalisiwe endaweni eyodwa ukuthi wonke amanani achazwa kanye kanye abese esetshenziswa kabusha kuzo zonke izindawo lapho esiwadinga khona. Futhi thayipha izimemezelo zembobo ephephile qinisekisa ukuthi kukho konke ukulungiselelwa okulungile okungaba khona amanodi esistimu azokhuluma ulimi olufanayo. Kukhona ukuncika okucacile phakathi kwama-node okwenza kube nzima ukukhohlwa ukunikeza amasevisi athile.
  5. Ikhwalithi ephezulu yezinguquko. Indlela yonke yokudlulisa izinguquko zokucushwa ngenqubo evamile ye-PR isungula amazinga aphezulu ekhwalithi nawo ekucushweni.
  6. Izinguquko zokumisa ngesikhathi esisodwa. Noma nini lapho senza izinguquko ekusetshenzisweni okuzenzakalelayo kuqinisekisa ukuthi wonke ama-node ayabuyekezwa.
  7. Ukwenza lula isicelo. Uhlelo lokusebenza aludingi ukuhlaziya futhi luqinisekise ukumisa futhi luphathe amanani okumisa angalungile. Lokhu kwenza uhlelo lokusebenza lube lula. (Ukwenyuka okuthile okuyinkimbinkimbi kusekucushweni ngokwako, kodwa kuwukuhwebelana okuqaphelayo maqondana nokuphepha.) Kuqondile kakhulu ukubuyela ekucushweni okuvamile - mane ungeze izingcezu ezingekho. Kulula ukuqalisa ngokucushwa okuhlanganisiwe nokuhlehlisa ukuqaliswa kwezingcezu ezengeziwe kwezinye izikhathi ezizayo.
  8. Inguqulo yokucushwa. Ngenxa yokuthi izinguquko zokumisa zilandela inqubo efanayo yokuthuthukisa, ngenxa yalokho sithola i-artifact enenguqulo eyingqayizivele. Kusivumela ukuthi sibuyisele ukucushwa uma kudingeka. Singase sikhiphe nokucushwa okwasetshenziswa ngonyaka odlule futhi kuzosebenza ngendlela efanayo. Ukucushwa okuzinzile kuthuthukisa ukubikezelwa nokuthembeka kwesistimu esabalalisiwe. Ukulungiselelwa kulungisiwe ngesikhathi sokuhlanganiswa futhi akukwazi ukuphazamiseka kalula ohlelweni lokukhiqiza.
  9. I-Modularity. Uhlaka oluhlongozwayo luyi-modular futhi amamojula angahlanganiswa ngezindlela ezihlukahlukene ukuze
    ukusekela ukucupha okuhlukene (ukusetha/izakhiwo). Ikakhulukazi, kungenzeka ukuthi ube nesakhiwo senodi yesikali esisodwa kanye nesilungiselelo esikhulu samanodi amaningi. Kunengqondo ukuba nezakhiwo eziningi zokukhiqiza.
  10. Ukuhlola. Ngezinjongo zokuhlola umuntu angase asebenzise isevisi mbumbulu futhi ayisebenzise njengokwencika ngendlela ephephile. Izakhiwo ezimbalwa ezihlukene zokuhlola ezinezingxenye ezahlukahlukene ezithathelwe indawo ama-mocks zinganakekelwa kanyekanye.
  11. Ukuhlolwa kokuhlanganisa. Kwesinye isikhathi kumasistimu asabalalisiwe kunzima ukwenza izivivinyo zokuhlanganisa. Ngokusebenzisa indlela echazwe ukuze uthayiphe ukucushwa okuphephile kwesistimu ephelele esabalalisiwe, singasebenzisa zonke izingxenye ezisabalalisiwe kuseva eyodwa ngendlela elawulekayo. Kulula ukulingisa isimo
    uma enye yamasevisi ingatholakali.

Okumbi

Indlela yokuhlela ehlanganisiwe yehlukile ekucushweni "okuvamile" futhi ingase ingahambisani nazo zonke izidingo. Nakhu okunye okubi kokucushwa okuhlanganisiwe:

  1. Ukucushwa okumile. Ingase ingalungeli zonke izinhlelo zokusebenza. Kwezinye izimo kunesidingo sokulungisa ngokushesha ukumiswa ekukhiqizeni kudlula zonke izinyathelo zokuphepha. Le ndlela yokwenza kube nzima kakhulu. Ukuhlanganiswa nokusatshalaliswa kabusha kuyadingeka ngemva kokwenza noma yiluphi ushintsho ekucushweni. Lokhu kokubili isici nomthwalo.
  2. Ukwakhiwa kokucushwa. Uma ukulungiselelwa kukhiqizwa ithuluzi elithile le-automation le ndlela idinga ukuhlanganiswa okulandelayo (okungase kuhluleke). Kungase kudinge umzamo owengeziwe ukuhlanganisa lesi sinyathelo esengeziwe ohlelweni lokwakha.
  3. Izinsimbi. Kunamathuluzi amaningi asetshenziswayo namuhla ancike ekucushweni okusekelwe embhalweni. Abanye babo
    ngeke kusebenze lapho ukucushwa kuhlanganiswa.
  4. Ukushintsha kwesimo sengqondo kuyadingeka. Onjiniyela kanye ne-DevOps bajwayele amafayela ombhalo. Umqondo wokuhlanganisa ukucushwa ungase ubonakale uyinqaba kubo.
  5. Ngaphambi kokwethula ukucushwa okuhambisanayo kudingeka inqubo yokuthuthukiswa kwesofthiwe yekhwalithi ephezulu.

Kunemikhawulo ethile yesibonelo esisetshenzisiwe:

  1. Uma sihlinzeka ngokulungiselelwa okwengeziwe okungafunwa ukusetshenziswa kwenodi, umhlanganisi ngeke asisize ukuthola ukuqaliswa okungekho. Lokhu kungaxazululwa ngokusebenzisa HList noma ama-ADT (amakilasi ecala) okulungiselelwa kwenodi esikhundleni sezimpawu kanye Nephethini Yekhekhe.
  2. Kufanele sinikeze i-boilerplate kufayela lokumisa: (package, import, object izimemezelo;
    override def's yamapharamitha anamanani azenzakalelayo). Lokhu kungase kuxazululwe kusetshenziswa i-DSL.
  3. Kulokhu okuthunyelwe asifaki ukulungiswa kabusha okuguquguqukayo kwamaqoqo ama-node afanayo.

Isiphetho

Kulokhu okuthunyelwe sixoxe ngombono wokumela ukucushwa ngqo kukhodi yomthombo ngendlela ephephile. Indlela ingasetshenziswa ezinhlelweni eziningi njengokumiselela i-xml- nokunye ukulungiselelwa okusekelwe embhalweni. Ngaphandle kokuthi isibonelo sethu sisetshenziswe ku-Scala, singase futhi sihunyushwe kwezinye izilimi ezingahlanganiswa (njenge-Kotlin, C#, Swift, njll.). Umuntu angazama le ndlela kuphrojekthi entsha futhi, uma ingangeni kahle, ashintshele endleleni yakudala.

Yebo, ukucushwa okuhlanganisiwe kudinga inqubo yokuthuthukiswa kwekhwalithi ephezulu. Ngokubuyisela ithembisa ukunikeza ukucushwa okuqinile kwekhwalithi ephezulu ngokulinganayo.

Le ndlela inganwetshwa ngezindlela ezihlukahlukene:

  1. Umuntu angasebenzisa ama-macros ukwenza ukuqinisekiswa kokucushwa futhi ahluleke ngesikhathi sokuhlanganisa uma kwenzeka noma yikuphi ukwehluleka kwezingqinamba zebhizinisi.
  2. I-DSL ingase isetshenziswe ukuze imele ukulungiselelwa ngendlela evumela umsebenzisi wesizinda.
  3. Ukuphathwa kwensiza enamandla ngokulungiswa kokumisa okuzenzakalelayo. Isibonelo, lapho silungisa inani lama-cluster node esingase sifune (1) ama-node ukuze sithole ukucushwa okushintshwe kancane; (2) Umphathi weqoqo ukuthola ulwazi lwamanodi amasha.

Siyabonga

Ngithanda ukubonga u-Andrey Saksonov, u-Pavel Popov, u-Anton Nehaev ngokunikeza impendulo ekhuthazayo mayelana nokusalungiswa kwalokhu okuthunyelwe okungisizile ukuba ngikwenze kucace.

Source: www.habr.com