Habaynta la isku duba ridey ee nidaamka la qaybiyey

Maqaalkan waxaan jeclaan lahayn inaan wadaagno hab xiiso leh oo wax looga qabto qaabeynta nidaamka la qaybiyay.
Habayntu si toos ah ayaa loogu matalay luqadda Scala oo ah hab nabdoon. Tusaale fulinta waxaa lagu sifeeyay tafaasiil. Dhinacyo kala duwan oo soo jeedinta ah ayaa laga wada hadlay, oo ay ku jiraan saamaynta habka guud ee horumarka.

Habaynta la isku duba ridey ee nidaamka la qaybiyey

(afka Ruushka)

Hordhac

Dhisidda habab qaybsan oo adag waxay u baahan tahay isticmaalka habayn sax ah oo isku xidhan dhammaan qanjidhada. Xalka caadiga ah waa in la isticmaalo sharraxaadda geynta qoraalka ah (terraform, macquul ama wax la mid ah) oo si toos ah loo soo saaray faylalka qaabeynta (badanaa - u heellan node/door kasta). Waxaan sidoo kale rabnaa inaan isticmaalno borotokool isku mid ah noocyada isku midka ah ee noodhka isgaarsiinta (haddii kale waxaan la kulmi doonnaa arrimo is-waafajin la'aan). Dunida JVM tani waxay ka dhigan tahay in ugu yaraan maktabadda fariintu ay noqoto mid la mid ah dhammaan noodhadhka isgaarsiinta.

Ka waran tijaabinta nidaamka? Dabcan, waa in aan yeelanaa imtixaanada unugga ee dhammaan qaybaha ka hor inta aan la imaan imtixaanada la qabsiga. Si aan u awoodno in aan ka saarno natiijada imtixaanka wakhtiga runtime, waa in aan hubinno in noocyada maktabadaha oo dhan lagu hayo isku mid ah labadaba runtime iyo jawiyada tijaabada.

Marka la wado imtixaanada isdhexgalka, inta badan aad bay u fududahay in la helo wadadii fasalka oo dhan oo dhan. Waxaan u baahanahay oo kaliya inaan hubinno in isla wadadii fasalka loo isticmaalay meelaynta. (Waa suurtagal in la isticmaalo dariiqyada fasallada kala duwan ee qanjidhada kala duwan, laakiin way adag tahay in la matalo qaabeyntan oo si sax ah loo geeyo.) Markaa si aan wax u fududeyno waxaan kaliya tixgelin doonaa dariiqyada isku midka ah ee dhammaan noodaha.

Habayntu waxa ay u janjeertaa in ay la soo baxdo software-ka. Waxaan badiyaa isticmaalnaa noocyo si aan u aqoonsanno noocyo kala duwan
marxaladaha horumarinta software. Waxay u muuqataa mid caqli gal ah in la daboolo qaabeynta hoos timaada maareynta nooca oo la aqoonsado qaabab kala duwan oo leh calaamado. Haddii uu jiro hal qaab oo wax soo saar ah, waxa laga yaabaa in aan u isticmaalno hal nooc aqoonsi ahaan. Mararka qaarkood waxaa laga yaabaa in aan yeelano bey'ad wax soo saar oo badan. Deegaan walbana waxaa laga yaabaa inaan u baahanno laan gaar ah oo qaabeynta. Markaa qaabaynta ayaa laga yaabaa in lagu calaamadiyo laan iyo nooca si si gaar ah loo aqoonsado isku xidhka kala duwan. Calaamad kasta iyo nooc kastaa waxay u dhigantaa hal iskudar oo ah noodhka la qaybiyey, dekedo, agabka dibadda, noocyada maktabadda fasalka ee nood kasta. Halkan waxaan ku dabooli doonaa kaliya laanta kaliya oo aan ku aqoonsan doonaa qaabeynta saddex qaybood oo jajab tobanle ah (1.2.3), si la mid ah farshaxanada kale.

Deegaannada casriga ah, faylka qaabeynta gacanta laguma beddelo hadda. Sida caadiga ah waxaan dhalin
config files wakhtiga geynta iyo waligaa ha taaban iyaga ka dib. Markaa mid ayaa ku weydiin kara sababta aan weli u isticmaalno qaabka qoraalka faylasha qaabeynta? Ikhtiyaarka suurtagalka ah waa in la geliyo qaabaynta gudaha unugga isku-dubbaridka oo laga faa'iidaysto ansaxinta qaabaynta wakhtiga-ururinta.

Maqaalkan waxaan ku baari doonaa fikradda ilaalinta qaabeynta ee artifact la soo ururiyey.

Qaabaynta la isku duba rido

Qaybtan waxaan kaga hadli doonaa tusaale qaabaynta taagan. Laba adeeg oo fudud - adeegga echo iyo macmiilka adeegga echo ayaa la habeeyey oo la hirgeliyey. Kadibna laba nidaam oo kala duwan oo loo qaybiyey labada adeegba waa la soo toosiyaa. Mid waxaa loogu talagalay qaabeynta hal noode ah iyo mid kale oo loogu talagalay qaabeynta labada noodes.

Nidaamka caadiga ah ee la qaybiyey wuxuu ka kooban yahay dhowr nood. Nudaha waxaa lagu aqoonsan karaa nooc ka mid ah:

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

ama kaliya

case class NodeId(hostName: String)

ama xataa

object Singleton
type NodeId = Singleton.type

Nodes-yadani waxay qabtaan doorar kala duwan, waxay qabtaan adeegyada qaarkood waana inay awoodaan inay la xiriiraan qanjidhada kale iyagoo adeegsanaya isku xirka TCP/HTTP.

Xiriirinta TCP ugu yaraan waxaa loo baahan yahay nambar deked ah. Waxaan sidoo kale rabnaa inaan hubinno in macmiilka iyo server-ka ay ku hadlayaan borotokool isku mid ah. Si aan u qaabaynno xidhiidhka ka dhexeeya noodhka aynu ku dhawaaqno fasalka soo socda:

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

halkaas oo Port waa uun Int gudaha xadka la ogol yahay:

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

Noocyada la safeeyey

Eeg la safeeyey maktabad. Marka la soo koobo, waxay u oggolaaneysaa in lagu daro xaddidaadaha waqtiga ee noocyada kale. Kiiskan Int waxa kaliya oo loo ogol yahay in uu leeyahay 16-bit qiyamka oo matali kara lambarka dekedda. Ma jirto wax shuruud ah in loo isticmaalo maktabaddan habkan qaabaynta. Waxa ay u muuqataa in ay aad ugu habboon tahay.

HTTP (REST) ​​waxa laga yaabaa in aanu sidoo kale u baahno dariiqa adeega:

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

Nooca Phantom

Si loo aqoonsado borotokoolka inta lagu guda jiro ururinta waxaan isticmaaleynaa astaanta Scala ee cadeynta nooca doodda Protocol taas oo aan loo isticmaalin fasalka. Waa wax la yiraahdo nooca faalka. Wakhtiga runtime si dhif ah ayaan ugu baahanahay tusaale ah aqoonsiga borotokoolka, waana sababta aan u kaydin waynay. Inta lagu guda jiro isku-dubarid noocan oo kale ah nooca fannaanku wuxuu siinayaa badbaado nooca dheeraad ah. Ma ku dhaafi karno dekedda oo leh borotokool khaldan.

Mid ka mid ah borotokoollada aadka loo isticmaalo waa REST API oo leh taxane Json:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

halkaas oo RequestMessage waa nooca aasaasiga ah ee fariimaha uu macmiilku u diri karo server iyo ResponseMessage waa fariinta jawaabta ee server-ka. Dabcan, waxaa laga yaabaa inaan abuurno tilmaamo hab-maamuusyo kale oo qeexaya hab-maamuuska isgaarsiinta oo leh saxnaanta la rabo.

Ujeedooyinka qoraalkan waxaan u isticmaali doonaa qaab ka fudud hab-maamuuska:

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

Borotokoolkan fariinta codsiga waxa lagu lifaaqaa url fariinta jawaabtana waxa loo soo celiyaa sidii xadhig cad.

Qaabaynta adeegga waxa lagu sifayn karaa magaca adeega, ururinta dekedaha iyo qaar ku tiirsanaanta. Waxaa jira dhowr siyaabood oo suurtagal ah oo lagu matali karo dhammaan walxahan Scala (tusaale ahaan, HList, noocyada xogta aljabrada). Ujeedooyinka qoraalkan waxaan u isticmaali doonaa Habka Keega oo waxaan u matali doonaa qaybo la isku dari karo (modules) sifooyin ahaan. (Qaabka Keega ah shuruud uma aha habkan qaabaynta la isku duba ridi karo. Waa mid ka mid ah hirgelinta fikradda.)

Ku-tiirsanaanta waxaa lagu matali karaa iyadoo la isticmaalayo Habka Keega oo ah dhammaadka qanjidhada kale:

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

Adeegga Echo wuxuu kaliya u baahan yahay deked habaysan. Waxaanan caddaynaynaa in dekeddani ay taageerto borotokoolka dhawaaqa. Ogsoonow in aanan u baahnayn in aan qeexno deked gaar ah xilligan, sababtoo ah dabeecadda waxay ogolaataa hababka aan la taaban karin. Haddi aan isticmaalno hababka aan la taaban karin, compiler wuxuu u baahan doonaa hirgelinta tusaale qaabeynta. Halkan waxaan ku bixinay fulinta (8081) waxaana loo isticmaali doonaa sida qiimaha caadiga ah haddii aan ku dhaafno qaabeynta la taaban karo.

Waxaan ku dhawaaqi karnaa ku tiirsanaanta qaabeynta macmiilka adeegga echo:

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

Ku-tiirsanaanta waxay leedahay nooc la mid ah kan echoService. Gaar ahaan, waxay u baahan tahay hab-raac isku mid ah. Sidaa darteed, waxaan hubin karnaa in haddii aan isku xirno labadan ku-tiirsanaanta inay si sax ah u shaqeyn doonaan.

Fulinta adeegyada

Adeeggu wuxuu u baahan yahay shaqo si uu u bilaabo oo si qurux badan loo xiro. (Awoodda xidhidhiyaha adeega aad bay muhiim ugu tahay tijaabinta Boostada waxaan u isticmaali doonaa Habka Keega mar kale. Waxaan matali karnaa adeeg anagoo adeegsanayna cats.Resource kaas oo horeba u siiya xidhidhiyaha iyo sii daynta khayraadka. Si aan u helno kheyraad waa in aan bixinaa qaabeynta iyo xoogaa runtime ah. Markaa shaqada bilawga adeeggu waxay u ekaan kartaa:

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

halkaas oo

  • Config - nooca qaabeynta ee looga baahan yahay adeeg-billowga
  • AddressResolver - walax runtime ah oo awood u leh inuu helo ciwaannada dhabta ah ee noodyada kale (sii akhri faahfaahinta).

noocyada kale waxay ka yimaadaan cats:

  • F[_] - nooca saamaynta (Xaaladda ugu fudud F[A] waxay noqon kartaa cadaalad () => A. Qoraalkan waxaan ku isticmaali doonaa cats.IO.)
  • Reader[A,B] - waa ka badan ama ka yar oo la mid ah hawl A => B
  • cats.Resource - waxay leedahay habab lagu helo oo lagu sii daayo
  • Timer - waxay ogolaataa in la seexdo/cabbirto wakhtiga
  • ContextShift - analoogga ah ExecutionContext
  • Applicative - Duubista hawlaha waxtarka leh (ku dhawaad ​​​​monad) (waxaa laga yaabaa inaan ugu dambeyntii ku beddelno shay kale)

Isticmaalka interface-kan waxaan hirgelin karnaa dhowr adeegyo. Tusaale ahaan, adeeg aan waxba qaban:

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

(Eeg Koodhka fulinta adeegyada kale - adeegga echo,
echo macmiilka iyo kantaroolayaasha nolosha.)

Noodku waa shay keliya oo wada dhawr adeeg (bilawga silsiladda agabka waxa awood u leh Habka Keega):

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

Ogsoonow in noode-ka aan ku qeexeyno nooca saxda ah ee qaabeynta ee loo baahan yahay noodhkan. Isku-dubariduhu ma oggolaan doono inaan ku dhisno shayga (Keega) nooc aan ku filnayn, sababtoo ah sifo kasta oo adeeg ayaa caddaynaysa xannibaad Config nooca. Sidoo kale ma awoodi doono inaan bilowno noodhka anagoon bixinayn qaabayn dhamaystiran.

Xallinta ciwaanka node

Si loo sameeyo xiriir waxaan u baahanahay ciwaanka martigeliyaha dhabta ah ee nood kasta. Waxaa laga yaabaa in gadaal laga ogaado qaybaha kale ee qaabeynta. Sidaa darteed, waxaan u baahanahay hab lagu bixiyo khariidad ka dhexeeya node id iyo ciwaanka dhabta ah. Khariidayntani waa shaqo:

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

Waxaa jira dhowr siyaabood oo suurtagal ah oo lagu hirgelin karo shaqadan.

  1. Haddii aan ogaano ciwaannada dhabta ah ka hor inta aan la dirin, inta lagu guda jiro soo-dhoweynta martigeliyaha node-ka, markaa waxaan soo saari karnaa koodka Scala oo leh ciwaannada dhabta ah oo aan wadno dhisitaanka ka dib (kaas oo sameeya hubinta wakhtiga ka dibna wuxuu wadaa imtixaanka isdhexgalka). Xaaladdan oo kale shaqadayada khariidadeynta ayaa loo yaqaan si toos ah waxaana loo fududayn karaa wax sida a Map[NodeId, NodeAddress].
  2. Mararka qaarkood waxaan helnaa ciwaanno dhab ah mar dambe marka qanjirada dhabta ah la bilaabo, ama ma hayno ciwaanno nood ah oo aan weli la bilaabin. Xaaladdan oo kale waxa laga yaabaa in aan haysano adeeg daahfur oo la bilaabay ka hor dhammaan qanjidhada kale oo nood kastaa waxa laga yaabaa in uu xayeysiiyo ciwaanka adeeggaas oo uu rukunsado ku-tiirsanaanta.
  3. Haddii aan wax ka beddeli karno /etc/hosts, waxaan isticmaali karnaa magacyada martida loo sii qeexay (sida my-project-main-node iyo echo-backend) oo kaliya ku xidh magacan iyo ciwaanka ip wakhtiga dirista.

Qoraalkan kuma soo hadal qaadin kiisaskan si faahfaahsan. Dhab ahaantii tusaalahayaga toy-ga dhammaan noodhadhku waxay yeelan doonaan cinwaan IP isku mid ah - 127.0.0.1.

Maqaalkan waxaan ku eegi doonaa laba qaab oo habaysan oo la qaybiyey:

  1. Naqshad hal unug ah, halkaas oo dhammaan adeegyadu la dulsaaran yihiin hal unug.
  2. Laba qaabayn oo nood ah, halkaas oo adeegga iyo macmiilku ay ku yaalliin noodo kala duwan.

Qaabeynta a hal dufan qaabeynta waa sida soo socota:

Qaabeynta noodhka kali ah

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

Halkan waxaan ku abuureynaa hal qaabeyn oo fidisa labada server iyo qaabeynta macmiilka. Sidoo kale waxaanu habaynaynaa kontaroolaha meertada nolosha kaas oo sida caadiga ah joojin doona macmiilka iyo adeegaha kadib lifetime dhexda dhaafo.

Isku mid ah hirgelinta adeegyada iyo isku xidhka ayaa loo isticmaali karaa si loo abuuro qaabaynta nidaamka oo leh laba nood oo kala duwan. Waxaan u baahanahay kaliya inaan abuurno laba habayn nooda kala duwan leh adeegyada ku habboon:

Laba habayn

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

Eeg sida aan u qeexno ku-tiirsanaanta. Waxaan u xusnaa adeega noodhka kale ee la bixiyay sida ku tiirsanaanta noodhka hadda jira. Nooca ku-tiirsanaanta waa la hubiyaa sababtoo ah waxay ka kooban tahay nooca phantom ee qeexaya borotokoolka. Oo wakhtiga runtime waxaan heli doonaa id node saxda ah. Tani waa mid ka mid ah dhinacyada muhiimka ah ee habka qaabeynta la soo jeediyay. Waxay na siinaysaa awood aan ku dejinno hal mar oo keliya oo hubiso inaan tixraaceyno dekedda saxda ah.

Hirgelinta laba nood

Qaabeyntan waxaan u isticmaalnaa si sax ah adeegyo isku mid ah hirgelinta. Wax isbedel ah ma jiraan haba yaraatee. Si kastaba ha ahaatee, waxaanu abuurnaa laba hirgelin oo kala duwan oo ka kooban adeegyo kala duwan:

  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
  }

Noodka kowaad wuxuu fuliyaa server-ka wuxuuna kaliya u baahan yahay habaynta dhinaca serverka. Noodka labaad wuxuu hirgeliyaa macmiilka wuxuuna u baahan yahay qayb kale oo habayn ah. Labada noodh waxay u baahan yihiin qeexid nololeed. Ujeedooyinka noodhka adeega boostada awgeed waxay yeelan doontaa nolol aan dhammaad lahayn oo la joojin karo iyadoo la isticmaalayo SIGTERM, halka echo macmiilka uu joojin doono ka dib marka la habeeyey muddada xaddidan. Eeg codsiga bilowga ah wixii faahfaahin ah.

Habka horumarinta guud

Aynu aragno sida habkani u beddelo habka aanu ugu shaqayno qaabaynta.

Qaabaynta kood ahaan waa la ururin doonaa oo soo saari doonaa farshaxan. Waxay u muuqataa wax macquul ah in la kala saaro qaabeynta artifacts iyo artifact code kale. Badanaa waxaan ku yeelan karnaa qaabayn tiro badan oo isla kood ah. Dabcan, waxaan yeelan karnaa noocyo badan oo laamo qaabeyn oo kala duwan. Qaabaynta waxaanu dooran karnaa noocyo gaar ah oo maktabado ah tanina waxay ahaanaysaa mid joogto ah mar kasta oo aanu geyno qaabayntan.

Isbeddel qaabayntu waxa uu noqdaa beddelka koodka. Markaa waa in lagu daboolaa isla habka hubinta tayada:

Tigidh -> PR -> dib u eegis -> isku-dhafka -> is-dhexgalka joogtada ah -> hawlgelinta joogtada ah

Waxaa jira cawaaqibyada soo socda ee habka:

  1. Habayntu waa mid isku xidhan tusaale ahaan nidaam gaar ah. Waxa ay u muuqataa in aanay jirin hab xidhiidh khaldan oo u dhexeeya noodhka.
  2. Ma fududa in la beddelo qaabaynta hal nood oo keliya. Waxay u muuqataa wax aan macquul ahayn in la galo oo la beddelo qaar ka mid ah faylasha qoraalka. Markaa qaabaynta qaabaynta ayaa noqonaysa mid aan suurtogal ahayn.
  3. Isbeddellada qaabeynta yaryar ma fududa in la sameeyo.
  4. Inta badan isbeddelada qaabeynta waxay raaci doonaan isla habka horumarinta, waxayna gudbi doontaa xoogaa dib u eegis ah.

Ma waxaan u baahanahay kayd gooni ah oo loogu talagalay qaabeynta wax soo saarka? Qaabaynta wax soo saarka ayaa laga yaabaa inay ku jirto macluumaad xasaasi ah oo aanu jeclaan lahayn inaan ka ilaalino inay dad badani gaadhaan. Markaa waxa laga yaabaa inay mudan tahay in la hayo kayd gooni ah oo leh marin xaddidan oo ka koobnaan doona qaabaynta wax soo saarka. Waxaa laga yaabaa in aan u kala qaybinno qaabeynta laba qaybood - mid ka kooban xuduudaha ugu furan ee wax soo saarka iyo mid ka kooban qaybta qarsoodiga ah ee qaabeynta. Tani waxay awood u siinaysaa soo-saareyaasha inteeda badan inay helaan cabbirrada ugu badan iyadoo xaddidaysa gelitaanka waxyaabaha xasaasiga ah. Way fududahay in tan lagu dhammeeyo iyada oo la adeegsanayo sifooyin dhexdhexaad ah oo leh qiyamka cabbirka caadiga ah.

Isbadalka

Aynu aragno faa'iidooyinka iyo khasaarooyinka habka la soo jeediyay marka la barbar dhigo farsamooyinka kale ee maareynta qaabeynta.

Ugu horeyn, waxaanu liis gareyn doonaa dhowr siyaabood oo lagu bedeli karo dhinacyada kala duwan ee habka la soo jeediyay ee wax ka qabashada qaabeynta:

  1. Faylka qoraalka ee mashiinka bartilmaameedka.
  2. Kaydinta qiimaha dhexe ee dhexe (sida etcd/zookeeper).
  3. Qaybaha hab-hoosaadyada dib loo habayn karo/dib u bilaabi karo iyada oo aan dib loo bilaabin hawsha.
  4. Habaynta ka baxsan farshaxanimada iyo xakamaynta nooca.

Faylka qoraalka waxa uu siinayaa xoogaa dabacsanaan ah marka la eego hagaajinta ad-hoc. Maamulaha nidaamku waxa uu geli karaa noodhka bartilmaameedka ah, samayn karaa isbeddel oo si fudud dib ayuu u bilaabi karaa adeegga. Tani waxaa laga yaabaa inaysan u fiicnayn nidaamyada waaweyn. Wax raad ah oo ka dambeeya isbeddelka ma jiro. Isbeddelka laguma eego laba indhood oo kale. Way adkaan kartaa in la ogaado waxa keenay isbeddelka. Lama tijaabin. Marka laga eego aragtida nidaamka qaybsan maamuluhu wuxuu si fudud u ilaawi karaa inuu cusboonaysiiyo qaabaynta mid ka mid ah noodhka kale.

(Btw, haddii aakhirka ay jiri doonto baahi loo qabo in la bilaabo adeegsiga faylalka habaynta qoraalka, kaliya waa inaan ku darnaa parser + saxiyaha soo saari kara isla isla Config ku qor taasina waxay ku filnaan doontaa inaad bilowdo isticmaalka habaynta qoraalka. Tani waxay sidoo kale muujineysaa in kakanaanta qaabeynta-waqtiga-isku-darka ay wax yar ka yar tahay kakanaanta qaab-dhismeedka qoraalka ku saleysan, sababtoo ah nooca qoraalka ku saleysan waxaan u baahanahay kood dheeri ah.)

Kaydinta qiimaha dhexe ee dhexe waa hab wanaagsan oo lagu qaybiyo cabbiraadaha meta ee codsiga. Halkan waxaan u baahanahay inaan ka fikirno waxa aan u aragno inay yihiin qiyamka qaabeynta iyo waxa kaliya ee xogta ah. Siiyay shaqo C => A => B sida caadiga ah waxaan u yeernaa si dhif ah qiimaha isbeddelka C "qaabaynta", iyadoo inta badan la beddelo xogta A - kaliya geli xogta. Habayntu waa in la siiyaa shaqada ka hor inta aan xogta la bixin A. Marka la eego fikradan waxaan dhihi karnaa in la filayo inta jeer ee isbeddelada waxa loo isticmaali karo in lagu kala saaro xogta qaabeynta iyo xogta kaliya. Sidoo kale xogtu waxay caadi ahaan ka timaadaa hal il (isticmaal) iyo qaabayntu waxay ka timaadaa ilo kale (admin). Wax ka qabashada xuduudaha la bedeli karo ka dib habka bilowga ah waxay keenaysaa korodhka kakanaanta codsiga. Qiyaasaha noocaan ah waa inaan u qabanaa habka gaarsiinta, kala saarista iyo ansixinta, maaraynta qiyamka khaldan. Sidaa darteed, si loo dhimo kakanaanta barnaamijka, waxaan si fiican u dhimi lahayn tirada cabbiraadaha bedeli kara wakhtiga runtime (ama xitaa meesha laga saaro gabi ahaanba).

Marka laga eego dhinaca qoraalkan waa in aan kala saarno cabbirada taagan iyo kuwa firfircoon. Haddii macquulka adeeggu uu u baahan yahay isbeddel naadir ah oo ah cabbirrada qaar wakhtiga runtime, markaa waxa laga yaabaa inaan ugu yeerno cabbirro firfircoon. Haddii kale way taagan yihiin waxaana lagu habayn karaa iyadoo la isticmaalayo habka la soo jeediyay. Dib-u-habayn firfircooni leh ayaa laga yaabaa in loo baahdo habab kale. Tusaale ahaan, qaybo ka mid ah nidaamka waxa laga yaabaa in dib loo bilaabo iyada oo la raacayo cabbirada qaabaynta cusub si la mid ah in dib loo bilaabo hababka kala duwan ee nidaamka qaybsan.
(Fikradayda hoose waa in laga fogaado dib u habeynta runtime sababtoo ah waxay kordhisaa kakanaanta nidaamka.
Waxa laga yaabaa inay si toos ah u fududaato in kaliya lagu tiirsado taageerada OS ee hababka dib u bilaabista. In kastoo, laga yaabaa inaanay had iyo jeer suurtogal ahayn.)

Mid ka mid ah dhinac muhiim ah oo ku saabsan isticmaalka qaabeynta static oo mararka qaarkood dadka ka dhigaysa inay tixgeliyaan qaabeynta firfircoon (sababo kale la'aanteed) waa wakhtiga hoos u dhaca adeegga inta lagu jiro cusboonaysiinta qaabeynta. Runtii, haddii ay tahay inaan isbedel ku samayno qaabeynta taagan, waa inaan dib u bilownaa nidaamka si qiyamka cusub uu u noqdo mid waxtar leh. Shuruudaha wakhtiga dhimista way ku kala duwan yihiin nidaamyo kala duwan, markaa waxaa laga yaabaa inaanay sidaa u sii darnayn. Haddii ay muhiim tahay, markaa waa inaan horay u sii qorsheynaa nidaam kasta oo dib u bilaabo. Tusaale ahaan, waanu fulin karnaa Xidhiidhka AWS ELB oo dareeraya. Xaaladdan mar kasta oo aan u baahanahay inaan dib u bilowno nidaamka, waxaan bilownaa tusaale cusub oo nidaamka isbarbar socda, ka dib ELB u beddelo, annagoo u oggolaanayna nidaamkii hore inuu dhammaystiro adeegga isku xirka jira.

Ka waran ku haynta qaabaynta gudaha artifact-ka la nacay ama dibadda? Ku haynta qaabaynta gudaha artifact macnaheedu waxa weeye inta badan kiisaska in qaabayntani ka gudubtay habka hubinta tayada la mid ah kuwa kale ee artifacts. Markaa mid ayaa laga yaabaa inuu hubiyo in qaabayntu ay tahay mid tayo wanaagsan oo la aamini karo. Qaabaynta lidka ku ah fayl gaar ah waxay la macno tahay in aanay jirin wax raad ah oo ku saabsan cidda iyo sababta ay isbeddel ugu sameeyeen faylkaas. Tani ma muhiim baa? Waxaan aaminsanahay in nidaamyada wax soo saarka intooda badan ay u fiican tahay in la helo qaabeyn deggan oo tayo sare leh.

Nooca artifact wuxuu ogolaanayaa in la ogaado marka la abuuray, waxa qiyamka ku jira, waxa sifooyinka karti / naafada, kuwaas oo mas'uul ka ahaa samaynta isbedel kasta ee qaabeynta. Waxa laga yaabaa inay u baahato xoogaa dadaal ah si ay u ilaaliso qaabaynta gudaha artifact waana doorashada naqshadaynta in la sameeyo.

Faa'iidooyinka & khasaaraha

Halkan waxaan rabnaa inaan ku muujinno faa'iidooyinka qaar oo aan ka wada hadalno qaar ka mid ah faa'iido darrada habka la soo jeediyay.

Faa'iidada

Astaamaha qaabaynta la isku duba ridey ee nidaamka la qaybiyey oo dhamaystiran:

  1. Hubinta qaabeynta joogtada ah. Tani waxay ku siinaysaa kalsooni heer sare ah, in qaabeynta ay sax tahay xaddidaadaha nooca.
  2. Luuqad qani ah oo qaabaynta Caadi ahaan hababka qaabaynta kale waxay ku kooban yihiin beddelka isbeddelka badan.
    Isticmaalka Scala mid wuxuu isticmaali karaa noocyo kala duwan oo sifooyin luqadeed si qaabeynta uu u fiicnaado. Tusaale ahaan, waxaan u isticmaali karnaa sifooyin si aan u bixinno qiyamka caadiga ah, walxaha si loo dejiyo baaxad kala duwan, waxaan tixraaci karnaa vals lagu qeexay hal mar oo kaliya gudaha baaxadda dibadda (DRY). Waa suurtagal in la isticmaalo tixaha saxda ah, ama tusaalooyinka fasalada qaarkood (Seq, Map, iwm.).
  3. DSL Scala waxay taageero hufan u haysaa qorayaasha DSL. Mid ayaa isticmaali kara sifooyinkan si loo dhiso luqad qaabeyn oo aad u habboon oo saaxiibtinimo u leh isticmaalaha, si qaabka ugu dambeeya uu ugu yaraan akhriyo isticmaalayaasha domain.
  4. Daacadnimada iyo isku xirnaanta qanjidhada. Mid ka mid ah faa'iidooyinka ay leedahay in la helo qaabeynta dhammaan nidaamka loo qaybiyey hal meel ayaa ah in dhammaan qiyamka si adag loo qeexay hal mar ka dibna dib loo isticmaalo dhammaan meelaha aan u baahanahay. Sidoo kale ku qor bayaannada dekedda badbaadada leh si aad u hubiso in dhammaan qaabaynta saxda ah ee suurtogalka ah ee noodhka nidaamka ay ku hadli doonaan luqad isku mid ah. Waxa jira ku-tiirsanaan cad oo u dhexeeya noodhka taas oo adkeynaysa in la iloobo bixinta adeegyada qaarkood.
  5. Tayada sare ee isbedelada. Habka guud ee gudbinta qaabeynta ayaa isbedeleysa iyada oo loo marayo habka caadiga ah ee PR wuxuu dejiyaa heerar sare oo tayada sidoo kale qaabeynta.
  6. Isbeddel qaabeynta isku mar. Mar kasta oo aan ku samayno wax isbeddel ah qaabeynta dejinta tooska ah waxay hubisaa in dhammaan qanjidhada la cusboonaysiiyay.
  7. fududaynta codsiga Codsigu uma baahna inuu kala saaro oo uu ansixiyo qaabaynta oo uu qabto qiimayaasha qaabeynta ee khaldan. Tani waxay fududaynaysaa codsiga guud. (Koradh kakanaanta qaarkood ayaa ku jira qaabaynta lafteeda, laakiin waa ka-ganacsi miyir leh oo dhanka badbaadada ah.) Way fududahay in lagu noqdo qaabaynta caadiga ah - kaliya ku dar qaybaha maqan. Way fududahay in lagu bilaabo qaabaynta la isku duba riday oo dib loo dhigo fulinta qaybo dheeraad ah wakhtiyada dambe.
  8. Qaabeynta qaabeynta Sababtoo ah xaqiiqda ah in isbeddelada qaabeynta ay raacaan isla habka horumarinta, natiijada waxaan helnaa farshaxan leh nooc gaar ah. Waxay noo ogolaanaysaa inaan qaabaynta dib u beddelno haddii loo baahdo. Waxaan xitaa geyn karnaa qaabeynta la isticmaalay sanad ka hor waxayna u shaqeyn doontaa si isku mid ah. Qaabeynta xasiloon waxay hagaajinaysaa saadaalinta iyo isku halaynta nidaamka qaybsan. Habayntu waxa ay go'an tahay wakhtiga la ururinayo oo si fudud looma faragalin karo nidaamka wax soo saarka.
  9. Modularity Qaabka la soo jeediyay ayaa ah mid modular ah waxaana modules lagu dari karaa siyaabo kala duwan si loo
    taageero qaabayn kala duwan (habayn/qaabayn). Gaar ahaan, waxa suurtogal ah in la yeesho qaab-dhismeed hal-beeg ah oo miisaan yar ah iyo meel ballaadhan oo nood ah. Waa macquul in la yeesho qaab-wax soo saar badan.
  10. Tijaabinaya. Ujeedooyinka imtixaanada waxaa laga yaabaa in la hirgeliyo adeeg jeesjees ah oo loo isticmaalo ku tiirsanaanta hab nabdoon oo nooc ah. Dhowr qaab oo tijaabo ah oo kala duwan oo qaybo kala duwan lagu beddelay majaajillo ayaa isku mar la sii hayn karaa.
  11. Imtixaanka isdhexgalka. Mararka qaarkood nidaamyada qaybsan way adagtahay in la sameeyo imtixaanada laqabsashada. Isticmaalka habka lagu sharraxay si loo qoro qaabeynta nabdoon ee nidaamka dhammaystiran ee la qaybiyey, waxaan ku socodsiin karnaa dhammaan qaybaha la qaybiyey hal server si la xakameyn karo. Way fududahay in lagu daydo xaaladda
    marka mid ka mid ah adeegyada uu noqdo mid aan la heli karin.

Qasaaraha

Habka qaabeynta la isku duba riday ayaa ka duwan qaabeynta "caadiga ah" waxaana laga yaabaa inaysan ku habboonayn dhammaan baahiyaha. Waa kuwan qaar ka mid ah faa'iido darrada qaab-dhismeedka la soo ururiyey:

  1. qaabeynta taagan Waxaa laga yaabaa inaysan ku habboonayn dhammaan codsiyada. Xaaladaha qaarkood waxaa jira baahi loo qabo in si degdeg ah loo hagaajiyo qaabeynta wax soo saarka iyada oo laga gudbayo dhammaan tallaabooyinka badbaadada. Habkani wuxuu ka dhigayaa mid aad u adag. Isku-dubbarididda iyo dib-u-dejinta ayaa loo baahan yahay ka dib marka la sameeyo isbeddel kasta oo qaabeynta. Tani waa sifada iyo culayska labadaba.
  2. Jiilka qaabaynta. Marka habayntu ay soo saarto qalab otomaatig ah qaar ka mid ah habkani waxa uu u baahan yahay isku-dubarid dambe (taas oo laga yaabo inay iyadu fashilanto). Waxa laga yaabaa inay u baahato dadaal dheeri ah si loogu daro tillaabadan dheeraadka ah ee nidaamka dhismaha.
  3. Qalabka. Waxaa jira qalab badan oo la isticmaalo maanta kuwaas oo ku tiirsan habaynta qoraalka ku salaysan. Qaar ka mid ah
    lama dabaqi doono marka qaabaynta la ururiyo.
  4. Waxaa loo baahan yahay in maskaxda lagu beddelo. Horumarinta iyo DevOps waxay yaqaanaan faylalka habaynta qoraalka. Fikradda isku dubaridka qaabeynta ayaa laga yaabaa inay ula muuqato qariib.
  5. Kahor inta aan la soo bandhigin qaabeynta la isku duba riday waxaa loo baahan yahay hannaan horumarin software oo tayo sare leh.

Waxa jira xaddidaado tusaale ah oo la fuliyay:

  1. Haddi aanu bixino habayn dheeri ah oo aanu dalban fulinta noodhka, iskudubariduhu naguma caawin doono inaanu ogaano hirgalinta maqan. Tan waxaa lagu xallin karaa iyadoo la isticmaalayo HList ama ADTs (classes case) oo loogu talagalay qaabeynta noodhka halkii ay ka ahaan lahaayeen sifooyin iyo Habka Keega.
  2. Waa inaan ku bixinaa wax kuleyliyaha ku jira faylka qaabeynta: (package, import, object bayaannada;
    override def's ee xuduudaha leh qiimaha caadiga ah). Tan waxaa laga yaabaa in qayb ahaan wax looga qabto iyadoo la isticmaalayo DSL.
  3. Maqaalkan kuma daboolno dib-u-habaynta firfircoon ee rucubyada qanjidhada la midka ah.

Ugu Dambeyn

Maqaalkan waxaan ka wada hadalnay fikradda ah in si toos ah loo qaabeeyo koodhka isha qaab badbaado leh. Habka waxaa loo isticmaali karaa codsiyo badan beddelka xml- iyo habayn qoraaleed kale. In kasta oo tusaalaheenna lagu hirgeliyay Scala, waxaa sidoo kale loo tarjumi karaa luqadaha kale ee la isku duba rido (sida Kotlin, C #, Swift, iwm.). Mid ayaa isku dayi kara habkan mashruuc cusub oo, haddii ay dhacdo inuu si fiican u habboonayn, u beddel qaabkii hore.

Dabcan, qaabeynta la isku duba ridi karo waxay u baahan tahay hannaan horumarineed oo tayo sare leh. Soo celinta waxay ballan qaadaysaa inay bixiso qaabayn adag oo tayo sare leh oo siman.

Habkan waxaa lagu kordhin karaa siyaabo kala duwan:

  1. Mid ayaa isticmaali kara macros si uu u sameeyo ansaxinta qaabeynta oo uu ku guuldareysto wakhtiga la ururinayo haddii ay dhacdo caqabado-ganacsiyeed kasta oo fashilma.
  2. DSL waa la hirgalin karaa si uu u matalo qaabaynta hab saaxiibtinimo-usocdeedka domain ah.
  3. Maareynta kheyraadka firfircoon oo leh habeyn toos ah qaabeynta Tusaale ahaan, marka aanu hagaajino tirada qanjidhada kutlada waxa laga yaabaa in aan rabno (1) qanjidhada si loo helo qaabaynta wax yar oo wax laga beddelay; (2) maareeyaha kooxda si uu u helo macluumaadka noodhka cusub.

Thanks

Waxaan jeclaan lahaa inaan u mahadceliyo Andrey Saksonov, Pavel Popov, Anton Nehaev inaad siisay jawaab celin dhiirigelin leh oo ku saabsan qoraalka qoraalkan oo iga caawiyay inaan si cad u caddeeyo.

Source: www.habr.com