Ndingathanda ukukuxelela indlela enye enomdla yokusebenza ngoqwalaselo lwenkqubo esasazwayo. Uqwalaselo lumelwe ngokuthe ngqo kulwimi oluhlanganisiweyo (iScala) kusetyenziswa iindidi ezikhuselekileyo. Esi sithuba sibonelela ngomzekelo wobumbeko olunjalo kwaye sixoxa ngemiba eyahlukeneyo yokuphumeza uqwalaselo oluhlanganisiweyo kwinkqubo yophuhliso iyonke.

()
Intshayelelo
Ukwakha inkqubo ethembekileyo esasazwayo kuthetha ukuba zonke iindawo zisebenzisa ulungelelwaniso oluchanekileyo, oludityaniswe nezinye iindawo. Ubuchwephesha be-DevOps (i-terraform, i-ansible okanye into enjalo) ngokuqhelekileyo isetyenziselwa ukuvelisa ngokuzenzekelayo iifayile zoqwalaselo (ezihlala zikhethekileyo kwi-node nganye). Singathanda kwakhona ukuqiniseka ukuba zonke iindawo zonxibelelwano zisebenzisa iiprothokholi ezifanayo (kubandakanywa noguqulelo olufanayo). Ngaphandle koko, ukungahambelani kuya kwakhiwa kwinkqubo yethu esasazwayo. Kwilizwe le-JVM, esinye isiphumo sale mfuno kukuba uhlobo olufanayo lwethala leencwadi eliqulethe imiyalezo yeprotocol kufuneka lisetyenziswe kuyo yonke indawo.
Kuthekani ngokuvavanya inkqubo esasazwayo? Ewe kunjalo, sicinga ukuba onke amacandelo anovavanyo lweyunithi ngaphambi kokuba siqhubele phambili kuvavanyo lokudibanisa. (Ukuze sikwazi ukwandisa iziphumo zovavanyo kwixesha lokuqalisa, kufuneka kwakhona sibonelele ngeseti efanayo yamathala eencwadi kwinqanaba lovavanyo nangexesha lokusebenza.)
Xa usebenza ngeemvavanyo zokudibanisa, kudla ngokuba lula ukusebenzisa indlela yeklasi efanayo kuyo yonke indawo kuzo zonke iindawo. Ekuphela kwento ekufuneka siyenze kukuqinisekisa ukuba indlela yeklasi efanayo iyasetyenziswa ngexesha lokusebenza. (Nangona kunokwenzeka ngokupheleleyo ukuqhuba ii-nodes ezahlukeneyo kunye neendlela ezahlukeneyo zeklasi, oku kongeza ubunzima kuqwalaselo olupheleleyo kunye nobunzima kunye neemvavanyo zokusasazwa kunye nokudibanisa.) Ngenjongo yesi sithuba, sicinga ukuba zonke iinqununu ziya kusebenzisa i-classpath efanayo.
Uqwalaselo luyavela kunye nesicelo. Sisebenzisa iinguqulelo ukuchonga izigaba ezahlukeneyo zokuzivelela kwenkqubo. Kubonakala kunengqiqo ukuchonga iinguqulelo ezahlukeneyo zoqwalaselo. Kwaye ubeke uqwalaselo ngokwalo kwinkqubo yolawulo lwenguqulelo. Ukuba kukho uqwalaselo olunye kuphela kwimveliso, ngoko sinokusebenzisa inombolo yenguqulo. Ukuba sisebenzisa iimeko ezininzi zemveliso, ngoko siya kufuna ezininzi
amasebe oqwalaselo kunye neleyibhile eyongezelelweyo ukongeza kuguqulelo (umzekelo, igama lesebe). Ngale ndlela sinokubona ngokucacileyo ulungelelwaniso oluchanekileyo. Isichongi soqwalaselo ngasinye sihambelana ngokukodwa nendibaniselwano ethile yeenodi ezisasaziweyo, amazibuko, izixhobo zangaphandle, kunye neenguqulelo zethala leencwadi. Ngenjongo yesi sithuba siya kucinga ukuba kukho isebe elinye kuphela kwaye siyakwazi ukuchonga ukucwangciswa ngendlela eqhelekileyo ngokusebenzisa amanani amathathu ahlulwe ngechaphaza (1.2.3).
Kwiimeko-bume zangoku, iifayile zoqwalaselo azifane zenziwe ngesandla. Kaninzi ziye zenziwa ngexesha lokusasazwa kwaye azisachukunyiswa (ukuze ). Umbuzo wendalo uyavela: kutheni sisasebenzisa ifomati yokubhaliweyo ukugcina uqwalaselo? Enye indlela esebenzayo ibonakala iyisakhono sokusebenzisa ikhowudi eqhelekileyo yoqwalaselo kunye nokuzuza ekuqulunqweni kwexesha lokujonga.
Kule posi siza kuphonononga umbono wokumela uqwalaselo ngaphakathi kwe-artifact ehlanganisiweyo.
Ubumbeko oluhlanganisiweyo
Eli candelo libonelela ngomzekelo woqwalaselo oluhlanganisiweyo olungatshintshiyo. Iinkonzo ezimbini ezilula ziphunyeziwe - inkonzo ye-echo kunye nomxhasi wenkonzo ye-echo. Ngokusekwe kwezi nkonzo zimbini, iinketho ezimbini zenkqubo zihlangene. Kolunye ukhetho, zombini iinkonzo zifumaneka kwindawo enye, kwenye inketho - kwiindawo ezahlukeneyo.
Ngokuqhelekileyo inkqubo esasazwayo iqulethe iindawo ezininzi. Unokuchonga iindawo usebenzisa amaxabiso ohlobo oluthile NodeId:
sealed trait NodeId
case object Backend extends NodeId
case object Frontend extends NodeIdokanye
case class NodeId(hostName: String)okanye
object Singleton
type NodeId = Singleton.typeIiNodes zenza iindima ezahlukeneyo, ziqhuba iinkonzo kunye ne-TCP / HTTP uxhumano lunokusekwa phakathi kwabo.
Ukuchaza uxhulumaniso lwe-TCP sifuna ubuncinane inombolo yezibuko. Singathanda kwakhona ukubonisa iprothokholi exhaswayo kwizibuko ukuqinisekisa ukuba zombini umxhasi kunye nomncedisi usebenzisa iprothokholi efanayo. Siza kuchaza unxibelelwano sisebenzisa iklasi elandelayo:
case class TcpEndPoint[Protocol](node: NodeId, port: Port[Protocol])apho Port - inani elipheleleyo Int ebonisa uluhlu lwamaxabiso amkelekileyo:
type PortNumber = Refined[Int, Closed[_0, W.`65535`.T]]Iintlobo ezisulungekileyo
Jonga ithala leencwadi и . Ngamafutshane, ithala leencwadi likuvumela ukuba wongeze imiqobo kwiintlobo ezijongwayo ngexesha lokuqokelela. Kulo mzekelo, amaxabiso e-port esebenzayo yi-16-bit integers. Kuqwalaselo oluhlanganisiweyo, ukusebenzisa ithala leencwadi elisulungekileyo akunyanzelwanga, kodwa kuphucula ukukwazi komqambi ukujonga uqwalaselo.
Kwiiprotocol zeHTTP (REST), ukongeza kwinombolo yesibuko, sinokufuna indlela eya kwinkonzo:
type UrlPathPrefix = Refined[String, MatchesRegex[W.`"[a-zA-Z_0-9/]*"`.T]]
case class PortWithPrefix[Protocol](portNumber: PortNumber, pathPrefix: UrlPathPrefix)Iintlobo zePhantom
Ukuchonga iprotocol ngexesha lokuqokelela, sisebenzisa uhlobo lweparameter olungasetyenziswanga ngaphakathi kweklasi. Esi sigqibo kungenxa yokuba asisebenzisi umzekelo weprothokholi ngexesha lokusebenza, kodwa singathanda ukuba umqokeleli ajonge ukuhambelana kweprotocol. Ngokucacisa iprotocol, asiyi kukwazi ukudlula inkonzo engafanelekanga njengokuxhomekeka.
Enye yeeprothokholi eziqhelekileyo yi-REST API ene-Json serialization:
sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]apho RequestMessage - uhlobo lwesicelo, ResponseMessage - uhlobo lwempendulo.
Ewe, sinokusebenzisa ezinye iinkcazo zeprotocol ezibonelela ngokuchaneka kwenkcazo esiyifunayo.
Ngenjongo yesi sithuba, siya kusebenzisa inguqulelo eyenziwe lula yeprotocol:
sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]Apha isicelo ngumtya ofakwe kwi-url kwaye impendulo ngumtya obuyisiweyo kumzimba wempendulo yeHTTP.
Ubumbeko lwenkonzo luchazwa ngegama lenkonzo, amazibuko, kunye nabaxhomekeke. Ezi zinto zinokumelwa kwi-Scala ngeendlela ezininzi (umzekelo, HList-s, iindidi zedatha yealjibra). Ngenjongo yesi sithuba, siya kusebenzisa iPatheni yeCake kwaye simele iimodyuli sisebenzisa trait'ov. (Ipateni yekeyiki ayisiyonto ifunekayo kule ndlela yokwenza. Luphumezo olunye olunokwenzeka.)
Ukuxhomekeka phakathi kweenkonzo kunokumelwa njengeendlela ezibuyisela amazibuko EndPointkwezinye iindawo:
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)
}Ukwenza inkonzo ye-echo, konke okufunayo yinombolo yezibuko kunye nomqondiso wokuba izibuko lixhasa i-echo protocol. Asinakukhankanya izibuko elithile, kuba... iimpawu zikuvumela ukuba uchaze iindlela ngaphandle kokuphunyezwa (iindlela ezingabonakaliyo). Kule meko, xa udala ukucwangciswa kwekhonkrithi, umqambi uya kufuna ukuba sinikeze ukuphunyezwa kwendlela ye-abstract kunye nokubonelela ngenombolo ye-port. Ekubeni siphumeze indlela, xa sidala uqwalaselo oluthile, asikwazi ukukhankanya i-port eyahlukileyo. Ixabiso elimiselweyo liya kusetyenziswa.
Kubumbeko lomxhasi sibhengeza ukuxhomekeka kwinkonzo ye-echo:
trait EchoClientConfig[A] {
def testMessage: String = "test"
def pollInterval: FiniteDuration
def echoServiceDependency: HttpSimpleGetEndPoint[_, EchoProtocol[A]]
}Ukuxhomekeka luhlobo olufanayo nenkonzo ethunyelwa ngaphandle echoService. Ngokukodwa, kumxhasi we-echo sifuna inkqubo efanayo. Ngoko ke, xa udibanisa iinkonzo ezimbini, sinokuqiniseka ukuba yonke into iya kusebenza ngokuchanekileyo.
Ukuphunyezwa kweenkonzo
Umsebenzi uyafuneka ukuqalisa nokumisa inkonzo. (Ukukwazi ukumisa inkonzo kubalulekile kuvavanyo.) Kwakhona, kukho iindlela ezininzi zokusebenzisa uphawu olunjalo (umzekelo, sinokusebenzisa uhlobo lweeklasi ezisekelwe kuhlobo loqwalaselo). Ngenjongo yesi sithuba siza kusebenzisa iPatheni yeCake. Siza kumela inkonzo sisebenzisa iklasi cats.Resource, ngokuba Le klasi sele ibonelela ngeendlela zokuqinisekisa ngokukhuselekileyo ukukhutshwa kwezibonelelo xa kukho iingxaki. Ukufumana isibonelelo, kufuneka sinikeze uqwalaselo kunye nomxholo wexesha lokusebenza osele ulungile. Umsebenzi wokuqalisa inkonzo unokujongeka ngolu hlobo:
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]
}apho
Config— uhlobo lwesimo sale nkonzoAddressResolver-Into yexesha lokusebenza ekuvumela ukuba ufumane iidilesi zezinye iindawo (jonga ngezantsi)
kunye nezinye iindidi ezivela kwithala leencwadi cats:
F[_]- uhlobo lwesiphumo (kwimeko elulaF[A]inokuba ngumsebenzi() => A. Kule post siza kusebenzisacats.IO.)Reader[A,B]- ngaphezulu okanye ngaphantsi isithethantonye nomsebenziA => Bcats.Resource- isibonelelo esinokufunyanwa kwaye sikhululweTimer-ixesha (ikuvumela ukuba ulale ixeshana kwaye ulinganise amaxesha ngamaxesha)ContextShift-analogExecutionContextApplicative- iklasi yohlobo lwesiphumo esikuvumela ukuba udibanise iziphumo zomntu ngamnye (phantse i-monad). Kwizicelo ezinzima ngakumbi kubonakala kungcono ukusebenzisaMonad/ConcurrentEffect.
Ukusebenzisa lo tyikityo lomsebenzi sinokuphumeza iinkonzo ezininzi. Umzekelo, inkonzo engenzi nto:
trait ZeroServiceImpl[F[_]] extends ServiceImpl[F] {
type Config <: Any
def resource(...): ResourceReader[F, Config, Unit] =
Reader(_ => Resource.pure[F, Unit](()))
}(I-cm. , apho ezinye iinkonzo ziphunyezwa - ,
и .)
I-node yinto enokuqalisa iinkonzo ezininzi (ukuqaliswa kwekhonkco lezibonelelo kuqinisekiswa yiPhatheni yeCake):
object SingleNodeImpl extends ZeroServiceImpl[IO]
with EchoServiceService
with EchoClientService
with FiniteDurationLifecycleServiceImpl
{
type Config = EchoConfig[String] with EchoClientConfig[String] with FiniteDurationLifecycleConfig
}Nceda uqaphele ukuba sichaza uhlobo oluchanekileyo loqwalaselo olufunekayo kule node. Ukuba siyalibala ukukhankanya enye yeentlobo zoqwalaselo ezifunwa yinkonzo ethile, kuya kubakho impazamo yoqulunqo. Kwakhona, asiyi kukwazi ukuqala i-node ngaphandle kokuba sinikeze into ethile yohlobo olufanelekileyo kunye nayo yonke idatha efunekayo.
Isisombululo Segama Lomamkeli
Ukuqhagamshela kwinginginya ekude, sifuna idilesi yokwenyani ye-IP. Kungenzeka ukuba idilesi iya kwaziwa emva kwexesha kunolunye uqwalaselo. Ke sidinga umsebenzi obonisa i-ID ye-node kwidilesi:
case class NodeAddress[NodeId](host: Uri.Host)
trait AddressResolver[F[_]] {
def resolve[NodeId](nodeId: NodeId): F[NodeAddress[NodeId]]
}Kukho iindlela ezininzi zokuphumeza lo msebenzi:
- Ukuba iidilesi zaziwa kuthi ngaphambi kokuthunyelwa, ngoko sinokwenza ikhowudi yeScala nge
iidilesi kwaye emva koko uqhube ukwakha. Oku kuya kuqulunqa kwaye kuqhube iimvavanyo.
Kule meko, umsebenzi uya kwaziwa ngokwezibalo kwaye unokumelwa kwikhowudi njengemephuMap[NodeId, NodeAddress]. - Kwezinye iimeko, idilesi yangempela iyaziwa kuphela emva kokuba i-node iqalile.
Kule meko, sinokusebenzisa "inkonzo yokufumanisa" ehamba phambi kwamanye ama-nodes kwaye zonke iinqununu ziya kubhalisa kule nkonzo kwaye zicele iidilesi zezinye iindawo. - Ukuba sinokuyilungisa
/etc/hosts, emva koko ungasebenzisa amagama enginginya achazwe kwangaphambili (njengemy-project-main-nodeиecho-backend) kwaye ngokulula uqhagamshelanise la magama
ngeedilesi ze-IP ngexesha lokuthunyelwa.
Kule post asiyi kuqwalasela ezi meko ngokubanzi. Kwethu
kumzekelo wethoyizi, zonke iindawo ziya kuba nedilesi ye-IP efanayo - 127.0.0.1.
Okulandelayo, siqwalasela iinketho ezimbini zenkqubo esasazwayo:
- Ukubeka zonke iinkonzo kwindawo enye.
- Kwaye ukubamba inkonzo ye-echo kunye nomxhasi we-echo kwiindawo ezahlukeneyo.
Uqwalaselo lwe :
Uqwalaselo lwendawo enye
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 iphumeza uqwalaselo lwabo bobabini umxhasi kunye nomncedisi. Ulungelelwaniso lwexesha lokuhlala lukwasetyenziswa ukuze emva kwekhefu lifetime phelisa inkqubo. (I-Ctrl-C iyasebenza kwaye ikhulula zonke izixhobo ngokuchanekileyo.)
Iseti efanayo yoqwalaselo kunye neempawu zokuphunyezwa zingasetyenziselwa ukwenza inkqubo ebandakanya :
Ubumbeko lweendawo ezimbini
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"
}Kubalulekile! Qaphela ukuba iinkonzo zinxulunyaniswa njani. Sicacisa inkonzo ephunyezwe yi-node enye njengokuphunyezwa kwendlela yokuxhomekeka kwenye indawo. Uhlobo lokuxhomekeka lujongwe ngumqokeleli, kuba iqulethe uhlobo lweprotocol. Xa uqhutywa, ukuxhomekeka kuya kuba ne-ID ye-node ekujoliswe kuyo echanekileyo. Enkosi kolu dweliso, sikhankanya inombolo yezibuko kanye kwaye sisoloko siqinisekisiwe ukubhekisa kwizibuko elichanekileyo.
Ukuphunyezwa kweendawo ezimbini zenkqubo
Kolu lungelelwaniso, sisebenzisa ukuphunyezwa kwenkonzo efanayo ngaphandle kotshintsho. Umahluko kuphela kukuba ngoku sinezinto ezimbini ezisebenzisa iiseti ezahlukeneyo zeenkonzo:
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
}Indawo yokuqala iphumeza umncedisi kwaye ifuna kuphela uqwalaselo lomncedisi. I-node yesibini iphumeza umxhasi kwaye isebenzisa indawo eyahlukileyo yoqwalaselo. Kwakhona zombini iindawo zokuhlala zifuna ulawulo lobomi bonke. Indawo yomncedisi iqhuba ngokungenasiphelo ide iyeke SIGTERM'om, kwaye indawo yomxhasi iyayeka emva kwexesha elithile. I-cm. .
Inkqubo yophuhliso ngokubanzi
Makhe sibone ukuba le ndlela yoqwalaselo iyichaphazela njani inkqubo yophuhliso iyonke.
Ubumbeko luya kuhlanganiswa kunye nekhowudi yonke kunye ne-artifact (.jar) iya kuveliswa. Kubonakala kunengqiqo ukubeka uqwalaselo kwi-artifact eyahlukileyo. Oku kungenxa yokuba sinokuba nolungelelwaniso oluninzi olusekwe kwikhowudi enye. Kwakhona, kuyenzeka ukuvelisa ii-artifacts ezihambelana namasebe oqwalaselo ahlukeneyo. Ukuxhomekeka kwiinguqulelo ezithile zamathala eencwadi zigcinwa kunye noqwalaselo, kwaye ezi nguqulelo zigcinwa ngonaphakade nanini na sithatha isigqibo sokusebenzisa olo guqulelo loqwalaselo.
Naluphi na utshintsho loqwalaselo lujika lube lutshintsho lwekhowudi. Kwaye ngoko ke, ngamnye
utshintsho luya kugutyungelwa yinkqubo yesiqhelo yokuqinisekisa umgangatho:
Itikiti kwi-bug tracker -> PR -> uphononongo -> ukudibanisa namasebe afanelekileyo ->
ukudibanisa -> ukuthunyelwa
Iziphumo eziphambili zokuphumeza ulungelelwaniso oluhlanganisiweyo zezi:
Ubumbeko luya kuhambelana kuzo zonke iindawo zenkqubo esasaziweyo. Ngenxa yokuba zonke iindawo zokuhlala zifumana uqwalaselo olufanayo kumthombo omnye.
Kuyingxaki ukutshintsha ubumbeko kwindawo enye kuphela. Ke ngoko, "uqwalaselo lwe-drift" alunakwenzeka.
Kuya kuba nzima ukwenza utshintsho oluncinci lobumbeko.
Uninzi lweenguqu kubumbeko luya kwenzeka njengenxalenye yenkqubo yophuhliso iyonke kwaye iya kujongwa kwakhona.
Ngaba ndifuna indawo yokugcina eyahlukileyo ukugcina ubumbeko lwemveliso? Olu lungelelwaniso lusenokuqulatha amagama ayimfihlo kunye nolunye ulwazi olubuthathaka esingathanda ukunqanda ukufikelela kuzo. Ngokusekelwe koku, kubonakala kunengqiqo ukugcina ulungelelwaniso lokugqibela kwindawo yokugcina eyahlukileyo. Ungahlula ubumbeko lube ngamacandelo amabini-enye iqulathe imimiselo yoqwalaselo olufikelelekayo kunye nenye iqulathe izakhelo ezithintelweyo. Oku kuya kuvumela abaphuhlisi abaninzi ukuba bafikelele kwimimiselo eqhelekileyo. Olu lwahlulo kulula ukufikelela kulo usebenzisa iimpawu eziphakathi eziqulathe amaxabiso angagqibekanga.
Iinguqu ezinokwenzeka
Makhe sizame ukuthelekisa ubumbeko oluhlanganisiweyo kunye nezinye iindlela eziqhelekileyo:
- Ifayile yokubhaliweyo kumatshini ekujoliswe kuwo.
- Ivenkile yexabiso elingundoqo eliphakathi (
etcd/zookeeper). - Amacandelo enkqubo anokuthi aqwalaselwe kwakhona/aqalwe ngokutsha ngaphandle kokuphinda uqalise inkqubo.
- Ukugcinwa kobumbeko ngaphandle kwe-artifact kunye nolawulo loguqulelo.
Iifayile zombhalo zibonelela ngokuguquguquka okubalulekileyo ngokweenguqu ezincinci. Umlawuli wenkqubo unokungena kwi-node ekude, enze utshintsho kwiifayile ezifanelekileyo kwaye uqale kwakhona inkonzo. Kwiinkqubo ezinkulu, nangona kunjalo, ukuguquguquka okunjalo akunakunqweneleka. Utshintsho olwenziwe alushiyi mkhondo kwezinye iinkqubo. Akukho mntu ujonga utshintsho. Kunzima ukufumanisa ukuba ngubani kanye kanye owenze utshintsho kwaye ngasiphi isizathu. Utshintsho aluvavanywa. Ukuba inkqubo isasazwa, ngoko umlawuli unokulibala ukwenza utshintsho oluhambelanayo kwezinye iindawo.
(Kufuneka kwakhona kuqatshelwe ukuba ukusebenzisa uqwalaselo oluhlanganisiweyo aluvali ukwenzeka kokusebenzisa iifayile zokubhaliweyo kwixesha elizayo. Kuyakwanela ukongeza umchazi kunye nesingqinisiso esivelisa uhlobo olufanayo njengemveliso. Config, kwaye ungasebenzisa iifayile zokubhaliweyo. Ilandela ngokukhawuleza ukuba ukuntsonkotha kwenkqubo enoqwalaselo oluhlanganisiweyo kungaphantsi kobunzima benkqubo esebenzisa iifayile zokubhaliweyo, ngokuba. iifayile ezibhaliweyo zifuna ikhowudi eyongezelelweyo.)
Ivenkile engundoqo yexabiso elingundoqo yindlela efanelekileyo yokusasaza imilinganiselo yemeta yesicelo esisasaziweyo. Kufuneka sithathe isigqibo sokuba zeziphi iiparamitha zoqwalaselo kwaye yintoni na idatha. Masibe nomsebenzi C => A => B, kunye neeparamitha C kunqabile utshintsho, kunye nedatha A - rhoqo. Kule meko sinokuthi C - uqwalaselo parameters, kunye A - idatha. Kubonakala ngathi iiparamitha zoqwalaselo ziyahluka kwidatha kuba zitshintsha ngokuqhelekileyo kunedatha. Kwakhona, idatha idla ngokuvela kumthombo omnye (ukusuka kumsebenzisi), kunye neeparamitha zoqwalaselo ukusuka kwenye (ukusuka kumlawuli wenkqubo).
Ukuba kunqabile ukutshintsha iiparameters kufuneka zihlaziywe ngaphandle kokuqalisa kwakhona inkqubo, ke oku kunokukhokelela kwingxaki yenkqubo, kuba kuya kufuneka ngandlela thile sihambise iiparameters, sigcine, sicazulule kwaye sijonge, kwaye siqhube amaxabiso angalunganga. Ngoko ke, ukusuka kwindawo yokunciphisa ubunzima beprogram, kunengqiqo ukunciphisa inani leeparamitha ezinokutshintsha ngexesha lokusebenza kweprogram (okanye ungaxhasi iiparamitha ezinjalo kuzo zonke).
Ngenjongo yesi sithuba, siya kwahlula phakathi kweeparamitha ezimileyo kunye neziguquguqukayo. Ukuba ingqiqo yenkonzo ifuna ukutshintsha iiparitha ngexesha lokusebenza kweprogram, ngoko siya kubiza iiparameters ezinjalo eziguquguqukayo. Kungenjalo iinketho zimile kwaye zingaqwalaselwa kusetyenziswa uqwalaselo oluqokelelweyo. Kuqwalaselo ngokutsha olutshintshatshintshayo, sinokufuna indlela yokuqalisa ngokutsha iinxalenye zenkqubo ngeeparamitha ezintsha, ezifana nendlela iinkqubo zenkqubo yokusebenza ziphinda ziqalwe ngayo. (Ngokombono wethu, kuyacetyiswa ukuba ugweme ukulungiswa kwexesha lokwenyani, ekubeni oku kwandisa ubunzima benkqubo. Ukuba kunokwenzeka, kungcono ukusebenzisa ubuchule be-OS obuqhelekileyo bokuqalisa iinkqubo.)
Umba omnye obalulekileyo wokusebenzisa uqwalaselo olungatshintshiyo olwenza abantu bacinge ngohlengahlengiso oluguquguqukayo lixesha elithathayo ukuze inkqubo iqale ngokutsha emva kohlaziyo loqwalaselo (ixesha lokuphumla). Ngapha koko, ukuba sifuna ukwenza utshintsho kubume be-static, kuya kufuneka siqale ngokutsha inkqubo ukuze amaxabiso amatsha asebenze. Ingxaki yexesha lokuphumla inobunzima obahlukeneyo kwiinkqubo ezahlukeneyo. Kwezinye iimeko, unokucwangcisa ukuqalisa kwakhona ngexesha apho umthwalo uncinci. Ukuba ufuna ukubonelela ngenkonzo eqhubekayo, unokuphumeza . Kwangaxeshanye, xa sifuna ukuqalisa kwakhona inkqubo, siqalisa umzekelo ofanayo wale nkqubo, tshintshela i-balancer kuyo, kwaye ulinde udibaniso oludala ukuba lugqibe. Emva kokuba lonke uxhulumaniso oludala luphelisiwe, sivala umzekelo wakudala wenkqubo.
Ngoku makhe siqwalasele umba wokugcina ulungelelwaniso ngaphakathi okanye ngaphandle kwe-artifact. Ukuba sigcina ukucwangciswa ngaphakathi kwe-artifact, ngoko ke ubuncinci besinethuba lokuqinisekisa ukuchaneka kobumbeko ngexesha lokuhlanganiswa kwe-artifact. Ukuba uqwalaselo lungaphandle kwe-artifact elawulwayo, kunzima ukulandelela ukuba ngubani owenze utshintsho kule fayile kwaye kutheni. Ibaluleke kangakanani? Ngokombono wethu, kwiinkqubo ezininzi zokuvelisa kubalulekile ukuba ube nokucwangciswa okuzinzileyo kunye nomgangatho ophezulu.
Uguqulelo lwe-artifact lukuvumela ukuba uqonde ukuba yenziwa nini, ngawaphi amaxabiso aqulathwe kuwo, yeyiphi imisebenzi eyenziweyo/ekhutshaziweyo, kwaye ngubani onoxanduva lwalo naluphi na utshintsho kuqwalaselo. Ngokuqinisekileyo, ukugcina ulungelelwaniso ngaphakathi kwe-artifact kufuna umgudu othile, ngoko kufuneka wenze isigqibo esinolwazi.
Iinkonzo kunye neengxaki
Ndingathanda ukuhlala kwizinto ezilungileyo kunye neengxaki zobuchwephesha obucetywayo.
iingenelo
Apha ngezantsi kukho uluhlu lweempawu eziphambili zoqwalaselo lwenkqubo ehlanganisiweyo:
- Ukujonga uqwalaselo olungatshintshiyo. Ikuvumela ukuba uqiniseke ukuba
uqwalaselo lulungile. - Ulwimi olutyebileyo loqwalaselo. Ngokuqhelekileyo, ezinye iindlela zoqwalaselo zilinganiselwe kumtya wokutshintshatshintsha kakhulu. Xa usebenzisa iScala, uluhlu olubanzi lweempawu zolwimi ziyafumaneka ukuphucula uqwalaselo lwakho. Umzekelo sinokusebenzisa
iimpawu zamaxabiso angagqibekanga, kusetyenziswa izinto kwiqela le parameters, sinokubhekisa kwiivals ezibhengezwe kanye kuphela (DRY) kumda wokuvala. Ungaqinisekisa naziphi na iiklasi ngqo ngaphakathi kuqwalaselo (Seq,Map, iiklasi zesiko). - DSL. I-Scala inenani leempawu zolwimi ezenza kube lula ukwenza i-DSL. Kuyenzeka ukuba usebenzise ezi mpawu kwaye uphumeze ulwimi loqwalaselo olulungele ngakumbi iqela ekujoliswe kulo labasebenzisi, ukwenzela ukuba uqwalaselo lufundeke ubuncinane ziingcali zesizinda. Iingcali zinokuthi, umzekelo, zithathe inxaxheba kwinkqubo yoqwalaselo loqwalaselo.
- Ukunyaniseka kunye ne-synchrony phakathi kwee-nodes. Enye yeenzuzo zokuba noqwalaselo lwenkqubo yonke esasaziweyo egcinwe kwindawo enye kukuba onke amaxabiso abhengezwa kanye kanye emva koko aphinde asetyenziswe naphi na apho afuneka khona. Ukusebenzisa iindidi ze-phantom ukubhengeza amazibuko kuqinisekisa ukuba iindawo zisebenzisa iiprothokholi ezihambelanayo kuzo zonke izilungiso zenkqubo ezichanekileyo. Ukuba nokuxhomekeka okunyanzelekileyo phakathi kweendawo zokuhlala kuqinisekisa ukuba zonke iinkonzo zixhunyiwe.
- Iinguqu ezikumgangatho ophezulu. Ukwenza utshintsho kuqwalaselo usebenzisa inkqubo yophuhliso eqhelekileyo yenza kube lula ukufezekisa imigangatho yomgangatho ophezulu woqwalaselo ngokunjalo.
- Uhlaziyo loqwalaselo ngaxeshanye. Ukusasazwa kwenkqubo ngokuzenzekelayo emva kotshintsho loqwalaselo kuqinisekisa ukuba zonke iindawo zisexesheni.
- Ukwenza lula isicelo. Usetyenziso aludingi ukwahlula, uqwalaselo loqwalaselo, okanye ukuphatha amaxabiso angachanekanga. Oku kunciphisa ukuntsonkotha kwesicelo. (Olunye uqwalaselo oluntsonkothileyo oluqatshelwe kumzekelo wethu alulophawu loqwalaselo oluqokelelweyo, kodwa sisigqibo esinengqiqo kuphela esiqhutywa ngumnqweno wokubonelela ngokhuseleko lohlobo olukhulu.) Kulula kakhulu ukubuyela kuqwalaselo lwesiqhelo - phumeza nje okulahlekileyo. iinxalenye. Ngoko ke, unokwenza, umzekelo, uqale ngolungelelwaniso oluhlanganisiweyo, uhlehlisa ukuphunyezwa kweendawo ezingeyomfuneko kude kube lixesha apho kufuneka ngokwenene.
- Ubumbeko oluqinisekisiweyo. Ukusukela ukuba utshintsho loqwalaselo lulandela isiphelo sesiqhelo salo naluphi na olunye utshintsho, imveliso esiyifumanayo yi-artifact enenguqulelo eyodwa. Oku kusivumela, umzekelo, ukuba sibuyele kuguqulelo lwangaphambili loqwalaselo ukuba kuyimfuneko. Sinokusebenzisa ulungelelwaniso ukusuka kunyaka ophelileyo kwaye inkqubo iya kusebenza ngokufanayo. Ukucwangciswa okuzinzileyo kuphucula ukuqikelelwa kunye nokuthembeka kwenkqubo esasazwayo. Kuba uqwalaselo lulungisiwe kwinqanaba lokuqulunqa, kunzima kakhulu ukulifaka kwimveliso.
- Ukumodareyitha. Isakhelo esicetywayo siyimodyuli kwaye iimodyuli zinokudibaniswa ngeendlela ezahlukeneyo zokwenza iinkqubo ezahlukeneyo. Ngokukodwa, ungaqwalasela inkqubo ukuba isebenze kwindawo enye kumfanekiso omnye, nakwiindawo ezininzi kwiindawo ezininzi kwenye. Unokwenza ulungelelwaniso oluninzi lwemizekelo yemveliso yenkqubo.
- Uvavanyo. Ngokutshintsha iinkonzo zomntu ngamnye ngezinto ezihlekisayo, unokufumana iinguqulelo ezininzi zenkqubo ezilungele ukuvavanywa.
- Uvavanyo lokudibanisa. Ukuba noqwalaselo olulodwa lwenkqubo yonke esasazwayo yenza kube lula ukuqhuba onke amacandelo kwindawo elawulwayo njengenxalenye yovavanyo lokudibanisa. Kulula ukulinganisa, umzekelo, imeko apho ezinye iindawo zifikeleleka.
Ukungalungi kunye nokulinganiselwa
Ubumbeko oluhlanganisiweyo luyohluka kwezinye iindlela zoqwalaselo kwaye lusenokungalungeli usetyenziso oluthile. Ngezantsi kukho izinto ezingeloncedo:
- Ubumbeko oluzinzileyo. Ngamanye amaxesha kufuneka ulungise ngokukhawuleza ulungelelwaniso kwimveliso, udlula zonke iindlela zokukhusela. Ngale ndlela kunokuba nzima ngakumbi. Ubuncinci, ukuhlanganiswa kunye nokuthunyelwa ngokuzenzekelayo kuya kufuneka. Oku kokubini kuluphawu oluluncedo lwendlela yokusebenza kunye nokungalungi kwezinye iimeko.
- Ukwenziwa koqwalaselo. Kwimeko apho ifayile yoqwalaselo yenziwe ngesixhobo esizenzekelayo, iinzame ezongezelelweyo zinokufuneka ukudibanisa iskripthi sokwakha.
- Izixhobo. Okwangoku, izinto eziluncedo kunye nobuchule obulungiselelwe ukusebenza ngoqwalaselo lusekwe kwiifayile ezibhaliweyo. Ayizizo zonke izinto eziluncedo/ubuchule eziya kufumaneka kuqwalaselo oluhlanganisiweyo.
- Utshintsho kwisimo sengqondo luyafuneka. Abaphuhlisi kunye ne-DevOps bajwayele iifayile ezibhaliweyo. Ingcamango yokuqulunqa uqwalaselo inokuba yinto engalindelekanga kwaye ingaqhelekanga kwaye ibangele ukwaliwa.
- Inkqubo yophuhliso ekumgangatho ophezulu iyafuneka. Ukuze usebenzise ngokukhululekileyo ukucwangciswa okuhlanganisiweyo, i-automation epheleleyo yenkqubo yokwakha kunye nokuthunyelwa kwesicelo (CI / CD) kuyimfuneko. Ngaphandle koko kuya kuba nzima kakhulu.
Masiphinde sihlale kwinani lemida yomzekelo oqwalaselwayo ongahambelani nombono woqwalaselo oluhlanganisiweyo:
- Ukuba sinikezela ngolwazi olungadingekile lokucwangciswa olungasetyenziswanga yi-node, ngoko umqambi akayi kusinceda ukuba sibone ukuphunyezwa okungekho. Le ngxaki ingasonjululwa ngokushiya iPatheni yeCake kunye nokusebenzisa iintlobo eziqinileyo, umzekelo,
HListokanye iindidi zedatha yealgebra (iiklasi zemeko) ukumela uqwalaselo. - Kukho imigca kwifayile yoqwalaselo enganxulumananga noqwalaselo ngokwalo: (
package,import,izibhengezo zento;override def's yeparameters ezinamaxabiso angagqibekanga). Oku kunokuphetshwa ukuba usebenzisa eyakho iDSL. Ukongeza, ezinye iintlobo zoqwalaselo (umzekelo, i-XML) zikwabeka izithintelo ezithile kwisakhiwo sefayile. - Ngenjongo yesi sithuba, asiqwalaselanga uhlengahlengiso oluguquguqukayo lweqela leendawo ezifanayo.
isiphelo
Kule post, siye saphonononga umbono wokumela uqwalaselo kwikhowudi yomthombo sisebenzisa ubuchule obuphambili benkqubo yohlobo lweScala. Le ndlela ingasetyenziswa kwizicelo ezahlukeneyo njengotshintsho lweendlela zoqwalaselo zemveli ezisekwe kwi xml okanye iifayile ezibhaliweyo. Nangona umzekelo wethu uphunyeziwe kwi-Scala, iingcamango ezifanayo zinokugqithiselwa kwezinye iilwimi ezihlanganisiweyo (ezifana neKotlin, C #, Swift, ...). Unokuzama le ndlela kwenye yeeprojekthi ezilandelayo, kwaye, ukuba ayisebenzi, qhubela phambili kwifayile yokubhaliweyo, ukongeza iindawo ezingekhoyo.
Ngokwendalo, ubumbeko oluhlanganisiweyo lufuna inkqubo yophuhliso lomgangatho ophezulu. Ukubuyisela, umgangatho ophezulu kunye nokuthembeka kobumbeko kuqinisekiswa.
Indlela eqwalaselweyo inokwandiswa:
- Unokusebenzisa iimacros ukwenza ukuqokelela ixesha lokujonga.
- Unokuphumeza i-DSL ukubonisa uqwalaselo ngendlela efikelelekayo kubasebenzisi bokugqibela.
- Unokuphumeza ulawulo lwezixhobo eziguquguqukayo ngolungelelwaniso loqwalaselo oluzenzekelayo. Umzekelo, ukutshintsha inani leendibano kwiqela kufuna ukuba (1) indawo nganye ifumane ubumbeko olwahluke kancinane; (2) Umphathi weqela ufumene ulwazi malunga neendibano ezintsha.
Imibulelo
Ndingathanda ukubulela u-Andrei Saksonov, uPavel Popov kunye no-Anton Nekhaev ngokugxeka kwabo okwakhayo kwinqaku eliyidrafti.
umthombo: www.habr.com
