Konfigirasyon konpile nan yon sistèm distribye

Nan pòs sa a nou ta renmen pataje yon fason enteresan pou fè fas ak konfigirasyon yon sistèm distribiye.
Konfigirasyon an reprezante dirèkteman nan lang Scala nan yon fason ki an sekirite. Yon egzanp aplikasyon dekri an detay. Yo diskite plizyè aspè nan pwopozisyon an, ki gen ladan enfliyans sou pwosesis devlopman an jeneral.

Konfigirasyon konpile nan yon sistèm distribye

(an Ris)

entwodiksyon

Bati sistèm distribiye solid mande pou itilize konfigirasyon kòrèk ak aderan sou tout nœuds. Yon solisyon tipik se sèvi ak yon deskripsyon deplwaman tèks (terraform, ansible oswa yon bagay ki sanble) ak otomatikman pwodwi dosye konfigirasyon (souvan - dedye pou chak ne / wòl). Nou ta vle tou sèvi ak menm pwotokòl yo nan menm vèsyon yo sou chak nœuds kominike (otreman nou ta fè eksperyans pwoblèm enkonpatibilite). Nan mond JVM sa vle di ke omwen bibliyotèk la messagerie ta dwe nan menm vèsyon an sou tout nœuds kominike.

E tès sistèm lan? Natirèlman, nou ta dwe gen tès inite pou tout konpozan anvan ou vini nan tès entegrasyon. Pou kapab fè ekstrapolasyon rezilta tès yo sou ègzekutabl, nou ta dwe asire w ke vèsyon yo nan tout bibliyotèk yo kenbe idantik nan tou de anviwònman egzekite ak tès.

Lè w ap fè tès entegrasyon, li souvan pi fasil pou gen menm chemen klas la sou tout nœuds. Nou jis bezwen asire w ke yo itilize menm classpath la sou deplwaman. (Li posib yo sèvi ak diferan classpaths sou diferan noeuds, men li pi difisil pou reprezante konfigirasyon sa a epi deplwaye li kòrèkteman.) Se konsa, nan lòd kenbe bagay sa yo senp nou pral sèlman konsidere classpaths idantik sou tout nœuds.

Konfigirasyon gen tandans evolye ansanm ak lojisyèl an. Anjeneral nou itilize vèsyon pou idantifye divès kalite
etap nan evolisyon lojisyèl. Li sanble rezonab pou kouvri konfigirasyon anba jesyon vèsyon epi idantifye konfigirasyon diferan ak kèk etikèt. Si gen yon sèl konfigirasyon nan pwodiksyon, nou ka itilize yon sèl vèsyon kòm yon idantifyan. Pafwa nou ka gen plizyè anviwònman pwodiksyon. Ak pou chak anviwònman nou ta ka bezwen yon branch separe nan konfigirasyon. Se konsa, konfigirasyon yo ta ka make ak branch ak vèsyon inikman idantifye konfigirasyon diferan. Chak etikèt branch ak vèsyon koresponn ak yon sèl konbinezon de distribye nœuds, pò, resous ekstèn, vèsyon bibliyotèk classpath sou chak nœuds. Isit la nou pral sèlman kouvri branch nan sèl epi idantifye konfigirasyon pa yon vèsyon twa eleman desimal (1.2.3), menm jan ak lòt zafè.

Nan anviwònman modèn fichye konfigirasyon yo pa modifye manyèlman ankò. Tipikman nou jenere
fichye konfigirasyon nan moman deplwaman ak pa janm manyen yo apre sa. Se konsa, yon moun ta ka mande poukisa nou toujou itilize fòma tèks pou dosye konfigirasyon? Yon opsyon solid se mete konfigirasyon an andedan yon inite konpilasyon epi benefisye de validation konfigirasyon tan konpile.

Nan pòs sa a nou pral egzamine lide pou kenbe konfigirasyon an nan zafè konpile a.

Konfigirasyon konpile

Nan seksyon sa a nou pral diskite sou yon egzanp konfigirasyon estatik. De sèvis senp - sèvis eko ak kliyan an nan sèvis la eko yo te configuré ak aplike. Lè sa a, de sistèm distribiye diferan ak tou de sèvis yo enstansye. Youn se pou yon sèl konfigirasyon nœuds ak yon lòt youn pou de nœuds konfigirasyon.

Yon sistèm distribye tipik konsiste de kèk nœuds. Nœuds yo ka idantifye lè l sèvi avèk kèk kalite:

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

oswa jis

case class NodeId(hostName: String)

oswa menm

object Singleton
type NodeId = Singleton.type

Nœuds sa yo fè wòl divès kalite, kouri kèk sèvis epi yo ta dwe kapab kominike ak lòt nœuds yo pa mwayen koneksyon TCP/HTTP.

Pou koneksyon TCP omwen yon nimewo pò obligatwa. Nou vle tou asire w ke kliyan ak sèvè ap pale menm pwotokòl la. Yo nan lòd yo modèl yon koneksyon ant nœuds ann deklare klas sa a:

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

ki kote Port se jis yon Int nan ranje ki pèmèt:

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

Kalite rafine

wè rafine bibliyotèk. Nan ti bout tan, li pèmèt yo ajoute kontrent tan konpile nan lòt kalite. Nan ka sa Int se sèlman pèmèt yo gen valè 16-bit ki ka reprezante nimewo pò. Pa gen okenn kondisyon pou itilize bibliyotèk sa a pou apwòch konfigirasyon sa a. Li jis sanble anfòm trè byen.

Pou HTTP (REST) ​​nou ta ka bezwen tou yon chemen nan sèvis la:

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

Kalite fantom

Yo nan lòd yo idantifye pwotokòl pandan konpilasyon nou ap itilize karakteristik nan Scala nan deklare agiman kalite Protocol ki pa itilize nan klas la. Se yon sa yo rele kalite fantom. Nan ègzekutabl nou raman bezwen yon egzanp idantifyan pwotokòl, se poutèt sa nou pa estoke li. Pandan konpilasyon kalite fantom sa a bay sekirite adisyonèl. Nou pa ka pase pò ak pwotokòl kòrèk.

Youn nan pwotokòl ki pi lajman itilize se REST API ak serializasyon Json:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

ki kote RequestMessage se kalite de baz mesaj ke kliyan ka voye bay sèvè ak ResponseMessage se mesaj repons ki soti nan sèvè a. Natirèlman, nou ka kreye lòt deskripsyon pwotokòl ki espesifye pwotokòl kominikasyon an ak presizyon an vle.

Pou rezon pòs sa a nou pral itilize yon vèsyon ki pi senp nan pwotokòl la:

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

Nan pwotokòl sa a, mesaj demann yo ajoute nan url epi yo retounen mesaj repons kòm yon kòd klè.

Yon konfigirasyon sèvis ta ka dekri pa non sèvis la, yon koleksyon pò ak kèk depandans. Gen kèk fason posib pou montre tout eleman sa yo nan Scala (pa egzanp, HList, kalite done aljebrik). Pou rezon pòs sa a, nou pral sèvi ak modèl gato epi reprezante moso konbine (modil) kòm karakteristik. (Modèl gato se pa yon kondisyon pou apwòch konfigirasyon sa a. Li se jis yon aplikasyon posib nan lide a.)

Depandans yo ka reprezante lè l sèvi avèk modèl gato a kòm pwen final lòt nœuds:

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

Sèvis Echo sèlman bezwen yon pò configurÊ. Epi nou deklare ke pò sa a sipòte pwotokòl eko. Remake byen ke nou pa bezwen presize yon pò patikilye nan moman sa a, paske karakteristik yo pèmèt deklarasyon metòd abstrè. Si nou itilize metòd abstrè, du ap mande yon aplikasyon nan yon egzanp configuration. Isit la nou te bay aplikasyon an (8081) epi li pral itilize kòm valè default si nou sote li nan yon konfigirasyon konkrè.

Nou ka deklare yon depandans nan konfigirasyon kliyan sèvis eko:

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

Depandans gen menm kalite ak la echoService. An patikilye, li mande menm pwotokòl la. Pakonsekan, nou ka asire w ke si nou konekte depandans sa yo yo pral travay kòrèkteman.

Enplemantasyon sèvis yo

Yon sèvis bezwen yon fonksyon pou kòmanse ak grasyeuz fèmen. (Kapasite pou fèmen yon sèvis enpòtan pou tès la.) Ankò, gen kèk opsyon pou presize yon fonksyon konsa pou yon konfigirasyon bay (pa egzanp, nou ta ka itilize klas kalite). Pou pòs sa a nou pral itilize Cake Pattern ankò. Nou ka reprezante yon sèvis lè l sèvi avèk cats.Resource ki deja bay bracketing ak lage resous. Yo nan lòd yo jwenn yon resous nou ta dwe bay yon konfigirasyon ak kèk kontèks ègzekutabl. Se konsa, fonksyon kòmanse sèvis la ta ka sanble:

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

ki kote

  • Config — kalite konfigirasyon ki mande pou kòmanse sèvis sa a
  • AddressResolver — yon objè ègzekutabl ki gen kapasite pou jwenn adrès reyèl lòt nœuds (kontinye lekti pou plis detay).

lòt kalite yo soti cats:

  • F[_] — kalite efè (Nan ka ki pi senp la F[A] ta ka jis () => A. Nan pòs sa a nou pral itilize cats.IO.)
  • Reader[A,B] — se plis oswa mwens yon sinonim pou yon fonksyon A => B
  • cats.Resource — gen fason pou jwenn ak lage
  • Timer - pèmèt dòmi / mezire tan
  • ContextShift - analòg nan ExecutionContext
  • Applicative - anbalaj fonksyon an efè (prèske yon monad) (nou ta ka evantyèlman ranplase li ak yon lòt bagay)

Sèvi ak koòdone sa a nou ka aplike kèk sèvis. Pou egzanp, yon sèvis ki pa fè anyen:

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

(Gade nan Kòd Sous pou lòt aplikasyon sèvis - sèvis eko,
kliyan eko ta dwe apwouve bèso tibebe w la epi kontwolè pou tout lavi yo.)

Yon ne se yon sèl objè ki kouri kèk sèvis (kòmanse yon chèn resous pèmèt pa Cake Pattern):

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

Remake byen ke nan ne a nou presize kalite egzak nan konfigirasyon ki nesesè nan ne sa a. Konpilateur pa pral kite nou bati objè a (gato) ak kalite ensifizan, paske chak karakteristik sèvis deklare yon kontrent sou la. Config kalite. Epitou nou pa yo pral kapab kòmanse ne san yo pa bay konfigirasyon konplè.

Rezolisyon adrès ne

Yo nan lòd yo etabli yon koneksyon nou bezwen yon adrès lame reyèl pou chak ne. Li ta ka konnen pita pase lòt pati nan konfigirasyon an. Pakonsekan, nou bezwen yon fason yo bay yon kat ant id ne ak adrès aktyèl li a. Kat sa a se yon fonksyon:

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

Gen kèk fason posib pou aplike yon fonksyon konsa.

  1. Si nou konnen adrès aktyèl yo anvan deplwaman, pandan enstansyasyon nœuds gen tout pouvwa a, Lè sa a, nou ka jenere kòd Scala ak adrès aktyèl yo epi kouri bati a apre sa (ki fè chèk tan konpile ak Lè sa a, kouri suite tès entegrasyon). Nan ka sa a fonksyon kat nou an konnen statikman epi yo ka senplifye nan yon bagay tankou yon Map[NodeId, NodeAddress].
  2. Pafwa nou jwenn adrès aktyèl sèlman nan yon pwen pita lè nœud la aktyèlman te kòmanse, oswa nou pa gen adrès nan nœuds ki pa te kòmanse ankò. Nan ka sa a nou ta ka gen yon sèvis dekouvèt ki te kòmanse anvan tout lòt nœuds ak chak nœuds ta ka fè piblisite adrès li nan sèvis sa a epi abònman nan depandans.
  3. Si nou ka modifye /etc/hosts, nou ka itilize non lame predefini (tankou my-project-main-node ta dwe apwouve bèso tibebe w la epi echo-backend) ak jis asosye non sa a ak adrès ip nan moman deplwaman.

Nan pòs sa a nou pa kouvri ka sa yo nan plis detay. An reyalite, nan egzanp jwèt nou an, tout nœuds pral gen menm adrès IP - 127.0.0.1.

Nan pòs sa a nou pral konsidere de layout sistèm distribiye:

  1. Layout yon sèl ne, kote tout sèvis yo mete sou yon sèl ne.
  2. De layout ne, kote sèvis ak kliyan yo sou nœuds diferan.

Konfigirasyon an pou yon sèl ne layout se jan sa a:

Single konfigirasyon ne

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

Isit la nou kreye yon konfigirasyon sèl ki pwolonje tou de konfigirasyon sèvè ak kliyan. Epitou nou configured yon kontwolè lifecycle ki pral nòmalman mete fen nan kliyan ak sèvè apre lifetime entèval pase.

Menm seri aplikasyon sèvis ak konfigirasyon yo ka itilize pou kreye yon plan sistèm ak de nœuds separe. Nou jis bezwen kreye de konfigirasyon ne separe ak sèvis apwopriye yo:

De nœuds 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"
  }

Gade ki jan nou presize depandans lan. Nou mansyone sèvis lòt ne yo bay kòm yon depandans nan ne aktyèl la. Yo tcheke kalite depandans la paske li gen kalite fantom ki dekri pwotokòl. Ak nan ègzekutabl nou pral gen id la ne kòrèk. Sa a se youn nan aspè enpòtan nan apwòch konfigirasyon yo pwopoze a. Li bay nou kapasite pou mete pò sèlman yon fwa epi asire w ke nou ap fè referans pò ki kòrèk la.

De nœuds aplikasyon

Pou konfigirasyon sa a nou itilize egzakteman menm aplikasyon sèvis yo. Pa gen chanjman nan tout. Sepandan, nou kreye de aplikasyon ne diferan ki gen diferan seri sèvis:

  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
  }

Premye ne a aplike sèvè epi li sèlman bezwen konfigirasyon bò sèvè. Dezyèm ne a aplike kliyan epi li bezwen yon lòt pati nan konfigirasyon. Tou de nœuds mande pou kèk spesifikasyon pou tout lavi. Pou rezon sa a ne sèvis pòs pral gen lavi enfini ki ta ka sispann lè l sèvi avèk SIGTERM, pandan y ap kliyan eko pral fini apre konfigirasyon dire fini an. Gade la aplikasyon starter pou plis detay.

Pwosesis devlopman jeneral

Ann wè ki jan apwòch sa a chanje fason nou travay ak konfigirasyon.

Konfigirasyon an kòm kòd yo pral konpile epi pwodui yon zafè. Li sanble rezonab pou separe zafè konfigirasyon ak lòt zafè kòd. Souvan nou ka gen yon multitude de configurations sou menm baz kòd. Ak nan kou, nou ka gen plizyè vèsyon nan divès branch konfigirasyon. Nan yon konfigirasyon nou ka chwazi vèsyon patikilye nan bibliyotèk ak sa a ap rete konstan chak fwa nou deplwaye konfigirasyon sa a.

Yon chanjman konfigirasyon vin chanje kòd. Se konsa, li ta dwe kouvri pa menm pwosesis asirans kalite:

Tikè -> PR -> revizyon -> fizyone -> entegrasyon kontinyèl -> deplwaman kontinyèl

Gen konsekans sa yo nan apwòch la:

  1. Konfigirasyon an se aderan pou egzanp yon sistèm patikilye. Li sanble ke pa gen okenn fason yo gen koneksyon kòrèk ant nœuds.
  2. Li pa fasil pou chanje konfigirasyon jis nan yon sèl ne. Li sanble pa rezonab pou konekte ak chanje kèk dosye tèks. Se konsa, drift konfigirasyon vin mwens posib.
  3. Ti chanjman konfigirasyon yo pa fasil pou fè.
  4. Pifò nan chanjman konfigirasyon yo pral swiv menm pwosesis devlopman, epi li pral pase kèk revizyon.

Èske nou bezwen yon depo separe pou konfigirasyon pwodiksyon? Konfigirasyon pwodiksyon an ta ka gen enfòmasyon sansib ke nou ta renmen kenbe lwen anpil moun. Se konsa, li ta ka vo kenbe yon depo separe ak aksè restriksyon ki pral genyen konfigirasyon pwodiksyon an. Nou ka divize konfigirasyon an an de pati - youn ki gen paramèt pwodiksyon ki pi ouvè ak youn ki gen pati sekrè konfigirasyon an. Sa a ta pèmèt aksè a pi fò nan devlopè yo nan vas majorite de paramèt pandan y ap mete restriksyon sou aksè a bagay ki vrèman sansib. Li fasil pou akonpli sa lè l sèvi avèk karakteristik entèmedyè ak valè paramèt default.

Varyasyon

Ann wè avantaj ak dezavantaj apwòch yo pwopoze a konpare ak lòt teknik jesyon konfigirasyon yo.

Premye a tout, nou pral lis kèk altènativ a diferan aspè nan fason yo pwopoze a fè fas ak konfigirasyon:

  1. Fichye tèks sou machin nan sib.
  2. Depo kle-valè santralize (tankou etcd/zookeeper).
  3. Konpozan sou-pwosesis ki ta ka rekonfigire/rekòmanse san yo pa rekòmanse pwosesis.
  4. Konfigirasyon andeyò zafè ak kontwòl vèsyon.

Fichye tèks bay kèk fleksibilite an tèm de fikse ad-hoc. Administratè yon sistèm ka konekte nan ne sib la, fè yon chanjman epi tou senpleman rekòmanse sèvis la. Sa a ta ka pa bon pou pi gwo sistèm yo. Pa gen okenn tras ki rete dèyè chanjman an. Chanjman an pa revize pa yon lòt pè je. Li ta ka difisil pou chèche konnen kisa ki te lakòz chanjman an. Li pa te teste. Soti nan pèspektiv sistèm distribiye yon administratè ka tou senpleman bliye mete ajou konfigirasyon an nan youn nan lòt nœuds yo.

(Btw, si evantyèlman pral gen yon bezwen kòmanse itilize dosye konfigirasyon tèks, nou pral sèlman ajoute analizeur + validateur ki ta ka pwodwi menm bagay la. Config tape ak sa ta ase yo kòmanse itilize konfigirasyon tèks. Sa a montre tou ke konpleksite konfigirasyon tan konpile a se yon ti kras pi piti pase konpleksite konfigirasyon ki baze sou tèks, paske nan vèsyon ki baze sou tèks nou bezwen kèk kòd adisyonèl.)

Santralize depo kle-valè se yon bon mekanis pou distribye paramèt meta aplikasyon yo. Isit la nou bezwen reflechi sou sa nou konsidere kòm valè konfigirasyon ak sa ki jis done. Bay yon fonksyon C => A => B anjeneral nou rele valè ki raman chanje C "konfigirasyon", pandan ke done yo souvan chanje A - jis antre done. Konfigirasyon yo ta dwe bay fonksyon an pi bonè pase done yo A. Bay lide sa a nou ka di ke li espere frekans nan chanjman sa ki ta ka itilize yo fè distenksyon ant done konfigirasyon soti nan jis done. Epitou done tipikman soti nan yon sous (itilizatè) ak konfigirasyon soti nan yon sous diferan (admin). Fè fas ak paramèt ki ka chanje apre pwosesis inisyalizasyon an mennen nan yon ogmantasyon nan konpleksite aplikasyon an. Pou paramèt sa yo nou pral oblije okipe mekanis livrezon yo, analiz ak validation, manyen valè kòrèk. Pakonsekan, yo nan lòd yo diminye konpleksite pwogram nan, nou ta pi bon diminye kantite paramèt ki ka chanje nan ègzekutabl (oswa menm elimine yo tout ansanm).

Soti nan pèspektiv nan pòs sa a nou ta dwe fè yon distenksyon ant paramèt estatik ak dinamik. Si lojik sèvis mande pou chanjman ra nan kèk paramèt nan ègzekutabl, Lè sa a, nou ka rele yo paramèt dinamik. Sinon yo estatik epi yo ka konfigirasyon lè l sèvi avèk apwòch yo pwopoze a. Pou rekonfigirasyon dinamik lòt apwòch ta ka bezwen. Pou egzanp, pati nan sistèm nan ta ka rekòmanse ak nouvo paramèt konfigirasyon yo nan yon fason ki sanble ak rekòmanse pwosesis separe nan yon sistèm distribye.
(Opinyon enb mwen se pou fè pou evite rekonfigirasyon ègzekutabl paske li ogmante konpleksite nan sistèm nan.
Li ta ka pi senp jis konte sou sipò OS nan rekòmanse pwosesis. Menm si, li ta ka pa toujou posib.)

Youn nan aspè enpòtan nan lè l sèvi avèk konfigirasyon estatik ki pafwa fè moun konsidere konfigirasyon dinamik (san lòt rezon) se tan sèvis pandan aktyalizasyon konfigirasyon. Vreman vre, si nou dwe fè chanjman nan konfigirasyon estatik, nou dwe rekòmanse sistèm lan pou ke nouvo valè vin efikas. Kondisyon pou D 'yo varye pou diferan sistèm, kidonk li pa ta ka kritik sa a. Si li se kritik, Lè sa a, nou dwe planifye davans pou nenpòt ki rekòmanse sistèm. Pou egzanp, nou ta ka aplike AWS ELB koneksyon drenaj. Nan senaryo sa a chak fwa nou bezwen rekòmanse sistèm nan, nou kòmanse yon nouvo egzanp nan sistèm nan paralèl, Lè sa a, chanje ELB sou li, pandan y ap kite ansyen sistèm nan ranpli sèvis koneksyon ki deja egziste.

Ki sa ki sou kenbe konfigirasyon andedan asosye vèsyon oswa deyò? Kenbe konfigirasyon andedan yon zafè vle di nan pifò ka yo ke konfigirasyon sa a te pase menm pwosesis asirans kalite ak lòt zafè. Se konsa, yon moun ta ka asire w ke konfigirasyon an se nan bon jan kalite ak konfyans. Okontrè konfigirasyon nan yon dosye separe vle di ke pa gen okenn tras kiyès ak poukisa fè chanjman nan dosye sa a. Èske sa enpòtan? Nou kwè ke pou pifò sistèm pwodiksyon li pi bon pou gen konfigirasyon ki estab ak kalite siperyè.

Vèsyon nan zafè a pèmèt yo chèche konnen ki lè li te kreye, ki valè li genyen, ki karakteristik yo aktive / enfim, ki moun ki te responsab pou fè chak chanjman nan konfigirasyon an. Li ta ka mande kèk efò pou kenbe konfigirasyon andedan yon zafè epi li se yon chwa konsepsyon fè.

Avantaj ak dezavantaj

Isit la nou ta renmen mete aksan sou kèk avantaj ak diskite sou kèk dezavantaj nan apwòch yo pwopoze a.

Avantaj

Karakteristik nan konfigirasyon an konpilasyon nan yon sistèm distribye konplè:

  1. Tcheke estatik nan konfigirasyon. Sa a bay yon wo nivo konfyans, ke konfigirasyon an kòrèk bay kalite kontrent.
  2. Lang rich nan konfigirasyon. Tipikman, lòt apwòch konfigirasyon yo limite a sa ki pi varyab sibstitisyon.
    Sèvi ak Scala yon moun ka itilize yon pakèt karakteristik lang pou fè konfigirasyon pi byen. Pou egzanp, nou ka itilize karakteristik yo bay valè default, objè yo mete diferan dimansyon, nou ka refere a vals defini sèlman yon fwa nan sijè ki abòde lan ekstèn (DRY). Li posib pou itilize sekans literal, oswa egzanp sèten klas (Seq, Map, Elatriye).
  3. DSL. Scala gen sipò desan pou ekriven DSL. Yon moun ka itilize karakteristik sa yo pou etabli yon lang konfigirasyon ki pi pratik ak zanmitay pou itilizatè final la, se konsa ke konfigirasyon final la se omwen lizib pa itilizatè domèn.
  4. Entegrite ak koyerans atravè nœuds. Youn nan benefis ki genyen nan gen konfigirasyon pou tout sistèm distribye nan yon sèl kote se ke tout valè yo defini entèdi yon fwa epi Lè sa a, reyitilize nan tout kote nou bezwen yo. Epitou tape deklarasyon pò ki an sekirite asire ke nan tout konfigirasyon kòrèk posib nœuds sistèm nan pral pale menm lang. Gen depandans klè ant nœuds ki fè li difisil pou bliye bay kèk sèvis.
  5. Segondè kalite chanjman. Apwòch la an jeneral nan pase konfigirasyon chanjman nan pwosesis nòmal PR etabli estanda ki wo nan bon jan kalite tou nan konfigirasyon.
  6. Chanjman konfigirasyon similtane. Chak fwa nou fè nenpòt chanjman nan konfigirasyon deplwaman otomatik la asire ke tout nœuds yo ap mete ajou.
  7. Aplikasyon senplifikasyon. Aplikasyon an pa bezwen analize ak valide konfigirasyon epi okipe valè konfigirasyon ki pa kòrèk. Sa a senplifye aplikasyon an jeneral. (Kèk ogmantasyon konpleksite se nan konfigirasyon nan tèt li, men li se yon konsyans konsyans nan direksyon sekirite.) Li trè senp pou retounen nan konfigirasyon òdinè - jis ajoute moso ki manke yo. Li pi fasil pou kòmanse ak konfigirasyon konpile epi ranvwaye aplikasyon anplis moso nan kèk fwa pita.
  8. Konfigirasyon vèsyon. Akòz lefèt ke chanjman konfigirasyon yo swiv menm pwosesis devlopman, kòm yon rezilta nou jwenn yon zafè ak vèsyon inik. Li pèmèt nou chanje konfigirasyon tounen si sa nesesè. Nou ka menm deplwaye yon konfigirasyon ki te itilize yon ane de sa epi li pral travay egzakteman menm jan an. Konfigirasyon ki estab amelyore previzibilite ak fyab nan sistèm distribiye a. Konfigirasyon an fiks nan tan konpile epi yo pa ka fasilman manyen sou yon sistèm pwodiksyon.
  9. Modularite. Fondasyon yo pwopoze a se modilè ak modil yo ta ka konbine nan divès fason
    sipòte konfigirasyon diferan (konfigirasyon / layout). An patikilye, li posib pou gen yon ti echèl yon sèl layout ne ak yon gwo echèl milti node anviwònman. Li rezonab pou gen plizyè plan pwodiksyon.
  10. Tès. Pou rezon tès yon moun ta ka aplike yon sèvis mock epi sèvi ak li kòm yon depandans nan yon fason ki an sekirite. Gen kèk fòm tès diferan ak divès pati ki ranplase pa mok yo ta ka konsève ansanm.
  11. Tès entegrasyon. Pafwa nan sistèm distribiye li difisil pou fè tès entegrasyon. Sèvi ak apwòch ki dekri a pou tape konfigirasyon san danje nan sistèm konplè distribiye a, nou ka kouri tout pati distribiye sou yon sèl sèvè nan yon fason kontwole. Li fasil pou imite sitiyasyon an
    lè youn nan sèvis yo vin pa disponib.

Enkonvenyans

Apwòch konpile konfigirasyon an diferan de konfigirasyon "nòmal" epi li ta ka pa satisfè tout bezwen yo. Men kèk nan dezavantaj yo nan konfigirasyon an konpile:

  1. Konfigirasyon estatik. Li ta ka pa apwopriye pou tout aplikasyon yo. Nan kèk ka, gen yon bezwen byen vit fikse konfigirasyon an nan pwodiksyon kontoune tout mezi sekirite. Apwòch sa a fè li pi difisil. Konpilasyon ak redeplwaman obligatwa apre yo fin fè nenpòt chanjman nan konfigirasyon. Sa a se tou de karakteristik la ak chay la.
  2. Jenerasyon konfigirasyon. Lè kèk zouti automatisation pwodwi konfigirasyon apwòch sa a mande pou konpilasyon ki vin apre (ki ta ka an vire echwe). Li ta ka mande plis efò pou entegre etap adisyonèl sa a nan sistèm konstriksyon an.
  3. Enstriman. Gen anpil zouti nan itilize jodi a ki konte sou konfigirasyon ki baze sou tèks. Kèk nan yo
    pa pral aplikab lè konfigirasyon konpile.
  4. Yon chanjman nan mantalite nesesè. Devlopè ak DevOps yo abitye ak dosye konfigirasyon tèks yo. Lide a nan konpile konfigirasyon ta ka parèt etranj yo.
  5. Anvan entwodwi konfigirasyon konpilasyon yon pwosesis devlopman lojisyèl kalite siperyè yo mande yo.

Gen kèk limit nan egzanp lan aplike:

  1. Si nou bay konfigirasyon siplemantè ki pa mande nan aplikasyon an ne, du pa pral ede nou detekte aplikasyon an absan. Sa a ta ka adrese lè l sèvi avèk HList oswa ADTs (klas ka) pou konfigirasyon ne olye de karakteristik ak modèl gato.
  2. Nou dwe bay kèk boilerplate nan dosye konfigirasyon: (package, import, object deklarasyon;
    override def's pou paramèt ki gen valè default). Sa a ta ka pasyèlman adrese lè l sèvi avèk yon DSL.
  3. Nan pòs sa a nou pa kouvri rekonfigurasyon dinamik nan grap nan nœuds menm jan an.

konklizyon

Nan pòs sa a nou te diskite lide pou reprezante konfigirasyon dirèkteman nan kòd sous la nan yon fason ki an sekirite. Apwòch la ta ka itilize nan anpil aplikasyon kòm yon ranplasman nan xml ak lòt konfigirasyon ki baze sou tèks. Malgre ke egzanp nou an te aplike nan Scala, li ta ka tradui tou nan lòt lang konpile (tankou Kotlin, C#, Swift, elatriye). Youn ta ka eseye apwòch sa a nan yon nouvo pwojè epi, nan ka li pa anfòm byen, chanje nan fason an ansyen alamòd.

Natirèlman, konpilabl konfigirasyon mande pou pwosesis devlopman kalite siperyè. An retou li pwomèt yo bay egalman kalite siperyè konfigirasyon gaya.

Apwòch sa a ka pwolonje nan plizyè fason:

  1. Youn ta ka itilize makro pou fè validation konfigirasyon ak echwe nan tan konpile nan ka ta gen nenpòt echèk kontrent biznis-lojik.
  2. Yon DSL ta ka aplike pou reprezante konfigirasyon nan yon domèn-zanmitay fason itilizatè.
  3. Jesyon resous dinamik ak ajisteman konfigirasyon otomatik yo. Pou egzanp, lè nou ajiste kantite nœuds gwoup nou ta ka vle (1) nœuds yo jwenn yon ti kras modifye konfigirasyon; (2) manadjè gwoup pou resevwa nouvo enfòmasyon sou nœuds.

Mèsi

Mwen ta renmen di Andrey Saksonov, Pavel Popov, Anton Nehaev mèsi dèske w te bay fidbak enspirasyon sou bouyon pòs sa a ki te ede m fè li pi klè.

Sous: www.habr.com

Achte hosting serye pou sit ki gen pwoteksyon DDoS, sèvè VPS VDS 🔥 Achte yon hébergement sit entènèt serye ak pwoteksyon DDoS, sèvè VPS VDS | ProHoster