Habaynta Nidaamka Qaybsan ee La Soo ururiyey

Waxaan jeclaan lahaa inaan kuu sheego hal farsamo oo xiiso leh oo lagu shaqeynayo qaabeynta nidaamka qaybsan. Habayntu waxay si toos ah u taagan tahay luuqad la soo ururiyey (Scala) iyadoo la isticmaalayo noocyo badbaado leh. Boostadani waxay tusaale u tahay qaabayntan oo kale waxayna ka hadlaysaa dhinacyo kala duwan oo ku saabsan hirgelinta qaabaynta la isku duba ridey ee habka horumarinta guud.

Habaynta Nidaamka Qaybsan ee La Soo ururiyey

(ingiriisiga)

Horudhac

Dhisidda nidaam qaybsan oo la isku halayn karo waxay ka dhigan tahay in dhammaan qanjidhada ay isticmaalaan qaabeynta saxda ah, oo la mid ah qanjidhada kale. Tignoolajiyada DevOps (terraform, macquul ama wax la mid ah) ayaa badanaa loo adeegsadaa in si toos ah loo soo saaro faylalka qaabeynta (badanaa gaar u ah nood kasta). Waxaan sidoo kale jeclaan lahayn inaan hubinno in dhammaan qanjidhada isgaarsiinta ay isticmaalayaan borotokool isku mid ah (oo ay ku jiraan isla nooca). Haddii kale, iswaafajin la'aanta ayaa lagu dhisi doonaa nidaamkayaga qaybsan. Dunida JVM, hal natiijo oo ka dhalata shuruudan ayaa ah in isla nooc ka mid ah maktabadda ay ku jiraan farriimaha borotokoolka waa in meel walba laga isticmaalo.

Ka waran tijaabinta nidaamka qaybsan? Dabcan, waxaan u qaadaneynaa in dhammaan qaybaha ay leeyihiin imtixaanno unug ka hor inta aanan u gudbin imtixaanka la qabsiga. (Si aan natiijada tijaabada uga saarno wakhtiga runtime, waa in aan sidoo kale bixinaa maktabad isku mid ah heerka imtixaanka iyo wakhtiga runtime).

Markaad la shaqaynayso imtixaanada isdhexgalka, badanaa way fududahay in la isticmaalo isla fasalka meel kasta oo dhan. Waxa kaliya ee ay tahay inaan sameyno waa inaan hubinno in isla fasalka la isticmaalo wakhtiga runtime. (Iyadoo ay gabi ahaanba suurtogal tahay in lagu socodsiiyo qanjidhada kala duwan ee leh fasallo kala duwan, tani waxay ku kordhinaysaa kakanaanta guud ahaan qaabeynta iyo dhibaatooyinka geynta iyo imtixaanada isdhexgalka.) Ujeeddooyinka boostadan, waxaan u maleyneynaa in dhammaan qanjidhada ay isticmaali doonaan isla fasal isku mid ah.

Habayntu waxay la socotaa arjiga. Waxaan isticmaalnaa noocyo si aan u aqoonsanno heerarka kala duwan ee horumarinta barnaamijka. Waxay u muuqataa mid macquul ah in sidoo kale la aqoonsado noocyada kala duwan ee qaabeynta. Oo dhig qaabeynta lafteeda nidaamka xakamaynta nooca. Haddii ay jirto hal qaab oo kaliya oo wax soo saar ah, markaa waxaan si fudud u isticmaali karnaa lambarka nooca. Haddii aan isticmaalno tusaalooyin wax soo saar badan, markaa waxaan u baahan doonaa dhowr
laamaha qaabeynta iyo calaamad dheeraad ah oo lagu daro nooca (tusaale ahaan, magaca laanta). Sidan ayaan si cad u aqoonsan karnaa qaabka saxda ah. Aqoonsiga qaabeynta kasta wuxuu si gaar ah u dhigmaa isku darka gaarka ah ee noodhka la qaybiyey, dekedaha, ilaha dibadda, iyo noocyada maktabadda. Ujeedada qoraalkan awgeed waxaan u qaadan doonaa inay jirto hal laan oo kaliya waxaanan ku aqoonsan karnaa qaabeynta habka caadiga ah iyadoo la adeegsanayo saddex lambar oo ay u kala baxaan dhibic (1.2.3).

Deegaannada casriga ah, faylasha qaabeynta ayaa si dhif ah loo abuuray gacanta. Inta badan waxaa la soo saaraa inta lagu jiro hawlgalinta oo aan la taabanin (sidaas darteed waxba ha jabin). Su'aal dabiici ah ayaa soo baxda: maxaan wali u isticmaalnaa qaabka qoraalka si aan u kaydino qaabeynta? Beddelka macquulka ah wuxuu u muuqdaa inuu yahay awoodda isticmaalka koodka caadiga ah ee qaabeynta iyo ka faa'iidaysiga hubinta isku-darka wakhtiga.

Maqaalkan waxaan ku baari doonaa fikradda ah in la matalo qaabeynta gudaha artifact la ururiyey.

Qaabeynta la isku duba riday

Qaybtani waxa ay bixinaysaa tusaale qaabaynta qaabaysan ee taagan. Laba adeeg oo fudud ayaa la hirgeliyay - adeegga echo iyo macmiilka adeegga echo. Iyada oo ku saleysan labadan adeeg, laba ikhtiyaar oo nidaam ayaa la isu keenay. Hal ikhtiyaar, labada adeegba waxay ku yaalliin isku mid ah, ikhtiyaar kale - qanjidhada kala duwan.

Sida caadiga ah nidaamka la qaybiyey waxa uu ka kooban yahay dhowr nood. Waxaad ku garan kartaa noodhadhka adigoo isticmaalaya qiyamka nooc ka mid ah NodeId:

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

ama

case class NodeId(hostName: String)

ama xataa

object Singleton
type NodeId = Singleton.type

Nodes waxay qabtaan doorar kala duwan, waxay qabtaan adeegyo iyo isku xirka TCP/HTTP ayaa laga dhex abuuri karaa dhexdooda.

Si loo qeexo xidhiidhka TCP waxaan u baahanahay ugu yaraan lambarka dekedda. Waxaan sidoo kale jeclaan lahayn inaan ka tarjumayno borotokoolka lagu taageeray dekeddaas si loo hubiyo in macmiilka iyo server-ka labaduba ay isticmaalayaan borotokool isku mid ah. Waxaan ku qeexi doonaa xiriirka anagoo adeegsanayna fasalka soo socda:

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

halkaas oo Port - kaliya halbeeg Int oo muujinaya kala duwanaanshaha qiyamka la aqbali karo:

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

Noocyada la safeeyey

Eeg maktabadda la safeeyey ΠΈ aniga warbixin. Marka la soo koobo, maktabaddu waxay kuu oggolaaneysaa inaad ku darto xannibaadyo noocyada la hubiyay waqtiga la ururinayo. Xaaladdan oo kale, qiimaha nambarka dekedda ansax ah waa 16-bit mitir. Qaabeynta la isku duba riday, isticmaalka maktabadda la safeeyey maaha qasab, laakiin waxa ay wanaajisaa awoodda isku-dubariduhu si uu u hubiyo qaabaynta.

Nidaamyada HTTP (REST), marka lagu daro lambarka dekedda, waxaan sidoo kale u baahan karnaa waddada adeegga:

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

Noocyada Phantom

Si loo aqoonsado hab-maamuuska wakhtiga la ururinayo, waxaanu isticmaalnaa nooc xuduud ah oo aan fasalka dhexdiisa lagu isticmaalin. Go'aankan waxaa sabab u ah xaqiiqda ah in aynaan isticmaalin tusaale borotokoolka wakhtiga runtime, laakiin waxaan jeclaan lahayn iskudubariduhu inuu hubiyo waafaqsanaanta borotokoolka. Marka la qeexo borotokoolka, ma awoodno inaan u gudubno adeeg aan habboonayn ku tiirsanaan ahaan.

Mid ka mid ah borotokoollada caadiga ah waa REST API oo leh taxane Json:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

halkaas oo RequestMessage - nooca codsiga, ResponseMessage - nooca jawaabta.
Dabcan, waxaan isticmaali karnaa sharraxaadaha borotokoolka kale ee bixiya saxnaanta tilmaanta aan u baahanahay.

Ujeedada qoraalkan, waxaan u isticmaali doonaa hab-maamuuska nooca la fududeeyay:

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

Halkan codsigu waa xadhig ku xidhan url jawaabtuna waa xadhigga lagu soo celiyay jidhka jawaabta HTTP.

Qaabeynta adeegga waxaa lagu sifeeyaa magaca adeegga, dekedaha, iyo ku-tiirsanaanta. Cutubyadan waxaa lagu matali karaa Scala dhowr siyaabood (tusaale ahaan, HList-s, noocyada xogta aljabrada). Ujeedooyinka qoraalkan, waxaan u isticmaali doonaa Habka Keega oo aan matali doono cutubyo isticmaalaya trait'ov. (Qaabka Keega ma aha shay loo baahan yahay habkan. Si fudud waa hal fulin oo suurtagal ah.)

Ku-tiirsanaanta udhaxeysa adeegyada waxaa loo mateli karaa habab soo celiya dekedaha EndPointqanjidhada 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)
  }

Si aad u abuurto adeegga echo, waxa kaliya ee aad u baahan tahay waa lambarka dekedda iyo calaamad muujinaysa in dekeddu ay taageerto borotokoolka echo. Waxaa laga yaabaa inaanaan qeexin deked gaar ah, sababtoo ah... sifooyinku waxay kuu oggolaanayaan inaad ku dhawaaqdo hababka iyada oo aan la hirgelin (hababka aan la taaban karin). Xaaladdan oo kale, marka la abuurayo qaabeynta la taaban karo, iskudubariduhu waxay nooga baahan yihiin inaan bixinno hirgelinta habka aan la taaban karin oo aan bixinno lambarka dekedda. Maadaama aan hirgelinay habka, marka la abuurayo qaabeyn gaar ah, waxaa laga yaabaa inaanan qeexin deked kale. Qiimaha caadiga ah ayaa la isticmaali doonaa.

Qaabeynta macmiilka waxaan ku cadeyneynaa ku tiirsanaanta adeegga echo:

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

Ku-tiirsanaanta waxay la mid tahay adeegga la dhoofiyo echoService. Gaar ahaan, macmiilka echo waxaan u baahanahay isla borotokoolka. Sidaa darteed, marka la isku xiro laba adeeg, waxaan hubin karnaa in wax walba ay si sax ah u shaqeyn doonaan.

Hirgelinta adeegyada

Hawl ayaa loo baahan yahay si loo bilaabo oo loo joojiyo adeegga. (Awoodda joojinta adeegga ayaa muhiim u ah tijaabinta.) Mar labaad, waxaa jira dhowr ikhtiyaar oo lagu hirgelinayo sifada noocaan ah (tusaale, waxaan isticmaali karnaa nooca fasallada ku saleysan nooca qaabeynta). Ujeedada qoraalkan waxaan u isticmaali doonaa Habka Keega. Waxaanu ku matali doonaa adeega anagoo adeegsanayna fasal cats.Resource, sababtoo ah Fasalkani waxa uu hore u bixiyay hab si badbaado leh loogu dammaanad qaadayo sii deynta agabka haddii ay dhibaato dhacdo. Si aan u helno kheyraad, waxaan u baahanahay inaan bixino qaabeynta iyo qaab runtime diyaarsan. Shaqada bilawga adeeggu waxay u ekaan kartaa sidan:

  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 adeeggan
  • AddressResolver - walax runtime ah oo kuu ogolaanaysa inaad ogaato ciwaanada qanjidhada kale (hoos eeg)

iyo noocyada kale ee maktabadda cats:

  • F[_] - nooca saamaynta (xaaladda ugu fudud F[A] waxay noqon kartaa shaqo () => A. Qoraalkan waxaan ku isticmaali doonaa cats.IO.)
  • Reader[A,B] - in ka badan ama ka yar oo la mid ah shaqada A => B
  • cats.Resource - kheyraad la heli karo oo la sii deyn karo
  • Timer - Saacadaha (wuxuu kuu ogolaanayaa inaad huruddo in muddo ah oo aad cabbirto inta u dhaxaysa)
  • ContextShift - analoog ExecutionContext
  • Applicative - fasalka nooca saamaynta kaas oo kuu ogolaanaya inaad isku darsato saamaynta shakhsi ahaaneed (ku dhawaad ​​​​monad). Codsiyada aad u adag waxay u muuqataa inay ka fiican tahay in la isticmaalo Monad/ConcurrentEffect.

Isticmaalka saxeexa shaqada waxaan hirgelin karnaa adeegyo dhowr ah. 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](()))
  }

(Cm. koodh isha, kuwaas oo adeegyo kale lagu fuliyo - adeegga echo, echo macmiilka
ΠΈ kantaroolayaasha nolosha.)

Noodku waa shay bilaabi kara adeegyo dhawr ah (bilawga silsiladda agabka waxa hubinaya Habka Keega):

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

Fadlan ogow in aanu caddaynayno nooca saxda ah ee qaabaynta ee looga baahan yahay noodhkan. Haddii aan illowno inaan sheegno mid ka mid ah noocyada qaabeynta ee looga baahan yahay adeeg gaar ah, waxaa jiri doona qalad isku-ururin. Sidoo kale, ma awoodi doono inaan bilowno noodhka ilaa aan siino shay nooca ku haboon oo dhan xogta lagama maarmaanka ah.

Xallinta Magaca martida

Si loogu xidho martigeliyaha fog, waxaan u baahanahay ciwaanka IP-ga dhabta ah. Waxaa suurtogal ah in ciwaanka uu noqdo mid dambe oo la ogaan doono habaynta inteeda kale. Markaa waxaan u baahanahay shaqo khariidad ku samaynaysa aqoonsiga nooda ciwaanka:

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

Waxaa jira dhowr siyaabood oo loo hirgelin karo shaqadan:

  1. Haddii ciwaanadu ay noqdaan kuwo nala yaqaan ka hor intaan la dirin, markaas waxaan ku soo saari karnaa koodka Scala
    ciwaanada ka dibna socodsii dhismaha. Tani waxay ururin doontaa oo wadi doontaa imtixaanada.
    Xaaladdan oo kale, shaqada ayaa loo ogaan doonaa si joogto ah waxaana lagu matali karaa koodka sida khariidad ahaan Map[NodeId, NodeAddress].
  2. Xaaladaha qaarkood, ciwaanka dhabta ah waxaa la og yahay oo kaliya ka dib marka qanjirada bilaabato.
    Xaaladdan oo kale, waxaan hirgelin karnaa "adeegga daahfurka" kaas oo ka socda qanjidhada kale waxayna dhammaan noodyadu iska diiwaan gelin doonaan adeeggan waxayna codsan doonaan ciwaannada qanjidhada kale.
  3. Haddii aan wax ka beddeli karno /etc/hosts, ka dib waxaad isticmaali kartaa magacyo hore loo qeexay (sida my-project-main-node ΠΈ echo-backend) oo si fudud ugu xidhi magacyadan
    leh ciwaanada IP inta lagu jiro daabulinta

Qoraalkan si faahfaahsan ugama tixgelin doonno kiisaskan. Anaga
Tusaalaha toy-ga, dhammaan noodhadhku waxay yeelan doonaan cinwaan IP isku mid ah - 127.0.0.1.

Marka xigta, waxaan tixgelineynaa laba ikhtiyaar oo loogu talagalay nidaamka qaybinta:

  1. Ku dhejinta dhammaan adeegyada hal dhinac.
  2. Iyo martigelinta adeegga echo iyo ku dhawaaqida macmiilka ee noodaha kala duwan.

Habaynta loogu talagalay hal nuurad:

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

Shayga waxa uu fuliyaa habaynta macmiilka iyo server-ka labadaba. Qaabeynta waqtiga-ilaa-noolaanshaha ayaa sidoo kale loo adeegsadaa si ay u dhexeyso ka dib lifetime jooji barnaamijka. (Ctrl-C sidoo kale waxay u shaqeysaa oo u fasaxdaa dhammaan agabyada si sax ah.)

Isku mid ah qaabeynta iyo sifooyinka fulinta ayaa loo isticmaali karaa si loo abuuro nidaam ka kooban laba nood oo kala duwan:

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

Muhiim! U fiirso sida adeegyadu isugu xidhan yihiin. Waxaan u qeexnaa adeeg lagu fuliyay hal noode sidii hirgelinta habka ku tiirsanaanta noodhka kale. Nooca ku-tiirsanaanta waxaa hubiyaa isku-dubaridiyaha, sababtoo ah ka kooban yahay nooca borotokoolka. Marka la ordo, ku tiirsanaanta ayaa ka koobnaan doonta aqoonsiga noodhka bartilmaameedka saxda ah. Thanks to nidaamkan, waxaanu si sax ah u qeexnaa lambarka dekedda mar walba waxaana mar walba la dammaanad qaadayaa in la tixraaco dekedda saxda ah.

Hirgelinta labada hab ee noodaha

Qaabeyntan, waxaan u isticmaalnaa adeeg fulin isku mid ah iyada oo aan isbedelin. Farqiga keliya ayaa ah in aan hadda haysanno laba shay oo hirgeliya 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 serverka wuxuuna u baahan yahay oo kaliya habaynta serverka. Noodka labaad wuxuu hirgeliyaa macmiilka wuxuuna adeegsadaa qayb ka duwan qaabeynta. Sidoo kale labada nodes waxay u baahan yihiin maaraynta nolosha. Noodka seerfarku waxa uu socdaa si aan xad lahayn ilaa la joojiyo SIGTERM'om, iyo noodhka macmiilku wuu joogsadaa muddo ka dib. Cm. app soo saaraha.

Habka horumarinta guud

Aynu aragno sida habka qaabayntani u saameeyo habka guud ee horumarinta.

Habaynta waxaa lagu soo ururin doonaa koodka intiisa kale waxaana la soo saari doonaa farshaxan (.jar) Waxay u muuqataa inay macno samaynayso in qaabeynta lagu dhejiyo farshaxan gaar ah. Tani waa sababta oo ah waxaan yeelan karnaa qaabab badan oo ku saleysan kood isku mid ah. Mar labaad, waxaa suurtagal ah in la abuuro farshaxanno u dhigma laamaha qaabeynta ee kala duwan. Ku-tiirsanaanta noocyada gaarka ah ee maktabadaha ayaa la keydiyay iyadoo ay la socoto qaabeynta, noocyadaanna waa la keydiyaa waligood mar kasta oo aan go'aansanno inaan geyno nooca qaabeynta.

Isbeddel kasta oo qaabayntu wuxuu isu beddelaa beddelka koodka. Oo sidaas daraaddeed, mid kasta
isbeddelka waxaa dabooli doona habka hubinta tayada caadiga ah:

Tigidhka tracker-ka cayayaanka -> PR -> dib u eegis -> ku biir laamaha khuseeya ->
dhexgalka -> geynta

Cawaaqibta ugu weyn ee hirgelinta qaabeynta la isku duba riday waa:

  1. Habayntu waxa ay ahaan doontaa mid joogto ah dhammaan qanjidhada nidaamka qaybsan. Sababo la xiriira xaqiiqda ah in dhammaan qanjidhada ay helaan qaabeynta isku mid ah hal il.

  2. Waa dhibaato in la beddelo qaabaynta mid ka mid ah noodyada. Sidaa darteed, "qabashada qaabaynta" lagama yaabo.

  3. Way adagtahay in isbedel yar lagu sameeyo qaabaynta.

  4. Inta badan isbeddelada qaabeynta ayaa dhici doona iyada oo qayb ka ah habka guud ee horumarinta waxaana lagu qasbi doonaa in dib loo eego.

Miyaan u baahanahay bakhaar gooni ah si aan u kaydiyo qaabaynta wax soo saarka? Qaabayntan waxa ku jiri kara furaha sirta ah iyo macluumaadka kale ee xasaasiga ah kaas oo aanu jeclaan lahayn in aanu xaddidno gelitaanka Iyada oo ku saleysan tan, waxay u muuqataa inay macno samaynayso in lagu kaydiyo qaabeynta kama dambaysta ah ee kayd gaar ah. Waxa aad u kala qaybin kartaa qaabaynta laba qaybood-mid ka kooban qaabaynta qaabaynta si guud oo la heli karo iyo mid ka kooban dejinta xaddidan. Tani waxay u ogolaan doontaa horumariyayaal badankoodu inay galaangal u yeeshaan goobaha guud. Kala soocidaani way fududahay in la gaaro iyadoo la adeegsanayo sifooyin dhexdhexaad ah oo ka kooban qiyamka caadiga ah.

Kala duwanaansho suurtagal ah

Aynu isku dayno in aan is barbar dhigno qaabaynta la soo ururiyey iyo qaar kale oo caadi ah:

  1. Faylka qoraalka ee mashiinka bartilmaameedka.
  2. Dukaanka qiimaha muhiimka ah ee dhexe (etcd/zookeeper).
  3. Qaybaha habraaca dib loo habayn karo/dib u bilaabi karo iyada oo aan dib loo bilaabin hawsha.
  4. Kaydinta qaabaynta ka baxsan farshaxanimada iyo xakamaynta nooca

Faylasha qoraalku waxay bixiyaan dabacsanaan weyn marka la eego isbeddellada yaryar. Maamulaha nidaamku waxa uu geli karaa noodhka fog, waxa uu isbeddel ku samayn karaa faylalka ku habboon oo dib u bilaabi kara adeegga. Nidaamyada waaweyn, si kastaba ha ahaatee, dabacsanaanta noocan oo kale ah ayaa laga yaabaa inaysan ahayn mid la jecel yahay. Isbeddellada la sameeyay wax raad ah kama tagin nidaamyada kale. Qofna ma eego isbeddellada Way adag tahay in la go'aamiyo cidda saxda ah ee isbeddellada samaysay iyo sababta. Isbeddellada lama tijaabin. Haddii nidaamka la qaybiyo, markaa maamuluhu wuxuu ilaawi karaa isbeddelka u dhigma ee qanjidhada kale.

(Waa in sidoo kale la ogaadaa in isticmaalka qaabeynta la isku duba ridey aysan xirin suurtagalnimada isticmaalka faylasha qoraalka mustaqbalka. Way ku filnaan doontaa in lagu daro parser iyo ansaxiyaha soo saara nooc la mid ah soo saarista Config, oo waxaad isticmaali kartaa faylasha qoraalka. Isla markiiba waxay raacdaa in kakanaanta nidaamka leh qaabaynta la isku duba riday ay ka yara yaraatay kakanaanta nidaamka isticmaalaya faylasha qoraalka, sababtoo ah faylasha qoraalka waxay u baahan yihiin kood dheeraad ah.)

Bakhaarka qiimaha dhexe ee muhiimka ah waa hab wanaagsan oo lagu qaybiyo cabbiraadaha meta ee codsiga la qaybiyey. Waxaan u baahanahay inaan go'aansano waxa ay yihiin xuduudaha qaabeynta iyo waxa kaliya ee xogta ah. Aynu yeelano shaqo C => A => B, iyo xuduudaha C naadir isbeddelo, iyo xogta A - inta badan. Xaaladdan oo kale waxaan dhihi karnaa taas C - xuduudaha qaabeynta, iyo A - xogta. Waxay u muuqataa in cabbirada qaabaynta ay ka duwan yihiin xogta iyagoo guud ahaan isbeddelaya si ka yar xogta. Sidoo kale, xogta inta badan waxay ka timaadaa hal il (isticmaalka), iyo cabbirada qaabeynta mid kale (laga bilaabo maamulaha nidaamka).

Haddii si dhif ah loo beddelo xuduudaha loo baahan yahay in la cusboonaysiiyo iyada oo aan dib loo bilaabin barnaamijka, markaa tani waxay inta badan u horseedi kartaa dhibaatada barnaamijka, sababtoo ah waxaan u baahan doonaa inaan si uun u gudbino xuduudaha, kaydinta, kala-soocidda iyo hubinta, iyo habka qiyamka khaldan. Sidaa darteed, marka laga eego aragtida hoos u dhigista kakanaanta barnaamijka, waxay macno u leedahay in la yareeyo tirada xaddidaadaha bedeli kara inta lagu jiro hawlgalka barnaamijka (ama aan la taageerin xuduudahaas oo dhan).

Ujeedooyinka qoraalkan, waxaan u kala saari doonaa inta udhaxeysa xaddidaadyada taagan iyo kuwa firfircoon. Haddii caqli-galnimada adeeggu u baahan yahay isbeddelka cabbirrada inta lagu jiro hawlgalka barnaamijka, markaa waxaan u yeeri doonnaa cabbirradaas mid firfircoon. Haddii kale doorashooyinku waa taagan yihiin waxaana lagu habayn karaa iyadoo la isticmaalayo qaabaynta la soo ururiyey. Dib-u-habayn firfircooni leh, waxa laga yaabaa in aan u baahanno hab aan dib ugu bilaabi lahayn qaybo ka mid ah barnaamijka oo leh cabbiro cusub, oo la mid ah sida hab-socodka nidaamka hawlgalka dib loo bilaabo. (Fikraddayada, waxaa lagu talinayaa in laga fogaado dib-u-habaynta waqtiga-dhabta ah, tan iyo markii tani ay kordhiso kakanaanta nidaamka. Haddii ay suurtagal tahay, waxaa fiican in la isticmaalo awoodda caadiga ah ee OS ee dib-u-kicinta hababka.)

Hal dhinac oo muhiim ah oo ku saabsan isticmaalka qaabeynta joogtada ah ee dadka ka dhigaysa inay tixgeliyaan dib-u-habaynta firfircooni waa wakhtiga ay qaadanayso nidaamka si uu dib u bilaabo ka dib cusbooneysiinta qaabeynta (hoos u dhaca). Dhab ahaantii, haddii aan u baahanahay inaan isbeddel ku samayno qaabeynta taagan, waa inaan dib u bilownaa nidaamka si qiyamka cusubi u dhaqan galo. Dhibaatada wakhtiga dhimista way ku kala duwan tahay darnaanta nidaamyada kala duwan. Xaaladaha qaarkood, waxaad jadwal u samayn kartaa dib-u-kicinta wakhtiga uu culaysku yar yahay. Haddii aad u baahan tahay inaad bixiso adeeg joogto ah, waad hirgelin kartaa Xidhiidhka AWS ELB oo dareeraya. Isla mar ahaantaana, marka aan u baahanahay in aan dib u soo celino nidaamka, waxaan bilaabeynaa tusaale isbarbar socda oo nidaamkan ah, u beddelo dheelitirka, oo sug ilaa xiriiryadii hore si ay u dhamaystiraan. Ka dib markii dhammaan xiriiradii hore ay joojiyaan, waxaan xirnay tusaale ahaan nidaamka.

Aynu hadda tixgelinno arrinta ku saabsan kaydinta qaabeynta gudaha ama dibadda artifact. Haddii aan ku kaydinno qaabeynta gudaha artifact, ka dibna ugu yaraan waxaan fursad u helnay inaan xaqiijino saxnaanta qaabeynta inta lagu jiro isku dhafka farshaxanka. Haddii qaabayntu ka baxsan tahay farshaxanimada gacanta lagu hayo, way adag tahay in la raad raaco cidda isbeddelka ku samaysay faylkan iyo sababta. Sidee muhiim u tahay? Fikradeena, nidaamyo wax soo saar badan oo badan ayaa muhiim u ah in la helo qaabeynta xasilloon oo tayo sare leh.

Nooca artifact wuxuu kuu oggolaanayaa inaad go'aamiso marka la abuuray, maxay yihiin qiyamka ay ku jiraan, maxay yihiin shaqooyinka la kartiyeeyay/naafo, iyo cidda mas'uul ka ah isbeddel kasta oo ku yimaada qaabeynta. Dabcan, kaydinta qaabeynta gudaha farshaxanku waxay u baahan tahay xoogaa dadaal ah, markaa waxaad u baahan tahay inaad sameyso go'aan xog ogaal ah.

Faa'iidada iyo khasaaraha

Waxaan jeclaan lahaa inaan dul istaago faa'iidooyinka iyo khasaarooyinka tignoolajiyada la soo jeediyay.

Faa'iidooyinka

Hoos waxaa ku qoran liiska astaamaha ugu muhiimsan ee habaynta nidaamka qaybsan ee la soo ururiyey:

  1. Hubinta qaabeynta taagan. Waxay kuu ogolaanaysaa inaad hubiso taas
    qaabeynta waa sax.
  2. Luuqada qaabeynta qani ah. Caadi ahaan, hababka qaabaynta kale waxay ku xaddidan yihiin beddelka doorsoomayaasha xargaha ugu badnaan. Markaad isticmaalayso Scala, sifooyin luqadeed oo balaadhan ayaa diyaar ah si loo hagaajiyo qaabayntaada. Tusaale ahaan waan isticmaali karnaa
    sifooyin loogu talagalay qiyamka caadiga ah, iyadoo la adeegsanayo walxaha ilaa halbeegyada kooxeed, waxaan tixraaci karnaa vals lagu dhawaaqay hal mar oo keliya (DRY) ee baaxadda xiritaanka. Waxaad si toos ah ugu soo dajin kartaa fasal kasta gudaha qaabeynta (Seq, Map, fasallada caadiga ah).
  3. DSL Scala waxa ay leedahay tiro sifooyin luqadeed ah oo sahlaya in la abuuro DSL. Waa suurtogal in laga faa'iidaysto sifooyinkaas oo la hirgeliyo luqadda qaabeynta oo aad ugu habboon kooxda bartilmaameedka ah ee isticmaalayaasha, si qaabeynta ay ugu yaraan akhrin karaan khabiirada domainka. Khabiirada ayaa, tusaale ahaan, ka qayb qaadan kara habka dib u eegista qaabeynta.
  4. Daacadnimada iyo isku-dhafka u dhexeeya noodhka. Mid ka mid ah faa'iidooyinka ay leedahay in la helo qaabeynta dhammaan nidaamka qaybsan ee lagu kaydiyo hal dhibic ayaa ah in dhammaan qiyamka lagu dhawaaqay hal mar oo ka dibna dib loo isticmaalo meel kasta oo looga baahan yahay. Isticmaalka noocyada phantom si loo caddeeyo dekedaha waxay hubisaa in noodhadhku ay isticmaalayaan borotokool la jaan qaada dhammaan qaabaynta nidaamka saxda ah. Lahaanshaha ku-tiirsanaan qeexan oo qasab ah oo u dhexeeya qanjidhada waxay hubisaa in dhammaan adeegyadu isku xidhan yihiin.
  5. Isbedelka tayada sare leh. Isbeddelka qaabeynta iyadoo la adeegsanayo habka horumarinta guud waxay suurtogal ka dhigaysaa in la gaaro heerarka tayada sare leh ee qaabeynta sidoo kale.
  6. Cusboonaysiinta qaabeynta isku mar. Si toos ah u geynta nidaamka isbeddelka qaabeynta ka dib waxay hubisaa in dhammaan qanjidhada la cusboonaysiiyay.
  7. Fududeynta codsiga Codsigu uma baahna kala saarid, hubinta qaabaynta, ama maaraynta qiyamka khaldan. Tani waxay yaraynaysaa kakanaanta codsiga. (Qaar ka mid ah kakanaanta qaabeynta lagu arkay tusaalaheena ma aha sifo ka mid ah qaabeynta la isku duba ridey, laakiin kaliya go'aan miyir leh oo ay horseedo rabitaanka in la bixiyo badbaado nooca weyn.) Waa arrin sahlan in lagu soo celiyo qaabeynta caadiga ah - kaliya hirgelin waxa maqan. qaybo. Sidaa darteed, waxaad, tusaale ahaan, ku bilaabi kartaa qaabeynta la isku daray, dib u dhigista hirgelinta qaybo aan loo baahnayn ilaa wakhtiga loo baahan yahay.
  8. qaabeynta la xaqiijiyay. Mar haddii isbeddellada qaabeynta ay raacaan qaddarka caadiga ah ee isbeddellada kale, wax soo saarka aan helno waa farshaxan leh nooc gaar ah. Tani waxay noo ogolaaneysaa, tusaale ahaan, inaan ku soo laabano nuqulkii hore ee qaabeynta haddii loo baahdo. Waxaan xitaa isticmaali karnaa qaabeynta laga bilaabo sanad ka hor nidaamkuna wuxuu u shaqeyn doonaa si isku mid ah. Qaabeynta xasillooni waxay hagaajinaysaa saadaalinta iyo isku halaynta nidaamka qaybsan. Maaddaama qaabaynta ay ku go'an tahay heerka isku-darka, way adag tahay in la been-abuuro wax-soo-saarka.
  9. Modularity Qaabka la soo jeediyay ayaa ah mid modular ah, cutubyada waxaa lagu dari karaa siyaabo kala duwan si loo abuuro habab kala duwan. Gaar ahaan, waxaad u habayn kartaa nidaamka si uu ugu shaqeeyo hal nood oo hal qaab ah, iyo qanjidhada badan ee mid kale. Waxaad u abuuri kartaa dhowr habayn oo loogu talagalay tusaalooyinka wax soo saarka ee nidaamka.
  10. Tijaabinaya. Adiga oo ku beddelaya adeegyada gaarka ah walxaha majaajilada ah, waxaad heli kartaa noocyo badan oo nidaamka ku habboon in la tijaabiyo.
  11. Imtixaanka isdhexgalka. Haysashada hal qaabayn oo dhan nidaamka la qaybiyey waxay suurtogal ka dhigaysaa in lagu socodsiiyo dhammaan qaybaha jawiga la xakameeyey taasoo qayb ka ah tijaabinta isdhexgalka. Way fududahay in lagu daydo, tusaale ahaan, xaalad ay qanjidhada qaarkood noqdaan kuwo la heli karo.

Khasaaraha iyo xaddidnaanta

Qaabaynta la soo ururiyey way ka duwan tahay hababka kale ee habaynta waxaana laga yaabaa inaanay ku habboonayn codsiyada qaarkood. Hoos waxaa ku yaal qaar ka mid ah khasaaraha:

  1. qaabeynta taagan Mararka qaarkood waxaad u baahan tahay inaad si dhakhso ah u saxdo qaabeynta wax soo saarka, adigoo ka gudbaya dhammaan hababka ilaalinta. Habkani wuxuu noqon karaa mid aad u adag. Ugu yaraan, isku-dubarid iyo geyn toos ah ayaa weli loo baahan doonaa. Tani waa labadaba sifo faa'iido leh oo habka loo wajahayo iyo khasaare mararka qaarkood.
  2. Jiilka qaabaynta. Haddii faylka qaabeynta uu soo saaro qalab toos ah, dadaal dheeraad ah ayaa loo baahan karaa si loo mideeyo qoraalka dhismaha.
  3. Qalab. Hadda, yutiilitida iyo farsamooyinka loogu talagalay in lagu shaqeeyo qaabeynta waxay ku saleysan yihiin faylasha qoraalka. Dhammaan agabka/farsamooyinka noocan oo kale ah laguma heli doono habayn la soo ururiyey.
  4. Waxaa loo baahan yahay in la beddelo hab-dhaqanka. Horumarinta iyo DevOps waxay caadaysteen faylasha qoraalka. Fikradda isku dubaridka qaabeynta waxay noqon kartaa wax aan la filayn oo aan caadi ahayn waxayna sababi kartaa diidmo.
  5. Nidaam horumarineed oo tayo sare leh ayaa loo baahan yahay. Si si raaxo leh loogu isticmaalo qaabeynta la isku duba ridey, si buuxda ayaa otomaatig ah habka dhismaha iyo geynta codsiga (CI/CD) waa lagama maarmaan. Haddii kale waxay noqon doontaa mid aad u dhib badan.

Aynu sidoo kale ku dul istaagno tiro xaddidan oo tusaalaha la tixgeliyey ee aan la xiriirin fikradda qaabeynta la soo ururiyey:

  1. Haddii aan bixino macluumaadka qaabeynta aan loo baahnayn oo aan loo isticmaalin noodhka, markaa iskudubariduhu kama caawin doono inaan ogaano hirgelinta maqan. Dhibaatadan waxa lagu xalin karaa in laga tago Habka Keega oo la isticmaalo noocyo badan oo adag, tusaale ahaan, HList ama noocyada xogta aljabrada (classes case) si ay u matalaan qaabeynta.
  2. Waxa jira khadad ku jira faylka qaabaynta oo aan xidhiidh la lahayn qaabaynta lafteeda: (package, import, cadeynta shay; override def's ee xuduudaha leh qiimaha caadiga ah). Tani qayb ahaan waa laga fogaan karaa haddii aad hirgeliso DSL-kaaga. Intaa waxaa dheer, noocyada kale ee qaabeynta (tusaale, XML) waxay sidoo kale ku soo rogaan xaddidaadyo gaar ah qaab dhismeedka faylka.
  3. Ujeeddooyinka qoraalkan awgeed, uma tixgelineyno dib-u-habaynta firfircoon ee koox ka mid ah noodhadhka la midka ah.

gunaanad

Maqaalkan, waxaan sahaminay fikradda ah in lagu matalo qaabeynta koodhka isha iyadoo la adeegsanayo awoodaha horumarsan ee nidaamka nooca Scala. Habkan waxaa loo isticmaali karaa codsiyo kala duwan sida beddelka hababka qaabeynta dhaqameed ee ku salaysan xml ama faylasha qoraalka. Inkasta oo tusaalaheenna lagu hirgeliyay Scala, isla fikrado la mid ah ayaa loo wareejin karaa luqadaha kale ee la soo ururiyey (sida Kotlin, C #, Swift, ...). Waxaad isku dayi kartaa habkan mid ka mid ah mashaariicda soo socda, iyo, haddii aysan shaqayn, u gudub faylka qoraalka, adoo ku daraya qaybaha maqan.

Sida caadiga ah, qaabeynta la isku duba riday waxay u baahan tahay hannaan horumarineed oo tayo sare leh. Soo noqoshada, tayada sare iyo isku halaynta qaabaynta ayaa la hubiyaa.

Habka la tixgeliyo waa la ballaarin karaa:

  1. Waxaad isticmaali kartaa macros si aad u samayso jeegaga wakhtiga la soo ururiyey.
  2. Waxaad hirgelin kartaa DSL si aad u soo bandhigto qaabeynta qaab ay heli karaan isticmaalayaasha dhamaadka.
  3. Waxaad ku hirgelin kartaa maamulka kheyraadka firfircoon adigoo si toos ah u habeynaya qaabeynta. Tusaale ahaan, bedelida tirada qanjidhada kooxdu waxay u baahan tahay in (1) nood kastaa helo qaabayn wax yar ka duwan; (2) maareeyaha kooxdu wuxuu helay macluumaadka ku saabsan qanjidhada cusub.

Mahadnaq

Waxaan jeclaan lahaa inaan u mahadceliyo Andrei Saksonov, Pavel Popov iyo Anton Nekhaev dhaleeceyntooda wax ku oolka ah ee maqaalka qabyada ah.

Source: www.habr.com

Add a comment