Yakaunganidzwa Distributed System Configuration

Ndinoda kukuudza imwe nzira inofadza yekushanda nekugadzirisa kwegadziriro yakagoverwa. Iyo gadziriso inomiririrwa zvakananga mumutauro wakanyorwa (Scala) uchishandisa akachengeteka mhando. Iyi positi inopa muenzaniso wekumisikidzwa kwakadai uye inokurukura zvakasiyana-siyana zvekushandisa dhizaini yakaunganidzwa mune yakazara budiriro maitiro.

Yakaunganidzwa Distributed System Configuration

(Chirungu)

Nhanganyaya

Kuvaka inovimbika yakagovaniswa sisitimu zvinoreva kuti ese ma node anoshandisa iyo chaiyo gadziriso, yakawiriraniswa nemamwe ma node. DevOps matekinoroji (terraform, ansible kana chimwe chinhu chakadaro) anowanzo shandiswa kugadzira otomatiki mafaera ekugadzirisa (kazhinji akananga kune imwe neimwe node). Tinoda zvakare kuve nechokwadi chekuti manodhi ese ekutaurirana ari kushandisa maprotocol akafanana (kusanganisira iyo yakafanana vhezheni). Zvikasadaro, kusapindirana kuchavakwa mune yedu yakagoverwa system. Munyika yeJVM, imwe mhedzisiro yeichi chinodikanwa ndechekuti iyo imwe vhezheni yeraibhurari ine mameseji eprotocol inofanirwa kushandiswa kwese kwese.

Zvakadini nekuedza gadziriro yakagoverwa? Ehe, isu tinofungidzira kuti zvese zvikamu zvine bvunzo dzeyuniti tisati taenda kune yekubatanidza bvunzo. (Kuti isu tiwedzere mibairo yebvunzo kunguva yekumhanya, tinofanirwa kupawo seti yakafanana yemaraibhurari padanho rekuyedza uye panguva yekumhanya.)

Paunenge uchishanda nemiedzo yekubatanidza, zvinowanzova nyore kushandisa nzira yekirasi yakafanana kwese kwese pamanodhi. Chatinofanira kuita ndechekuona kuti iyo nzira yekirasi inoshandiswa panguva yekumhanya. (Kunyange zvazvo zvichibvira zvachose kumhanyisa node dzakasiyana nemhando dzakasiyana dzekirasi, izvi zvinowedzera kuomarara kune iyo yakazara dhizaini uye kuomerwa nekutumira uye kusanganisa miedzo.) Nechinangwa cheichi chinyorwa, isu tiri kufungidzira kuti node dzese dzichashandisa nzira imwechete yekirasi.

Iyo gadziriso inoshanduka pamwe neiyo application. Isu tinoshandisa shanduro kuona matanho akasiyana ekushanduka kwechirongwa. Zvinoita sezvine musoro kuzivawo mavhezheni akasiyana ezvigadziriso. Uye isa iyo gadziriso pachayo mushanduro control system. Kana paine imwe chete gadziriso mukugadzira, saka tinogona kungoshandisa iyo vhezheni nhamba. Kana tikashandisa akawanda ekugadzira zviitiko, saka isu tichada akati wandei
configuration matavi uye imwe label kuwedzera kune shanduro (somuenzaniso, zita rebazi). Nenzira iyi tinogona kunyatsoona iyo chaiyo configuration. Imwe neimwe yekumisikidza identifier inongoenderana neyakasarudzika musanganiswa weakagoverwa node, madoko, zviwanikwa zvekunze, uye shanduro dzeraibhurari. Nechinangwa cheichi chinyorwa tichafunga kuti pane bazi rimwe chete uye tinogona kuziva gadziriso nenzira yakajairika tichishandisa nhamba nhatu dzakapatsanurwa nedoti (1.2.3).

Mumamiriro ezvinhu emazuva ano, mafaira ekugadzirisa haawanzogadzirwa nemaoko. Kazhinji ivo vanogadzirwa panguva yekutumirwa uye havachabatiki (kuitira kuti usatyora chero chinhu) Mubvunzo wechisikigo unomuka: nei tichiri kushandisa mameseji fomati kuchengetedza gadziriso? Imwe nzira inoshanda inoita kunge kugona kushandisa kodhi yenguva dzose yekugadzirisa uye kubatsirwa kubva pakuunganidza-nguva cheki.

Mune ino positi isu tichaongorora iyo pfungwa yekumiririra gadziriso mukati meyakagadzirwa artifact.

Compiled configuration

Ichi chikamu chinopa muenzaniso weiyo static compiled configuration. Masevhisi maviri akareruka anoitwa - iyo echo sevhisi uye echo sevhisi mutengi. Kubva pamasevhisi maviri aya, sarudzo mbiri dzehurongwa dzakaunganidzwa. Mune imwe sarudzo, ese masevhisi ari pane imwechete node, mune imwe sarudzo - pane dzakasiyana node.

Kazhinji dhizaini yakagoverwa ine node akati wandei. Iwe unogona kuona nodes uchishandisa kukosha kweimwe mhando NodeId:

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

kana

case class NodeId(hostName: String)

kana kunyange

object Singleton
type NodeId = Singleton.type

Node dzinoita mabasa akasiyana siyana, dzinomhanyisa masevhisi uye TCP/HTTP yekubatanidza inogona kugadzwa pakati pavo.

Kutsanangura kubatana kweTCP tinoda kanenge nhamba yechiteshi. Tinoda zvakare kuratidza iyo protocol inotsigirwa pachiteshi ichocho kuona kuti mutengi neserver vari kushandisa imwechete protocol. Tichatsanangura kubatana tichishandisa kirasi inotevera:

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

apo Port - ingori nhamba Int zvichiratidza huwandu hwehunhu hunogamuchirika:

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

Mhando dzakanatswa

Ona raibhurari yakanatswa ΠΈ zvangu chirevo. Muchidimbu, raibhurari inokubvumira kuti uwedzere zvipingamupinyi kune mhando dzinotariswa panguva yekuunganidza. Muchiitiko ichi, nhamba dzechiteshi dzinoshanda ndeye 16-bit integers. Kugadziridzwa kwakaunganidzwa, kushandisa raibhurari yakakwenenzverwa hazvisungirwe, asi inovandudza kugona kwemuumbi wekutarisa kumisikidzwa.

YeHTTP (REST) ​​maprotocol, kuwedzera kune nhamba yechiteshi, isu tingangodawo nzira yebasa:

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

Phantom marudzi

Kuti tizive iyo protocol panguva yekuunganidza, isu tinoshandisa mhando parameter isingashandiswe mukati mekirasi. Sarudzo iyi imhaka yekuti isu hatishandise muenzaniso weprotocol panguva yekumhanya, asi isu tinoda kuti mugadziri atarise kuenderana kweprotocol. Nekutsanangura iyo protocol, hatizokwanisi kupfuudza sevhisi isina kufanira sekutsamira.

Imwe yeakajairika maprotocol ndeye REST API ine Json serialization:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

apo RequestMessage - rudzi rwekukumbira, ResponseMessage - rudzi rwemhinduro.
Ehe, isu tinogona kushandisa mamwe maprotocol tsananguro inopa huchokwadi hwetsananguro yatinoda.

Nechinangwa cheichi positi, isu tichashandisa yakareruka vhezheni yeprotocol:

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

Pano chikumbiro itambo yakawedzerwa kune url uye mhinduro ndiyo tambo yakadzoserwa mumuviri wemhinduro yeHTTP.

Kugadziriswa kwesevhisi kunotsanangurwa nezita rebasa, zviteshi, uye zvinoenderana. Izvi zvinhu zvinogona kumiririrwa muScala nenzira dzinoverengeka (semuenzaniso, HList-s, algebraic data types). Nechinangwa cheichi positi, isu tichashandisa iyo Keke Patani uye tinomiririra mamodule tichishandisa trait'ov. (Pateni yekeke haisi chinhu chinodiwa pamaitiro aya. Ingori nzira imwe chete inogona kuitwa.)

Kutsamira pakati pemasevhisi kunogona kumiririrwa senzira dzinodzosera madoko EndPointemamwe ma node:

  type EchoProtocol[A] = SimpleHttpGetRest[A, A]

  trait EchoConfig[A] extends ServiceConfig {
    def portNumber: PortNumber = 8081
    def echoPort: PortWithPrefix[EchoProtocol[A]] = PortWithPrefix[EchoProtocol[A]](portNumber, "echo")
    def echoService: HttpSimpleGetEndPoint[NodeId, EchoProtocol[A]] = providedSimpleService(echoPort)
  }

Kuti ugadzire sevhisi echo, zvese zvaunoda inhamba yechiteshi uye chiratidzo chekuti chiteshi chinotsigira echo protocol. Tinogona kusataura chiteshi chaicho, nekuti... hunhu hunobvumidza iwe kuzivisa nzira pasina kuita (abstract nzira). Muchiitiko ichi, pakugadzira kongiri inogadziriswa, mugadziri angada kuti tipe kushandiswa kweiyo abstract nzira uye kupa nhamba yechiteshi. Sezvo isu takashandisa nzira, kana tichigadzira imwe gadziriso, isu tinogona kusataura imwe chiteshi. Iko kukosha kwekutanga kuchashandiswa.

Mukugadzirisa kwemutengi tinozivisa kutsamira pane echo sevhisi:

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

Kutsamira ndekwemhando imwe chete sevhisi inotengeswa kunze kwenyika echoService. Kunyanya, mune echo mutengi tinoda iyo yakafanana protocol. Naizvozvo, kana tichibatanidza masevhisi maviri, tinogona kuva nechokwadi chekuti zvese zvichashanda nemazvo.

Kuitwa kwemabasa

Basa rinodiwa kuti utange nekumisa sevhisi. (Kugona kumisa sevhisi kwakakosha pakuyedzwa.) Zvakare, pane zvakawanda zvingasarudzwa zvekushandisa chinhu chakadaro (somuenzaniso, tinogona kushandisa makirasi emhando zvichienderana nerudzi rwekugadzirisa). Nechinangwa cheichi positi isu tichashandisa iyo Keke Patani. Tichamiririra sevhisi tichishandisa kirasi cats.Resource, nokuti Kirasi iyi yatopa nzira dzekuvimbisa zvakachengeteka kuburitswa kwezviwanikwa kana paine matambudziko. Kuti tiwane sosi, tinofanirwa kupa gadziriso uye yakagadzirira-yakagadzirwa runtime mamiriro. Basa rekutanga sevhisi rinogona kutaridzika seizvi:

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

apo

  • Config - gadziriso yerudzi rwesevhisi iyi
  • AddressResolver - chinhu chekumhanya chinokutendera kuti uwane kero dzedzimwe node (ona pazasi)

nemamwe marudzi kubva muraibhurari cats:

  • F[_] - mhando yemhedzisiro (mune yakapusa kesi F[A] rinogona kungova basa () => A. Mune ino post tichashandisa cats.IO.)
  • Reader[A,B] - zvakawanda kana zvishoma zvakafanana nebasa A => B
  • cats.Resource - chishandiso chinogona kuwanikwa nekuburitswa
  • Timer - timer (inobvumidza iwe kurara kwechinguva uye kuyera nguva dzenguva)
  • ContextShift - analogi ExecutionContext
  • Applicative - yemhando yemhando kirasi iyo inokutendera iwe kusanganisa yega mhedzisiro (inenge monad). Mune mamwe maitiro akaoma zvinoratidzika zviri nani kushandisa Monad/ConcurrentEffect.

Tichishandisa iyi siginecha yebasa tinogona kuita masevhisi akati wandei. Semuenzaniso, sevhisi isingaite chinhu:

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

(Cm. mabviro, umo mamwe masevhisi anoitwa - echo service, echo client
ΠΈ lifetime controlers.)

Node chinhu chinogona kuvhura masevhisi akati wandei (kutangwa kweketani yezviwanikwa kunovimbiswa neKeke Pateni):

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

Ndokumbira utarise kuti tiri kutsanangura iyo chaiyo mhando yekumisikidzwa inodiwa kune ino node. Kana tikakanganwa kutsanangura imwe yemhando dzekugadzirisa dzinodiwa neimwe sevhisi, pachava nekukanganisa kwekuunganidza. Zvakare, isu hatizokwanisa kutanga node kunze kwekunge tapa chimwe chinhu chemhando yakakodzera nedata rese rinodiwa.

Host Zita Resolution

Kuti ubatanidze kune ari kure anogamuchira, isu tinoda chaiyo IP kero. Zvinogoneka kuti kero inozozivikanwa gare gare kupfuura mamwe ese ekugadzirisa. Saka isu tinoda basa rinogadzira iyo node ID kukero:

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

Pane nzira dzakawanda dzekuita basa iri:

  1. Kana kero dzichizivikanwa kwatiri tisati tatumirwa, saka tinogona kugadzira Scala kodhi nayo
    kero uye wobva wamhanyisa kuvaka. Izvi zvichaunganidza uye kumhanya bvunzo.
    Muchiitiko ichi, basa racho richazivikanwa statically uye rinogona kumiririrwa mukodhi semepu Map[NodeId, NodeAddress].
  2. Mune zvimwe zviitiko, kero chaiyo inongozivikanwa mushure mekunge node yatanga.
    Muchiitiko ichi, tinogona kushandisa "discovery service" inomhanya pamberi pedzimwe node uye node dzese dzichanyoresa nebasa iri uye kukumbira kero dzedzimwe node.
  3. Kana tikakwanisa kugadzirisa /etc/hosts, ipapo unogona kushandisa predefined hostnames (se my-project-main-node ΠΈ echo-backend) uye ingobatanidza mazita aya
    ine IP kero panguva yekuendesa.

Mune ino post isu hatingatarise nyaya idzi zvakadzama. Zvedu
mumuenzaniso wetoyi, node dzese dzichava neiyo IP kero - 127.0.0.1.

Tevere, isu tinofunga sarudzo mbiri dzeiyo yakagoverwa system:

  1. Kuisa masevhisi ese pane imwe node.
  2. Uye kubata iyo echo sevhisi uye echo mutengi pane dzakasiyana node.

Configuration ye node imwe:

Single node configuration

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

Chinhu chinoshandisa gadziriro yezvose mutengi uye server. Iyo nguva-ye-kurarama gadziriso inoshandiswa zvakare kuitira kuti mushure menguva lifetime kumisa chirongwa. (Ctrl-C inoshandawo uye inosunungura zviwanikwa zvese nemazvo.)

Iyo imwechete seti yekumisikidza uye kuita maitiro anogona kushandiswa kugadzira sisitimu inosanganisira nodes mbiri dzakasiyana:

Maviri node configuration

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

Zvakakosha! Cherechedza kuti masevhisi akabatanidzwa sei. Isu tinotsanangura sevhisi inoshandiswa neimwe node sekuita kweimwe node yekutsamira nzira. Rudzi rwekutsamira runotariswa nemuunganidzi, nekuti ine mhando yeprotocol. Kana uchimhanya, kutsamira kuchave nekwakaringana chinangwa node ID. Nekuda kwechirongwa ichi, isu tinotsanangudza nhamba yechiteshi kamwe chete uye tinogara tichivimbiswa kunongedzera kune chaiyo chiteshi.

Kuitwa kwemanodhi maviri ehurongwa

Nekugadziridzwa uku, isu tinoshandisa zvakafanana masevhisi kuita pasina shanduko. Musiyano chete ndewekuti isu tava nezvinhu zviviri zvinoshandisa masevhisi akasiyana-siyana:

  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
  }

Iyo yekutanga node inoshandisa sevha uye inongoda server kumisikidzwa. Yechipiri node inoshandisa mutengi uye inoshandisa chikamu chakasiyana chekugadzirisa. Zvakare ma node ese ari maviri anoda hupenyu hwese manejimendi. Iyo server node inomhanya nekusingaperi kusvika yamiswa SIGTERM'om, uye node yemutengi inopera mushure menguva yakati. Cm. launcher app.

General development process

Ngationei kuti nzira yekumisikidza iyi inobata sei maitiro ese ebudiriro.

Iyo gadziriso ichaunganidzwa pamwe chete neyakasara yekodhi uye artifact (.jar) ichagadzirwa. Zvinoita kunge zvine musoro kuisa iyo gadziriso mune yakaparadzana artifact. Izvi zvinodaro nekuti isu tinogona kuve neakawanda magadzirirwo akavakirwa pane imwechete kodhi. Zvakare, zvinokwanisika kugadzira zvigadzirwa zvinoenderana nematavi ekugadzirisa akasiyana. Kutsamira pane chaiwo mavhezheni emaraibhurari anochengetedzwa pamwe nekumisikidzwa, uye idzi shanduro dzinochengetwa nekusingaperi pese patinofunga kuendesa iyo vhezheni yekumisikidza.

Chero shanduko yekugadzirisa inoshanduka kuita shanduko yekodhi. Uye saka, mumwe nomumwe
shanduko ichavharwa neyakajairwa yemhando yekusimbisa maitiro:

Tikiti mune bug tracker -> PR -> wongororo -> batanidza nemapazi akakodzera ->
kusanganisa -> kutumira

Mhedzisiro mikuru yekuita gadziriro yakaunganidzwa ndeiyi:

  1. Iyo gadziriso ichave inowirirana pane ese manode eiyo yakagoverwa system. Nekuda kwekuti node dzese dzinogashira zvimiro zvakafanana kubva kune imwechete sosi.

  2. Zvinonetsa kushandura gadziriso mune imwe chete yemanodhi. Naizvozvo, "kugadzirisa kudonha" hakugoneke.

  3. Zvinova zvakanyanya kuoma kuita shanduko diki pakugadzirisa.

  4. Mazhinji shanduko yekumisikidza ichaitika sechikamu cheiyo yese yekuvandudza maitiro uye ichave iri pasi pekuongororwa.

Ini ndinoda nzvimbo yakaparadzana yekuchengetedza gadziriro yekugadzira? Iyi gadziriso inogona kunge iine mapassword uye rumwe ruzivo rwakadzama rwatinoda kurambidza kupinda. Kubva pane izvi, zvinoita sekunge zvine musoro kuchengeta iyo yekupedzisira gadziriso mune yakaparadzana repository. Unogona kupatsanura zvigadziriso kuita zvikamu zviviri-chimwe chine zvigadziriso zvinowanika pachena uye chimwe chine zvigadziriso. Izvi zvinobvumira vazhinji vanogadzira kuti vawane mukana kune zvakajairwa marongero. Kupatsanurwa uku kuri nyore kuwana uchishandisa epakati maitiro ane default values.

Misiyano inobvira

Ngatiedzei kuenzanisa iyo yakaunganidzwa kumisikidzwa nedzimwe nzira dzakajairika:

  1. Runyoro faira pamushini wakanangana.
  2. Centralized key-value store (etcd/zookeeper).
  3. Maitiro ekugadzirisa anogona kugadziriswa / kutangwazve pasina kutangazve maitiro.
  4. Kuchengeta gadziriso kunze kweiyo artifact uye shanduro control.

Mafaira ezvinyorwa anopa shanduko yakakosha maererano nekuchinja kudiki. Iyo system administrator inogona kupinda munzvimbo iri kure, ita shanduko kumafaira akakodzera uye wotangazve sevhisi. Kune masisitimu makuru, zvisinei, kuchinjika kwakadaro kungave kusingadiwi. Shanduko dzakaitwa hadzisiyi maronda mune mamwe masisitimu. Hapana anoongorora shanduko. Zvakaoma kuziva kuti ndiani chaizvo akaita shanduko uye nechikonzero chipi. Shanduko hadziedzwi. Kana iyo system ikagoverwa, ipapo maneja anogona kukanganwa kuita shanduko inoenderana pane dzimwe node.

(Zvinofanira kucherechedzwawo kuti kushandisa compiled configuration haivhari mukana wekushandisa matext mafaira mune ramangwana. Zvinenge zvakakwana kuwedzera parser uye validator inoburitsa mhando yakafanana neinobuda. Config, uye unogona kushandisa mameseji mafaira. Zvinobva zvangotevera kuti kuomarara kwechirongwa chine gadziriso yakabatanidzwa kunenge kushoma pane kuomarara kwehurongwa uchishandisa mameseji mafaera, nekuti. mameseji mafaera anoda imwe kodhi.)

Yepakati kiyi-kukosha chitoro inzira yakanaka yekugovera meta paramita yechishandiso chakagoverwa. Isu tinofanirwa kusarudza kuti ndezvipi zvigadziriso zvimiro uye izvo zvinongova data. Ngative nebasa C => A => B, uye parameters C Kashoma kuchinja, uye data A - kazhinji. Panyaya iyi tinogona kutaura izvozvo C - configuration parameters, uye A - data. Zvinotaridza kuti zvigadziriso zvinosiyana kubva kune data mukuti zvinowanzo chinja zvishoma pane data. Zvakare, data rinowanzouya kubva kune imwe sosi (kubva kumushandisi), uye kumisikidza paramita kubva kune imwe (kubva kune system administrator).

Kana zvisingawanzo kushandura maparamendi achida kuvandudzwa pasina kutangazve chirongwa, saka izvi zvinowanzo tungamira mukukanganisika kwechirongwa, nekuti isu tichada neimwe nzira kuendesa paramita, chengetedza, ongorora uye tarisa, uye gadzirisa maitiro asina kunaka. Nokudaro, kubva pakuona kwekuderedza kuoma kwepurogiramu, zvinonzwisisika kuderedza nhamba yezvipimo zvinogona kuchinja panguva yekushanda kwepurogiramu (kana kusatsigira mitemo yakadaro zvachose).

Nezvinangwa zvechinyorwa ichi, isu tichasiyanisa pakati peiyo static uye dynamic paramita. Kana iyo logic yebasa inoda kushandura maparameter panguva yekushanda kwechirongwa, saka isu tichadaidza ma parameter akadaro ane simba. Zvikasadaro sarudzo dzakamira uye dzinogona kugadzirwa uchishandisa yakaunganidzwa kumisikidzwa. Kuti tigadzirisezve zvine simba, isu tingangoda nzira yekutangisazve zvikamu zvechirongwa nemaparamita matsva, akafanana nematangwazve ehurongwa hwekushandisa. (Mukuona kwedu, zvinokurudzirwa kuti tidzivise kugadziridza nguva chaiyo, sezvo izvi zvichiwedzera kuoma kwehurongwa. Kana zvichibvira, zviri nani kushandisa maitiro eOS maitiro ekutangazve maitiro.)

Chimwe chinhu chakakosha chekushandisa static configuration inoita kuti vanhu vafunge dynamic reconfiguration inguva inotora kuti sisitimu itangezve mushure mekugadzirisa dhizaini (downtime). Muchokwadi, kana isu tichida kuita shanduko kune iyo static kumisikidza, isu tichafanirwa kutangazve sisitimu kuti hutsva hutsva huite. Dambudziko rekudonha rinosiyana mukuomarara kune akasiyana masisitimu. Mune zvimwe zviitiko, unogona kuronga reboot panguva iyo mutoro uri mudiki. Kana iwe uchida kupa inoenderera sevhisi, unogona kuita AWS ELB yekubatanidza inodhonza. Panguva imwecheteyo, patinenge tichida kudzoreredza sisitimu, tinotangisa muenzaniso wakafanana weiyi sisitimu, shandura iyo balancer kwairi, uye kumirira kuti kubatanidza kwekare kupedze. Mushure mekunge zvese zvakabatana zvekare zvapera, tinovhara muenzaniso wekare weiyo system.

Iye zvino ngatitarisei nyaya yekuchengetedza iyo configuration mukati kana kunze kwechigadzirwa. Kana isu tikachengeta iyo yekumisikidza mukati meiyo artifact, saka isu takave nemukana wekuona kurongeka kwekugadziriswa panguva yekusangana kweiyo artifact. Kana iyo gadziriso iri kunze kweiyo inodzorwa artifact, zvakaoma kutarisa kuti ndiani akaita shanduko kune iyi faira uye nei. Kwakakosha sei? Mune maonero edu, kune akawanda ekugadzira masisitimu zvakakosha kuve neyakagadzika uye yepamusoro-mhando yekumisikidza.

Iyo vhezheni yechigadzirwa chinokutendera kuti uone kuti yakagadzirwa riini, ndeapi makoshero airi, ndeapi mabasa anogoneswa / akaremara, uye ndiani ane chekuita nechero shanduko mukugadziriswa. Ehe, kuchengetedza iyo yekumisikidza mukati meiyo artifact kunoda kushanda nesimba, saka iwe unofanirwa kuita sarudzo ine ruzivo.

Zvakanaka nezvakaipa

Ndinoda kugara pane zvakanakira nezvayakaipira tekinoroji yakarongwa.

zvakwakanakira

Pazasi pane rondedzero yeakakosha maficha eakaunganidzwa akagoverwa akagoverwa masisitimu:

  1. Static configuration check. Inokutendera kuti uve nechokwadi nazvo
    gadziriro yacho ndeyechokwadi.
  2. Mutauro wekugadzirisa wakapfuma. Kazhinji, dzimwe nzira dzekugadzirisa dzinogumira kune tambo inochinja inotsiva zvakanyanya. Paunenge uchishandisa Scala, akasiyana siyana emitauro anowanikwa kuti uvandudze magadzirirwo ako. Somuenzaniso tinogona kushandisa
    hunhu hwekusarudzika tsika, tichishandisa zvinhu kumapoka paramita, tinogona kutaura kune vals yakaziviswa kamwe chete (DRY) mune yakavharirwa scope. Iwe unogona kusimbisa chero makirasi zvakananga mukati mekugadzirisa (Seq, Map, makirasi echivanhu).
  3. DSL. Scala ine akati wandei emitauro inoita kuti zvive nyore kugadzira DSL. Zvinogoneka kutora mukana weaya maficha uye kuita mutauro wekumisikidza uri nyore kune boka rinotarirwa revashandisi, kuitira kuti iyo gadziriso igone kuverengeka nenyanzvi dzedomasi. Nyanzvi dzinogona, semuenzaniso, kutora chikamu mukugadzirisa ongororo maitiro.
  4. Kutendeseka uye synchrony pakati nodes. Imwe yemabhenefiti ekuve nekumisikidzwa kwese kugoverwa system yakachengetwa panzvimbo imwechete ndeyekuti hunhu hwese hunoziviswa kamwe chete uye hwozoshandiswazve pese painodiwa. Kushandisa phantom marudzi kuzivisa zviteshi kunovimbisa kuti node dziri kushandisa maprotocol anoenderana mune ese akakwana masisitimu masisitimu. Kuve nekumisikidzwa kwakajeka pakati pemanodhi kunovimbisa kuti masevhisi ese akabatana.
  5. Shanduko dzemhando yepamusoro. Kuita shanduko kugadziriso uchishandisa yakajairwa kuvandudza maitiro kunoita kuti zvikwanise kuwana yakakwira mhando zviyero zvekugadzirisa zvakare.
  6. Panguva imwe chete kugadzirisa kugadzirisa. Automatic system deployment mushure mekugadzirisa shanduko inovimbisa kuti node dzese dzakagadziridzwa.
  7. Kurerutsa application. Chishandiso hachidi kupatsanurwa, kutariswa kwekugadzirisa, kana kubata zvisirizvo kukosha. Izvi zvinoderedza kuoma kwekushandisa. (Kumwe kuomarara kwekugadzirisa kunoonekwa mumuenzaniso wedu hakusi hunhu hwekugadzirisa kwakaunganidzwa, asi sarudzo yekuziva inotungamirwa nechishuwo chekupa kuchengetedzwa kwemhando yakakura.) Zviri nyore kudzokera kune yakajairwa kugadzirisa - ingoshandisa zvisipo. zvikamu. Naizvozvo, iwe unogona, semuenzaniso, kutanga neyakagadziriswa dhizaini, uchidzora kushandiswa kwezvikamu zvisingakoshi kusvika panguva yazvinonyatso kudiwa.
  8. Versified configuration. Sezvo shanduko dzemagadzirirwo dzichitevera zvakajairwa magumo edzimwe shanduko, chinobuda chatinowana iartifact ine yakasarudzika vhezheni. Izvi zvinotibvumira, semuenzaniso, kudzokera kune yakapfuura vhezheni yekumisikidza kana zvichidikanwa. Isu tinogona kushandisa kunyange gadziriso kubva gore rapfuura uye sisitimu ichashanda zvakafanana. Kugadziriswa kwakagadzikana kunovandudza kufungidzira uye kuvimbika kwegadziriro yakagoverwa. Sezvo iyo gadziriso yakamisikidzwa padanho rekubatanidza, zvakanyanya kuoma kuinyengedza mukugadzira.
  9. Modularity. Iyo yakarongwa dhizaini ndeye modular uye ma module anogona kusanganiswa nenzira dzakasiyana kugadzira akasiyana masisitimu. Kunyanya, iwe unogona kugadzirisa iyo sisitimu kuti imhanye pane imwe node mune imwe embodiment, uye pane akawanda node mune imwe. Iwe unogona kugadzira akati wandei magadzirirwo ekugadzira zviitiko zveiyo system.
  10. Testing. Nekutsiva masevhisi ega ega nezvinhu zvinoseka, unogona kuwana akati wandei mavhezheni eiyo system ari nyore kuyedza.
  11. Integration test. Kuve nekugadziriswa kumwe chete kwese kugoverwa system kunoita kuti zvikwanise kumhanyisa zvikamu zvese munzvimbo inodzorwa sechikamu chekuyedzwa kwekubatanidza. Zviri nyore kutevedzera, semuenzaniso, mamiriro ezvinhu apo dzimwe node dzinosvika.

Zvakaipa uye miganhu

Mamiriro akaunganidzwa anosiyana nedzimwe nzira dzekugadzirisa uye anogona kunge asina kukodzera kune mamwe maapplication. Pazasi pane zvimwe zvakaipira:

  1. Static configuration. Dzimwe nguva iwe unofanirwa kukurumidza kugadzirisa kurongeka mukugadzira, nekupfuura ese ekudzivirira maitiro. Nenzira iyi inogona kuva yakaoma zvikuru. Pazvishoma, kuunganidza uye kutumira otomatiki kuchave kuchidikanwa. Izvi zvose chinhu chinobatsira chemaitiro uye kukanganisa mune dzimwe nguva.
  2. Configuration generation. Kana iyo faira yekumisikidza ikagadzirwa neotomatiki chishandiso, kumwe kuedza kunogona kudikanwa kubatanidza iyo kuvaka script.
  3. Zvishandiso. Parizvino, zvishandiso uye matekiniki akagadzirirwa kushanda nekugadzirisa anobva pane zvinyorwa zvinyorwa. Haasi ese ese maturusi/ matekiniki achave aripo mune yakaunganidzwa gadziriso.
  4. Kuchinja kwemafungiro kunodiwa. Vagadziri uye DevOps vakajairira mameseji mafaera. Iwo chaiwo pfungwa yekugadzira gadziriso inogona kunge isingatarisirwe uye isina kujairika uye kukonzera kurambwa.
  5. Nzira yekusimudzira yemhando yepamusoro inodiwa. Kuti ushandise zvakanaka iyo yakarongwa kumisikidzwa, yakazara otomatiki yemaitiro ekuvaka uye kuendesa iyo application (CI/CD) inodiwa. Zvikasadaro zvichave zvisingaite.

Ngatirambei zvakare pane akati wandei ezvipimo zvemuenzaniso wakatariswa izvo zvisina hukama nepfungwa yekumisikidzwa kwakabatanidzwa:

  1. Kana tikapa ruzivo rusina kufanira rwekugadzirisa rusingashandiswe nenode, saka mugadziri haatibatsire kuona kushaikwa kwekuita. Dambudziko iri rinogona kugadziriswa nekusiya Cake Pateni uye kushandisa mamwe marudzi akaomarara, semuenzaniso, HList kana algebraic data types (kesi makirasi) kumiririra gadziriro.
  2. Kune mitsara mufaira yekumisikidza isingaenderane nekugadzirisa pachayo: (package, import,zvinhu zviziviso; override def's yemaparameter ane default values). Izvi zvinogona kudzivirirwa zvishoma kana iwe ukashandisa yako DSL. Uye zvakare, mamwe marudzi ekugadzirisa (semuenzaniso, XML) anoisawo zvimwe zvirambidzo pane iyo faira chimiro.
  3. Nechinangwa cheichi positi, isu hatisi kufunga nezve simba reconfiguration yeboka remanodhi akafanana.

mhedziso

Mune ino positi, takaongorora iyo pfungwa yekumiririra kumisikidzwa mune sosi kodhi tichishandisa hunyanzvi hwepamusoro hweScala type system. Iyi nzira inogona kushandiswa mumashandisirwo akasiyana siyana sechitsividzo chemaitiro echinyakare ekumisikidza anoenderana ne xml kana mameseji mafaera. Kunyangwe muenzaniso wedu uchiitwa muScala, iwo mazano mamwe chete anogona kuendeswa kune mimwe mitauro yakabatanidzwa (seKotlin, C #, Swift, ...). Iwe unogona kuedza nzira iyi mune imwe yeanotevera mapurojekiti, uye, kana ikasashanda, enda kune iyo text file, uchiwedzera zvisipo.

Nomuzvarirwo, yakaunganidzwa gadziriso inoda yemhando yepamusoro yekuvandudza maitiro. Mukudzoka, hukuru hwepamusoro uye kuvimbika kwezvigadziro zvinovimbiswa.

Iyo inofungidzirwa nzira inogona kuwedzerwa:

  1. Unogona kushandisa macros kuita compile-time cheki.
  2. Iwe unogona kushandisa DSL kuti uratidze gadziriro nenzira inowanikwa kune vashandi vekupedzisira.
  3. Iwe unogona kushandisa dynamic resource manejimendi ine otomatiki gadziriso gadziriso. Semuenzaniso, kushandura nhamba yemanodhi musumbu kunoda kuti (1) node imwe neimwe igamuchire gadziriso yakati siyanei; (2) maneja weboka akagamuchira ruzivo nezve node nyowani.

Kutenda

Ndinoda kutenda Andrei Saksonov, Pavel Popov naAnton Nekhaev nokuda kwekushoropodza kwavo kunovaka kwechinyorwa chekunyora.

Source: www.habr.com

Voeg