Compiled Distributed System Configuration

Kuv xav qhia rau koj txog ib qho kev nthuav mechanism rau kev ua hauj lwm nrog configuration ntawm ib tug faib system. Kev teeb tsa yog sawv cev ncaj qha hauv cov lus sau ua ke (Scala) siv hom kev nyab xeeb. Cov ntawv tshaj tawm no muab piv txwv ntawm qhov kev teeb tsa zoo li no thiab sib tham txog ntau yam ntawm kev siv ib qho kev sib sau ua ke rau hauv kev txhim kho tag nrho.

Compiled Distributed System Configuration

(lus Askiv)

Taw qhia

Tsim kom muaj kev txhim khu kev qha zoo txhais tau hais tias tag nrho cov nodes siv qhov tseeb configuration, synchronized nrog rau lwm cov nodes. DevOps technologies (terraform, ansible lossis ib yam dab tsi zoo li ntawd) feem ntau yog siv los tsim cov ntaub ntawv teeb tsa (feem ntau tshwj xeeb rau txhua qhov). Peb kuj xav kom paub tseeb tias txhua qhov kev sib txuas lus tau siv cov txheej txheem zoo ib yam (suav nrog tib lub version). Txwv tsis pub, kev tsis sib haum xeeb yuav raug tsim rau hauv peb qhov system faib. Hauv JVM ntiaj teb no, ib qho txiaj ntsig ntawm qhov yuav tsum tau ua yog tib lub tsev qiv ntawv uas muaj cov lus qhia yuav tsum siv txhua qhov chaw.

Yuav ua li cas txog kev sim ib qho kev faib tawm? Tau kawg, peb xav tias tag nrho cov khoom muaj kev sim ntsuas ua ntej peb tsiv mus rau kev sib xyaw ua ke. (Yuav kom peb ntxiv cov txiaj ntsig kev xeem mus rau lub sijhawm ua haujlwm, peb kuj yuav tsum muab cov tsev qiv ntawv zoo ib yam ntawm cov theem xeem thiab ntawm lub sijhawm ua haujlwm.)

Thaum ua haujlwm nrog kev sib koom ua ke, nws feem ntau yooj yim dua los siv tib chav kawm nyob txhua qhov chaw ntawm tag nrho cov nodes. Txhua yam peb yuav tsum tau ua yog xyuas kom meej tias tib classpath siv nyob rau hauv runtime. (Thaum nws muaj peev xwm ua tau los khiav cov nodes sib txawv nrog cov classpaths sib txawv, qhov no ntxiv qhov nyuaj rau tag nrho cov kev teeb tsa thiab teeb meem nrog kev xa mus thiab kev sib koom ua ke.) Rau lub hom phiaj ntawm cov ntawv tshaj tawm no, peb xav tias tag nrho cov nodes yuav siv tib classpath.

Lub configuration evolves nrog daim ntawv thov. Peb siv cov qauv los txheeb xyuas cov theem sib txawv ntawm qhov kev hloov pauv. Nws zoo li muaj laj thawj los txheeb xyuas qhov sib txawv ntawm kev teeb tsa. Thiab tso lub configuration nws tus kheej nyob rau hauv lub version tswj system. Yog tias tsuas muaj ib qho kev teeb tsa hauv kev tsim khoom, ces peb tsuas tuaj yeem siv tus lej version. Yog tias peb siv ntau qhov kev tsim khoom, ces peb yuav xav tau ntau yam
configuration ceg thiab ib daim ntawv lo ntxiv rau lub version (piv txwv li, lub npe ntawm ceg). Txoj kev no peb tuaj yeem txheeb xyuas qhov tseeb ntawm kev teeb tsa. Txhua tus cim kev teeb tsa tshwj xeeb sib raug rau ib qho kev sib koom ua ke ntawm cov nodes, chaw nres nkoj, cov peev txheej sab nraud, thiab cov tsev qiv ntawv versions. Rau lub hom phiaj ntawm cov ntawv tshaj tawm no peb yuav xav tias tsuas muaj ib ceg thiab peb tuaj yeem txheeb xyuas qhov kev teeb tsa raws li ib txwm siv peb tus lej sib cais los ntawm ib qho (1.2.3).

Hauv ib puag ncig niaj hnub no, cov ntaub ntawv teeb tsa tsis tshua muaj tsim manually. Ntau zaus lawv raug tsim tawm thaum lub sijhawm xa mus thiab tsis tau kov lawm (yog li ntawd tsis txhob tawg dab tsi). Ib lo lus nug ntuj tshwm sim: vim li cas peb tseem siv cov ntawv nyeem los khaws cov teeb tsa? Ib qho kev siv tau zoo li yog lub peev xwm los siv cov cai tsis tu ncua rau kev teeb tsa thiab tau txais txiaj ntsig los ntawm kev txheeb xyuas lub sijhawm.

Hauv cov ntawv tshaj tawm no peb yuav tshawb txog lub tswv yim ntawm kev sawv cev rau kev teeb tsa hauv ib qho khoom cuav uas muab tso ua ke.

Compiled configuration

Tshooj lus no muab ib qho piv txwv ntawm kev teeb tsa zoo li qub. Ob qhov kev pabcuam yooj yim tau ua tiav - kev pabcuam ncha thiab tus neeg siv lub suab nrov. Raws li ob qhov kev pabcuam no, ob txoj kev xaiv tau sib sau ua ke. Hauv ib qho kev xaiv, ob qho kev pabcuam yog nyob ntawm tib lub node, hauv lwm qhov kev xaiv - ntawm cov nodes sib txawv.

Feem ntau, ib qho kev faib tawm muaj ntau cov nodes. Koj tuaj yeem txheeb xyuas cov nodes siv qhov tseem ceeb ntawm qee hom NodeId:

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

los yog

case class NodeId(hostName: String)

los sis txawm

object Singleton
type NodeId = Singleton.type

Nodes ua ntau lub luag haujlwm, lawv khiav cov kev pabcuam thiab TCP / HTTP kev sib txuas tuaj yeem tsim los ntawm lawv.

Txhawm rau piav qhia txog TCP kev sib txuas peb xav tau yam tsawg kawg ntawm tus lej chaw nres nkoj. Peb kuj xav kom muaj kev cuam tshuam cov txheej txheem uas tau txais kev txhawb nqa ntawm qhov chaw nres nkoj kom ntseeg tau tias ob tus neeg siv khoom thiab cov neeg siv khoom siv tib txoj cai. Peb yuav piav qhia txog kev sib txuas siv cov chav kawm hauv qab no:

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

qhov twg Port - tsuas yog tus lej Int qhia qhov ntau ntawm cov txiaj ntsig tau txais:

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

Refined hom

Saib lub tsev qiv ntawv ua kom zoo ΠΈ kuv qhia. Hauv luv luv, lub tsev qiv ntawv tso cai rau koj ntxiv cov kev txwv rau cov hom uas tau kuaj xyuas ntawm lub sijhawm sau. Hauv qhov no, qhov chaw nres nkoj siv tau qhov tseem ceeb yog 16-ntsis integers. Rau ib tug muab tso ua ke configuration, siv lub refined tsev qiv ntawv tsis yog yuav tsum tau, tab sis nws txhim kho lub compiler lub peev xwm los xyuas cov configuration.

Rau HTTP (REST) ​​cov txheej txheem, ntxiv rau tus lej chaw nres nkoj, peb kuj yuav xav tau txoj hauv kev rau kev pabcuam:

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

Phantom hom

Txhawm rau txheeb xyuas cov txheej txheem ntawm lub sijhawm sau, peb siv hom parameter uas tsis siv hauv chav kawm. Qhov kev txiav txim siab no yog vim qhov tseeb tias peb tsis siv tus txheej txheem piv txwv ntawm lub sijhawm ua haujlwm, tab sis peb xav kom lub compiler los xyuas qhov kev sib raug zoo ntawm cov txheej txheem. Los ntawm kev qhia txog cov txheej txheem, peb yuav tsis tuaj yeem dhau qhov kev pabcuam tsis tsim nyog raws li kev nyob.

Ib qho ntawm cov kev cai sib xws yog REST API nrog Json serialization:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

qhov twg RequestMessage - hom kev thov, ResponseMessage β€” hom teb.
Tau kawg, peb tuaj yeem siv lwm cov txheej txheem piav qhia uas muab qhov tseeb ntawm cov lus piav qhia peb xav tau.

Rau lub hom phiaj ntawm cov ntawv tshaj tawm no, peb yuav siv qhov yooj yim version ntawm tus txheej txheem:

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

Ntawm no qhov kev thov yog ib txoj hlua txuas ntxiv rau url thiab cov lus teb yog cov hlua xa rov qab rau hauv lub cev ntawm HTTP teb.

Cov kev pab cuam configuration yog piav los ntawm kev pab lub npe, ports, thiab dependencies. Cov ntsiab lus no tuaj yeem sawv cev hauv Scala hauv ntau txoj hauv kev (piv txwv li, HList-s, algebraic data type). Rau lub hom phiaj ntawm cov ncej no, peb yuav siv lub ncuav mog qab zib qauv thiab sawv cev modules siv trait's. (Lub ncuav mog qab zib qauv tsis yog ib qho tseem ceeb ntawm txoj hauv kev no. Nws tsuas yog ib qho ua tau.)

Dependencies ntawm cov kev pab cuam tuaj yeem sawv cev raws li cov txheej txheem uas xa rov qab cov chaw nres nkoj EndPoint's ntawm lwm cov nodes:

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

Txhawm rau tsim ib qho kev pabcuam ncha, txhua yam koj xav tau yog tus lej chaw nres nkoj thiab qhov qhia tau tias qhov chaw nres nkoj txhawb nqa ncha raws tu qauv. Peb yuav tsis qhia qhov chaw nres nkoj tshwj xeeb, vim tias ... Cov yam ntxwv tso cai rau koj tshaj tawm txoj hauv kev yam tsis muaj kev siv (kev paub daws teeb meem). Nyob rau hauv cov ntaub ntawv no, thaum tsim ib qho kev configuration, lub compiler yuav kom peb muab ib qho kev siv ntawm abstract method thiab muab ib tug port tooj. Txij li thaum peb tau siv txoj kev, thaum tsim ib qho kev teeb tsa tshwj xeeb, peb yuav tsis qhia qhov chaw nres nkoj sib txawv. Tus nqi qub yuav raug siv.

Hauv kev teeb tsa tus neeg siv khoom peb tshaj tawm qhov kev vam khom rau kev pabcuam ncha:

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

Qhov kev vam khom yog tib yam li cov kev pabcuam xa tawm echoService. Tshwj xeeb, hauv cov neeg siv ncha peb xav tau tib txoj cai. Yog li ntawd, thaum txuas ob qhov kev pabcuam, peb tuaj yeem paub tseeb tias txhua yam yuav ua haujlwm raug.

Kev siv cov kev pabcuam

Ib txoj haujlwm yuav tsum tau pib thiab nres qhov kev pabcuam. (Lub peev xwm los nres ib qho kev pabcuam yog qhov tseem ceeb rau kev sim.) Ib zaug ntxiv, muaj ntau txoj hauv kev rau kev siv cov yam ntxwv zoo li no (piv txwv li, peb tuaj yeem siv cov chav kawm raws li hom kev teeb tsa). Rau lub hom phiaj ntawm tsab ntawv no, peb yuav siv lub ncuav mog qab zib. Peb yuav sawv cev rau qhov kev pabcuam uas siv cov chav kawm cats.Resource, vim Cov chav kawm no twb muab txhais tau tias kom muaj kev nyab xeeb rau kev tso tawm cov peev txheej thaum muaj teeb meem. Txhawm rau kom tau txais cov peev txheej, peb yuav tsum muab kev teeb tsa thiab lub sijhawm ua tiav cov ntsiab lus ua tiav. Qhov kev pabcuam pib ua haujlwm tuaj yeem zoo li no:

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

qhov twg

  • Config - hom kev teeb tsa rau qhov kev pabcuam no
  • AddressResolver - cov khoom siv sijhawm ua haujlwm uas tso cai rau koj tshawb pom qhov chaw nyob ntawm lwm cov nodes (saib hauv qab)

thiab lwm yam los ntawm lub tsev qiv ntawv cats:

  • F[_] - hom nyhuv (hauv qhov yooj yim tshaj plaws F[A] tuaj yeem ua haujlwm xwb () => A. Hauv tsab ntawv no peb yuav siv cats.IO.)
  • Reader[A,B] - ntau dua lossis tsawg dua synonymous nrog kev ua haujlwm A => B
  • cats.Resource - Cov peev txheej tuaj yeem tau txais thiab tso tawm
  • Timer - timer (tso cai rau koj tsaug zog ib pliag thiab ntsuas lub sijhawm sib nrug)
  • ContextShift - analog ExecutionContext
  • Applicative - cov chav kawm muaj txiaj ntsig uas tso cai rau koj los ua ke cov teebmeem ntawm tus kheej (yuav luag yog monad). Hauv kev siv ntau dua nws zoo li siv tau Monad/ConcurrentEffect.

Siv qhov kos npe ua haujlwm no peb tuaj yeem siv ntau yam kev pabcuam. Piv txwv li, ib qho kev pabcuam uas tsis muaj dab tsi:

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

(Cm. lub hauv paus, nyob rau hauv uas lwm yam kev pab cuam yog siv - kev pabcuam, echo tus neeg siv khoom
ΠΈ cov tswj lub neej.)

Ib lub pob yog ib yam khoom uas tuaj yeem tso tawm ntau qhov kev pabcuam (kev xa tawm ntawm cov saw ntawm cov peev txheej tau lees paub los ntawm Cake Pattern):

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

Thov nco ntsoov tias peb tab tom qhia meej hom kev teeb tsa uas yuav tsum tau ua rau lub node. Yog tias peb tsis nco qab qhia ib qho ntawm cov kev teeb tsa uas xav tau los ntawm ib qho kev pabcuam tshwj xeeb, yuav muaj qhov yuam kev sib sau ua ke. Tsis tas li ntawd, peb yuav tsis tuaj yeem pib lub node tshwj tsis yog tias peb muab qee yam khoom ntawm hom tsim nyog nrog tag nrho cov ntaub ntawv tsim nyog.

Kev daws teeb meem lub npe tswv

Txhawm rau txuas mus rau tus tswv tsev nyob deb, peb xav tau qhov chaw nyob IP tiag. Nws yog qhov ua tau tias qhov chaw nyob yuav paub tom qab tshaj qhov seem ntawm kev teeb tsa. Yog li peb xav tau ib txoj haujlwm uas qhia cov node ID rau qhov chaw nyob:

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

Muaj ntau txoj hauv kev los siv qhov haujlwm no:

  1. Yog tias qhov chaw nyob paub peb ua ntej xa mus, peb tuaj yeem tsim Scala code nrog
    chaw nyob thiab ces khiav lub build. Qhov no yuav sau thiab ua cov kev xeem.
    Hauv qhov no, cov haujlwm yuav raug paub zoo thiab tuaj yeem sawv cev hauv cov lej raws li daim ntawv qhia Map[NodeId, NodeAddress].
  2. Qee zaum, qhov chaw nyob tiag tsuas yog paub tom qab lub node tau pib.
    Hauv qhov no, peb tuaj yeem siv "kev pabcuam tshawb nrhiav" uas khiav ua ntej lwm cov nodes thiab tag nrho cov nodes yuav sau npe nrog cov kev pabcuam no thiab thov qhov chaw nyob ntawm lwm cov nodes.
  3. Yog peb hloov tau /etc/hosts, ces koj tuaj yeem siv predefined hostnames (xws li my-project-main-node ΠΈ echo-backend) thiab tsuas txuas cov npe no
    nrog IP chaw nyob thaum xa tawm.

Hauv tsab xov xwm no peb yuav tsis xav txog cov xwm txheej no kom ntxaws ntxiv. Rau peb
Hauv qhov piv txwv khoom ua si, tag nrho cov nodes yuav muaj tib qhov chaw nyob IP - 127.0.0.1.

Tom ntej no, peb xav txog ob txoj kev xaiv rau ib qho kev faib tawm:

  1. Muab tag nrho cov kev pabcuam ntawm ib qho.
  2. Thiab hosting cov kev pabcuam ncha thiab ncha tus neeg siv khoom ntawm cov nodes sib txawv.

Configuration rau ib nod:

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

Cov khoom siv lub configuration ntawm ob tus neeg siv khoom thiab server. Ib lub sij hawm-rau-nyob configuration kuj yog siv kom tom qab lub caij lifetime xaus qhov kev pab cuam. (Ctrl-C kuj ua haujlwm thiab tso tawm tag nrho cov peev txheej kom raug.)

Tib txheej ntawm kev teeb tsa thiab kev coj ua zoo tuaj yeem siv los tsim ib qho system uas muaj ob leeg nodes:

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

Tseem ceeb! Daim ntawv ceeb toom yuav ua li cas cov kev pabcuam txuas nrog. Peb qhia kom meej ib qho kev pabcuam siv los ntawm ib lub node raws li kev siv ntawm lwm qhov ntawm txoj kev vam khom. Hom kev vam khom yog kuaj los ntawm lub compiler, vim muaj hom raws tu qauv. Thaum khiav, qhov kev vam khom yuav muaj qhov tseeb lub hom phiaj ntawm tus ID. Ua tsaug rau cov tswv yim no, peb qhia tus lej chaw nres nkoj raws nraim ib zaug thiab yeej ib txwm lav kom xa mus rau qhov chaw nres nkoj kom raug.

Kev siv ntawm ob qhov system nodes

Rau qhov kev teeb tsa no, peb siv cov kev pabcuam tib yam tsis muaj kev hloov pauv. Qhov sib txawv tsuas yog tias tam sim no peb muaj ob yam khoom siv uas siv cov kev pabcuam sib txawv:

  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
  }

Thawj node siv lub server thiab tsuas yog xav tau kev teeb tsa server. Qhov thib ob node siv tus neeg siv khoom thiab siv qhov sib txawv ntawm kev teeb tsa. Tsis tas li ntawd ob lub nodes xav tau kev tswj lub neej. Tus neeg rau zaub mov node khiav indefinitely kom txog thaum nws nres SIGTERM'om, thiab tus neeg siv khoom node xaus tom qab qee lub sijhawm. Cm. launcher app.

Txoj kev loj hlob dav dav

Cia peb saib seb qhov kev teeb tsa no cuam tshuam li cas rau txoj kev txhim kho tag nrho.

Cov kev teeb tsa yuav muab tso ua ke nrog rau qhov seem ntawm cov lej thiab cov khoom cuav (.jar) yuav raug tsim tawm. Nws zoo nkaus li ua kom muaj kev nkag siab los muab cov kev teeb tsa hauv ib qho khoom ntiag tug. Qhov no yog vim peb tuaj yeem muaj ntau yam kev teeb tsa raws li tib txoj cai. Ntxiv dua thiab, nws muaj peev xwm tsim cov khoom cuav sib xws rau cov ceg sib txawv. Kev vam khom rau cov ntawv tshwj xeeb ntawm cov tsev qiv ntawv tau txais kev cawmdim nrog rau kev teeb tsa, thiab cov qauv no tau txais kev cawmdim mus ib txhis thaum twg peb txiav txim siab xa cov qauv ntawd ntawm kev teeb tsa.

Txhua qhov kev hloov pauv hloov pauv mus rau qhov hloov pauv code. Thiab yog li ntawd, txhua tus
Qhov kev hloov pauv yuav raug them los ntawm cov txheej txheem kev lees paub zoo:

Daim pib nyob rau hauv tus kab mob tracker -> PR -> tshuaj xyuas -> ua ke nrog cov ceg ntoo cuam tshuam ->
integration -> deployment

Cov txiaj ntsig tseem ceeb ntawm kev siv ib qho kev sib sau ua ke yog:

  1. Lub configuration yuav zoo ib yam nyob rau hauv tag nrho cov nodes ntawm faib system. Vim lub fact tias tag nrho cov nodes tau txais tib configuration los ntawm ib qhov chaw.

  2. Nws yog teeb meem los hloov cov kev teeb tsa hauv ib qho ntawm cov nodes xwb. Yog li ntawd, "configuration drift" tsis zoo li.

  3. Nws dhau los ua qhov nyuaj dua los hloov me me rau kev teeb tsa.

  4. Feem ntau cov kev hloov pauv yuav tshwm sim raws li ib feem ntawm kev txhim kho tag nrho thiab yuav raug tshuaj xyuas.

Kuv puas xav tau ib lub repository cais los khaws cov kev tsim khoom? Qhov kev teeb tsa no yuav muaj cov passwords thiab lwm cov ntaub ntawv rhiab uas peb xav txwv kev nkag mus. Raws li qhov no, nws zoo li ua rau kev txiav txim siab khaws cov kev teeb tsa zaum kawg hauv ib qho chaw cia khoom cais. Koj tuaj yeem faib cov kev teeb tsa ua ob ntu - ib qho uas muaj cov kev teeb tsa tuaj yeem siv tau rau pej xeem thiab ib qho uas muaj cov chaw txwv. Qhov no yuav tso cai rau cov neeg tsim khoom feem ntau muaj kev nkag mus rau cov chaw sib xws. Qhov kev sib cais no yooj yim kom ua tiav siv cov yam ntxwv nruab nrab uas muaj qhov tseem ceeb.

Kev hloov pauv tau

Cia peb sim los sib piv cov kev teeb tsa uas tau muab tso ua ke nrog qee qhov kev xaiv:

  1. Cov ntawv nyeem ntawm lub hom phiaj tshuab.
  2. Centralized lub khw muag khoom tseem ceeb (etcd/zookeeper).
  3. Cov txheej txheem cov txheej txheem uas tuaj yeem kho dua / rov pib dua yam tsis tau rov pib txheej txheem.
  4. Khaws kev teeb tsa sab nraud ntawm artifact thiab version tswj.

Cov ntawv nyeem cov ntaub ntawv muab qhov yooj yim ntawm cov kev hloov me me. Tus neeg khiav dej num tuaj yeem nkag mus rau hauv cov chaw taws teeb, hloov pauv cov ntaub ntawv tsim nyog thiab rov pib qhov kev pabcuam. Rau cov tshuab loj, txawm li cas los xij, xws li kev hloov pauv yuav tsis xav tau. Cov kev hloov pauv tau ua rau tsis muaj kab nyob hauv lwm lub tshuab. Tsis muaj leej twg tshuaj xyuas qhov kev hloov pauv. Nws yog ib qho nyuaj rau kev tsim kom muaj leej twg ua qhov kev hloov pauv thiab vim li cas. Kev hloov pauv tsis raug sim. Yog tias lub kaw lus tau muab faib, ces tus thawj coj yuav hnov ​​​​qab ua qhov hloov pauv ntawm lwm cov nodes.

(Nws kuj yuav tsum tau muab sau tseg tias siv ib tug compiled configuration tsis kaw qhov muaj peev xwm ntawm kev siv cov ntawv nyeem nyob rau hauv lub neej yav tom ntej. Config, thiab koj tuaj yeem siv cov ntawv nyeem. Nws tam sim ntawd ua raws li qhov nyuaj ntawm lub kaw lus nrog kev teeb tsa ua ke yog me ntsis tsawg dua qhov nyuaj ntawm lub kaw lus siv cov ntawv nyeem, vim cov ntawv nyeem xav tau cov lej ntxiv.)

Lub khw muag khoom tseem ceeb hauv nruab nrab yog lub tswv yim zoo rau kev faib cov meta tsis ntawm daim ntawv thov faib. Peb yuav tsum txiav txim siab dab tsi yog configuration parameters thiab dab tsi yog cov ntaub ntawv xwb. Cia peb muaj lub luag haujlwm C => A => B, thiab parameters C tsis tshua muaj kev hloov pauv, thiab cov ntaub ntawv A - feem ntau. Hauv qhov no peb tuaj yeem hais qhov ntawd C - configuration parameters, thiab A - cov ntaub ntawv. Nws zoo nkaus li tias kev teeb tsa tsis sib txawv ntawm cov ntaub ntawv uas lawv feem ntau hloov pauv tsawg dua li cov ntaub ntawv. Tsis tas li ntawd, cov ntaub ntawv feem ntau yog los ntawm ib qhov chaw (los ntawm tus neeg siv), thiab kev teeb tsa tsis tau los ntawm lwm tus (los ntawm tus thawj tswj hwm lub cev).

Yog tias tsis tshua muaj kev hloov pauv yuav tsum tau hloov kho yam tsis tau rov pib dua qhov program, qhov no feem ntau tuaj yeem ua rau muaj teeb meem ntawm qhov program, vim tias peb yuav xav tau qee yam khoom xa tuaj, khaws cia, txheeb xyuas thiab txheeb xyuas, thiab cov txheej txheem tsis raug. Yog li ntawd, los ntawm qhov pom ntawm kev txo qis qhov nyuaj ntawm qhov kev zov me nyuam, nws ua rau kev txiav txim siab txo tus lej ntawm qhov tsis tuaj yeem hloov pauv thaum lub sijhawm ua haujlwm (lossis tsis txhawb cov kev txwv no txhua).

Rau lub hom phiaj ntawm cov ncej no, peb yuav sib txawv ntawm qhov zoo li qub thiab dynamic tsis. Yog hais tias lub logic ntawm qhov kev pab cuam yuav tsum tau hloov tsis tau thaum lub sij hawm ua hauj lwm ntawm qhov kev pab cuam, ces peb yuav hu rau cov tsis muaj dynamic. Txwv tsis pub cov kev xaiv yog zoo li qub thiab tuaj yeem teeb tsa siv cov kev teeb tsa uas tau muab tso ua ke. Rau dynamic reconfiguration, tej zaum peb yuav xav tau ib tug mechanism rau restart qhov chaw ntawm qhov kev pab cuam nrog tshiab tsis, zoo ib yam li yuav ua li cas operating system txheej txheem yog restarted. (Nyob rau hauv peb lub tswv yim, nws yog advisable kom tsis txhob reconfiguration ntawm real-time reconfiguration, vim hais tias qhov no ua rau kom lub complexity ntawm lub system. Yog hais tias ua tau, nws yog zoo dua mus siv tus txheej txheem OS peev xwm rau restarting txheej txheem.)

Ib qho tseem ceeb ntawm kev siv cov kev teeb tsa zoo li qub uas ua rau tib neeg xav txog dynamic reconfiguration yog lub sij hawm nws yuav siv sij hawm rau lub system reboot tom qab ib tug configuration hloov tshiab (downtime). Qhov tseeb, yog tias peb yuav tsum tau hloov pauv rau qhov kev teeb tsa zoo li qub, peb yuav tau rov pib lub kaw lus rau cov txiaj ntsig tshiab kom siv tau. Qhov teeb meem downtime sib txawv hauv qhov hnyav rau cov tshuab sib txawv. Qee zaum, koj tuaj yeem teem sijhawm rov pib dua thaum lub sijhawm thauj khoom tsawg. Yog tias koj xav tau muab kev pabcuam txuas ntxiv, koj tuaj yeem siv tau AWS ELB connection draining. Nyob rau tib lub sijhawm, thaum peb xav tau reboot lub kaw lus, peb tso ib qho piv txwv ntawm qhov system no, hloov qhov sib npaug rau nws, thiab tos cov kev sib txuas qub kom tiav. Tom qab tag nrho cov kev sib txuas qub tau xaus, peb kaw qhov qub piv txwv ntawm qhov system.

Cia peb tam sim no xav txog qhov teeb meem ntawm kev khaws cov kev teeb tsa sab hauv lossis sab nraum cov khoom qub. Yog hais tias peb khaws cov configuration nyob rau hauv ib tug artifact, ces tsawg kawg peb muaj lub sij hawm los xyuas qhov tseeb ntawm configuration thaum lub sij hawm sib dhos ntawm artifact. Yog tias qhov kev teeb tsa nyob sab nraum cov khoom ntiag tug tswj, nws nyuaj rau taug qab leej twg tau hloov pauv rau cov ntaub ntawv no thiab yog vim li cas. Nws tseem ceeb npaum li cas? Nyob rau hauv peb lub tswv yim, rau ntau ntau lawm tshuab nws yog ib qho tseem ceeb kom muaj ib tug ruaj khov thiab high-zoo configuration.

Cov qauv ntawm cov khoom cuav tso cai rau koj los txiav txim siab thaum twg nws tau tsim, nws muaj nuj nqis dab tsi, cov haujlwm dab tsi tau qhib / xiam oob qhab, thiab leej twg yog lub luag haujlwm rau kev hloov pauv hauv kev teeb tsa. Ntawm chav kawm, khaws cov kev teeb tsa hauv ib qho khoom qub yuav tsum muaj kev siv zog, yog li koj yuav tsum tau txiav txim siab paub.

Pros thiab cons

Kuv xav nyob ntawm qhov zoo thiab qhov tsis zoo ntawm cov txheej txheem thev naus laus zis.

zoo

Hauv qab no yog ib daim ntawv teev cov yam ntxwv tseem ceeb ntawm ib tug compiled faib system configuration:

  1. Static configuration check. Tso cai rau koj kom paub tseeb tias
    lub configuration yog lawm.
  2. Cov lus nplua nuj configuration. Feem ntau, lwm txoj hauv kev teeb tsa tsuas yog txwv rau txoj hlua hloov pauv hloov pauv feem ntau. Thaum siv Scala, ntau hom lus muaj peev xwm los txhim kho koj qhov kev teeb tsa. Piv txwv li peb tuaj yeem siv
    Cov yam ntxwv rau qhov tseem ceeb, siv cov khoom rau pawg tsis muaj, peb tuaj yeem xa mus rau cov vals tshaj tawm ib zaug (DRY) hauv qhov chaw kaw. Koj tuaj yeem instantiate txhua chav kawm ncaj qha hauv kev teeb tsa (Seq, Map, cov chav kawm kev cai).
  3. DSL. Scala muaj ntau hom lus uas ua rau nws yooj yim dua los tsim DSL. Nws tuaj yeem ua kom zoo dua ntawm cov yam ntxwv no thiab siv cov lus teeb tsa uas yooj yim dua rau cov hom phiaj ntawm cov neeg siv, kom qhov kev teeb tsa tsawg kawg tau nyeem tau los ntawm cov kws tshaj lij sau npe. Piv txwv li, cov kws tshaj lij tuaj yeem koom nrog cov txheej txheem tshuaj xyuas kev teeb tsa.
  4. Kev ncaj ncees thiab synchrony ntawm nodes. Ib qho ntawm qhov zoo ntawm kev muaj kev teeb tsa ntawm tag nrho cov txheej txheem faib khoom khaws cia ntawm ib qho taw tes yog tias tag nrho cov txiaj ntsig tau tshaj tawm raws nraim ib zaug thiab rov siv dua qhov twg lawv xav tau. Siv hom phantom los tshaj tawm cov chaw nres nkoj kom ntseeg tau tias cov nodes siv cov txheej txheem sib xws hauv txhua qhov kev teeb tsa raug. Muaj qhov yuav tsum tau ua kom pom tseeb ntawm cov nodes kom ntseeg tau tias txhua qhov kev pabcuam txuas nrog.
  5. Kev hloov pauv zoo. Kev hloov pauv rau kev teeb tsa siv cov txheej txheem kev txhim kho ib txwm ua kom ua tiav cov qauv zoo rau kev teeb tsa thiab.
  6. Simultaneous configuration hloov tshiab. Tsis siv neeg xa khoom siv tom qab kev hloov pauv kom ntseeg tau tias txhua qhov nodes tau hloov kho.
  7. Simplifying daim ntawv thov. Daim ntawv thov tsis xav tau parsing, configuration checking, los yog tuav cov nqi tsis raug. Qhov no txo ​​qhov nyuaj ntawm daim ntawv thov. (Ib co configuration complexity pom nyob rau hauv peb piv txwv tsis yog ib tug cwj pwm ntawm lub compiled configuration, tab sis tsuas yog ib tug nco qab kev txiav txim siab uas tau tsav los ntawm lub siab xav muab ntau hom kev nyab xeeb.) Nws yog ib qho yooj yim mus rov qab mus rau lub niaj zaus configuration - tsuas yog siv cov uas ploj lawm. ntu. Yog li ntawd, koj tuaj yeem, piv txwv li, pib nrog kev teeb tsa ua ke, ncua kev siv cov khoom tsis tsim nyog kom txog rau thaum lub sijhawm xav tau tiag tiag.
  8. Versified configuration. Txij li cov kev hloov pauv hloov ua raws li txoj hmoo ib txwm muaj ntawm lwm yam kev hloov pauv, cov zis peb tau txais yog ib qho khoom qub nrog ib qho tshwj xeeb version. Qhov no tso cai rau peb, piv txwv li, rov qab mus rau yav dhau los version ntawm kev teeb tsa yog tias tsim nyog. Peb tuaj yeem siv qhov kev teeb tsa los ntawm ib xyoos dhau los thiab lub kaw lus yuav ua haujlwm zoo ib yam. Ib qho kev teeb tsa ruaj khov txhim kho qhov kev kwv yees thiab kev ntseeg tau ntawm kev faib tawm. Txij li thaum lub configuration yog tsau nyob rau hauv lub compilation theem, nws yog heev nyuaj rau fake nws nyob rau hauv ntau lawm.
  9. Modularity. Lub moj khaum uas tau thov yog modular thiab cov modules tuaj yeem ua ke hauv ntau txoj hauv kev los tsim cov tshuab sib txawv. Tshwj xeeb, koj tuaj yeem teeb tsa lub kaw lus kom khiav ntawm ib qho ntawm ib qho ntawm ib qho embodiment, thiab ntawm ntau qhov ntawm lwm qhov. Koj tuaj yeem tsim ntau qhov kev teeb tsa rau kev tsim khoom ntawm qhov system.
  10. Kev sim. Los ntawm kev hloov cov kev pabcuam tus kheej nrog cov khoom siv dag zog, koj tuaj yeem tau txais ntau lub qauv ntawm qhov system uas yooj yim rau kev sim.
  11. Kev sib xyaw ua ke. Muaj ib qho kev teeb tsa rau tag nrho cov kev faib tawm ua rau nws muaj peev xwm khiav tag nrho cov khoom nyob rau hauv ib puag ncig tswj raws li ib feem ntawm kev sib koom ua ke. Nws yog ib qho yooj yim rau emulate, piv txwv li, ib qho xwm txheej uas qee cov nodes nkag mus tau.

Disadvantages thiab kev txwv

Compiled configuration txawv ntawm lwm yam configuration mus kom ze thiab tej zaum yuav tsis haum rau tej daim ntawv thov. Hauv qab no yog qee qhov tsis zoo:

  1. Static configuration. Qee lub sij hawm koj yuav tsum tau kho sai sai rau kev teeb tsa hauv kev tsim khoom, hla tag nrho cov txheej txheem tiv thaiv. Nrog rau txoj kev no nws tuaj yeem nyuaj dua. Tsawg kawg, kev sib sau ua ke thiab kev xa tawm tsis siv neeg tseem yuav tsum tau ua. Qhov no yog ob qho tib si muaj txiaj ntsig zoo ntawm txoj hauv kev thiab qhov tsis zoo hauv qee kis.
  2. Configuration tiam. Nyob rau hauv cov ntaub ntawv configuration yog generated los ntawm ib tug tsis siv neeg lub cuab tam, ntxiv dag zog yuav tsum tau rau integrate cov ntawv tsim.
  3. Cov cuab yeej. Tam sim no, cov khoom siv hluav taws xob thiab cov txheej txheem tsim los ua haujlwm nrog kev teeb tsa yog raws li cov ntawv nyeem. Tsis yog txhua qhov kev siv hluav taws xob / cov txuj ci no yuav muaj nyob rau hauv kev teeb tsa ua ke.
  4. Yuav tsum hloov tus cwj pwm. Cov neeg tsim khoom thiab DevOps tau siv rau cov ntawv nyeem. Lub tswv yim heev ntawm kev sau ib qho kev teeb tsa tej zaum yuav yog me ntsis npaj txhij txog thiab txawv txawv thiab ua rau tsis lees paub.
  5. Yuav tsum muaj txheej txheem txhim kho zoo. Txhawm rau kom yooj yim siv cov kev teeb tsa sib sau ua ke, tag nrho automation ntawm cov txheej txheem tsim thiab xa cov ntawv thov (CI / CD) yog qhov tsim nyog. Txwv tsis pub nws yuav tsis yooj yim heev.

Cia peb tseem nyob ntawm ntau qhov kev txwv ntawm qhov kev txiav txim siab piv txwv uas tsis muaj feem cuam tshuam nrog lub tswv yim ntawm kev sib sau ua ke:

  1. Yog tias peb muab cov ntaub ntawv teeb tsa tsis tsim nyog uas tsis siv los ntawm node, ces lub compiler yuav tsis pab peb tshawb xyuas qhov kev siv uas ploj lawm. Qhov teeb meem no tuaj yeem daws tau los ntawm kev tso lub ncuav mog qab zib thiab siv ntau hom nruj, piv txwv li, HList los yog algebraic data type (case classes) los sawv cev rau kev teeb tsa.
  2. Muaj cov kab hauv cov ntaub ntawv teeb tsa uas tsis cuam tshuam nrog kev teeb tsa nws tus kheej: (package, import, cov lus tshaj tawm; override def's rau parameters uas muaj qhov tseem ceeb). Qhov no tuaj yeem zam qee qhov yog tias koj siv koj tus kheej DSL. Tsis tas li ntawd, lwm hom kev teeb tsa (piv txwv li, XML) kuj tseem txwv qee qhov kev txwv ntawm cov qauv ntaub ntawv.
  3. Rau lub hom phiaj ntawm cov ntawv tshaj tawm no, peb tsis xav txog kev hloov kho tshiab ntawm ib pawg ntawm cov nodes zoo sib xws.

xaus

Hauv cov ntawv tshaj tawm no, peb tau tshawb xyuas lub tswv yim ntawm kev sawv cev kev teeb tsa hauv qhov chaws siv cov peev txheej siab tshaj ntawm Scala hom system. Txoj kev no tuaj yeem siv rau hauv ntau daim ntawv thov los hloov cov txheej txheem kev teeb tsa raws li xml lossis cov ntawv nyeem. Txawm hais tias peb qhov piv txwv tau ua tiav hauv Scala, tib lub tswv yim tuaj yeem hloov mus rau lwm yam lus sau ua ke (xws li Kotlin, C#, Swift, ...). Koj tuaj yeem sim ua qhov no hauv ib qho ntawm cov haujlwm hauv qab no, thiab, yog tias nws tsis ua haujlwm, txav mus rau cov ntawv nyeem, ntxiv cov khoom ploj.

Lawm, ib tug muab tso ua ke configuration yuav tsum tau ib tug zoo kev loj hlob txheej txheem. Nyob rau hauv rov qab, siab zoo thiab kev ntseeg siab ntawm configurations yog guaranteed.

Txoj kev txiav txim siab tuaj yeem nthuav dav:

  1. Koj tuaj yeem siv macros los ua cov ntawv txheeb xyuas lub sijhawm.
  2. Koj tuaj yeem siv DSL los nthuav qhia qhov kev teeb tsa hauv txoj hauv kev uas siv tau rau cov neeg siv kawg.
  3. Koj tuaj yeem siv kev tswj hwm kev tswj hwm dynamic nrog kev hloov kho tsis siv neeg. Piv txwv li, hloov tus naj npawb ntawm cov nodes hauv ib pawg yuav tsum muaj (1) txhua qhov tau txais qhov sib txawv me ntsis; (2) tus thawj tswj pawg tau txais cov ntaub ntawv hais txog cov nodes tshiab.

Kev lees paub

Kuv xav ua tsaug rau Andrei Saksonov, Pavel Popov thiab Anton Nekhaev rau lawv qhov kev thuam ntawm tsab xov xwm.

Tau qhov twg los: www.hab.com

Ntxiv ib saib