Gihugpong nga Distributed System Configuration

Gusto nakong isulti kanimo ang usa ka makapaikag nga mekanismo alang sa pagtrabaho kauban ang pag-configure sa usa ka gipang-apod-apod nga sistema. Direkta nga girepresentahan ang configuration sa usa ka compiled language (Scala) gamit ang luwas nga mga tipo. Kini nga post naghatag usa ka panig-ingnan sa ingon nga usa ka pagsumpo ug naghisgot sa lainlaing mga aspeto sa pagpatuman sa usa ka hiniusa nga pagsumpo sa kinatibuk-ang proseso sa pag-uswag.

Gihugpong nga Distributed System Configuration

(Iningles)

Pasiuna

Ang pagtukod sa usa ka kasaligan nga gipang-apod-apod nga sistema nagpasabut nga ang tanan nga mga node naggamit sa husto nga pagsumpo, nga gidungan sa ubang mga node. Ang mga teknolohiya sa DevOps (terraform, ansible o usa ka butang nga sama niana) kasagarang gigamit aron awtomatiko nga makamugna og mga file sa pag-configure (kasagaran espesipiko alang sa matag node). Gusto usab namon nga masiguro nga ang tanan nga mga node sa komunikasyon naggamit parehas nga mga protocol (lakip ang parehas nga bersyon). Kung dili, ang dili pagkaangay matukod sa among gipang-apod-apod nga sistema. Sa kalibutan sa JVM, usa ka sangputanan niini nga kinahanglanon mao nga ang parehas nga bersyon sa librarya nga adunay sulud nga mga mensahe sa protocol kinahanglan gamiton bisan diin.

Unsa man ang bahin sa pagsulay sa usa ka giapod-apod nga sistema? Siyempre, among gihunahuna nga ang tanan nga mga sangkap adunay mga pagsulay sa yunit sa wala pa kami mopadayon sa pagsulay sa panagsama. (Aron ma-extrapolate namo ang mga resulta sa pagsulay ngadto sa runtime, kinahanglan usab nga maghatag kami og parehas nga hugpong sa mga librarya sa yugto sa pagsulay ug sa runtime.)

Kung nagtrabaho kauban ang mga pagsulay sa panagsama, kanunay nga dali gamiton ang parehas nga agianan sa klase bisan diin sa tanan nga mga node. Ang kinahanglan natong buhaton mao ang pagsiguro nga ang parehas nga classpath gigamit sa runtime. (Samtang kini mao ang bug-os nga posible nga sa pagpadagan sa lain-laing mga node uban sa lain-laing mga classpaths, kini makadugang sa pagkakomplikado sa kinatibuk-ang configuration ug mga kalisdanan uban sa deployment ug integration mga pagsulay.) Alang sa mga katuyoan niini nga post, kita nagtuo nga ang tanan nga mga node mogamit sa sama nga classpath.

Ang pag-configure nagbag-o sa aplikasyon. Gigamit namo ang mga bersyon sa pag-ila sa lain-laing mga yugto sa ebolusyon sa programa. Morag makatarunganon nga mailhan usab ang lainlaing mga bersyon sa mga pag-configure. Ug ibutang ang configuration mismo sa version control system. Kung adunay usa ra ka pagsumpo sa produksiyon, mahimo ra naton gamiton ang numero sa bersyon. Kung mogamit kami daghang mga higayon sa produksiyon, nan kinahanglan namon ang pila
mga sanga sa pag-configure ug usa ka dugang nga label dugang sa bersyon (pananglitan, ang ngalan sa sanga). Niining paagiha klaro natong mailhan ang eksaktong configuration. Ang matag configuration identifier talagsaon nga katumbas sa usa ka piho nga kombinasyon sa mga gipang-apod-apod nga mga node, mga pantalan, mga eksternal nga kapanguhaan, ug mga bersyon sa librarya. Alang sa mga katuyoan niini nga post kita maghunahuna nga adunay usa lamang ka sanga ug atong mailhan ang configuration sa naandan nga paagi gamit ang tulo ka numero nga gibulag sa usa ka tulbok (1.2.3).

Sa modernong mga palibot, ang mga file sa pag-configure panagsa ra nga gihimo nga mano-mano. Kasagaran sila namugna sa panahon sa pag-deploy ug dili na matandog (aron ayaw pagguba bisan unsa). Usa ka natural nga pangutana ang mitungha: ngano nga gigamit pa naton ang format sa teksto aron matipigan ang pagsumpo? Ang usa ka mahimo nga alternatibo daw mao ang abilidad sa paggamit sa regular nga code alang sa pag-configure ug makabenepisyo gikan sa mga pagsusi sa oras sa pag-compile.

Sa kini nga post atong susihon ang ideya sa pagrepresentar sa usa ka pagsumpo sa sulod sa usa ka hiniusa nga artifact.

Gihugpong nga configuration

Kini nga seksyon naghatag usa ka pananglitan sa usa ka static nga gihugpong nga pagsumpo. Duha ka yano nga serbisyo ang gipatuman - ang echo service ug ang echo service client. Pinasukad niining duha ka mga serbisyo, duha ka mga kapilian sa sistema ang gitigum. Sa usa ka kapilian, ang duha nga mga serbisyo nahimutang sa parehas nga node, sa lain nga kapilian - sa lainlaing mga node.

Kasagaran ang usa ka giapod-apod nga sistema adunay daghang mga node. Mahimo nimong mailhan ang mga node gamit ang mga kantidad sa usa ka klase NodeId:

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

o

case class NodeId(hostName: String)

o bisan pa

object Singleton
type NodeId = Singleton.type

Ang mga node naghimo sa lainlaing mga tahas, sila nagpadagan sa mga serbisyo ug ang mga koneksyon sa TCP/HTTP mahimong matukod sa taliwala nila.

Aron mahulagway ang usa ka koneksyon sa TCP kinahanglan namon ang labing menos usa ka numero sa port. Gusto usab namon nga ipakita ang protocol nga gisuportahan sa kana nga pantalan aron masiguro nga ang kliyente ug server naggamit sa parehas nga protocol. Atong ihulagway ang koneksyon gamit ang mosunod nga klase:

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

diin Port - usa lang ka integer Int nga nagpakita sa han-ay sa madawat nga mga bili:

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

Pino nga mga tipo

Tan-awa ang librarya dalisay ΠΈ akong pagtaho. Sa laktud, ang librarya nagtugot kanimo sa pagdugang sa mga pagpugong sa mga tipo nga gisusi sa oras sa pag-compile. Sa kini nga kaso, ang balido nga mga kantidad sa numero sa port mao ang 16-bit integer. Para sa usa ka compiled configuration, ang paggamit sa refined library dili mandatory, apan kini nagpauswag sa abilidad sa compiler sa pagsusi sa configuration.

Alang sa HTTP (REST) ​​​​nga mga protocol, dugang sa numero sa pantalan, mahimo usab nga kinahanglan namon ang agianan sa serbisyo:

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

Mga tipo sa phantom

Aron mahibal-an ang protocol sa oras sa pag-compile, gigamit namon ang usa ka tipo nga parameter nga wala gigamit sa sulod sa klase. Kini nga desisyon tungod sa kamatuoran nga wala kami mogamit sa usa ka pananglitan sa protocol sa runtime, apan gusto namon nga susihon sa compiler ang pagkaangay sa protocol. Pinaagi sa pagpiho sa protocol, dili kami makapasa sa dili angay nga serbisyo ingon usa ka dependency.

Usa sa kasagarang mga protocol mao ang REST API nga adunay Json serialization:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

diin RequestMessage - tipo sa paghangyo, ResponseMessage - matang sa tubag.
Siyempre, mahimo namong gamiton ang ubang mga paghubit sa protocol nga naghatag sa katukma sa paghulagway nga among gikinahanglan.

Alang sa katuyoan niini nga post, mogamit kami usa ka gipasimple nga bersyon sa protocol:

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

Dinhi ang hangyo usa ka string nga gidugtong sa url ug ang tubag mao ang gibalik nga string sa lawas sa tubag sa HTTP.

Ang pag-configure sa serbisyo gihulagway sa ngalan sa serbisyo, mga pantalan, ug mga dependency. Kini nga mga elemento mahimong irepresentar sa Scala sa daghang mga paagi (pananglitan, HList-s, algebraic nga mga tipo sa datos). Alang sa mga katuyoan niini nga post, among gamiton ang Cake Pattern ug magrepresentar sa mga module gamit trait'ov. (Ang Cake Pattern dili usa ka gikinahanglan nga elemento niini nga pamaagi. Kini usa lamang ka posible nga pagpatuman.)

Ang mga dependency tali sa mga serbisyo mahimong irepresentar isip mga pamaagi nga nagbalik sa mga pantalan EndPointsa ubang mga 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)
  }

Aron makahimo og serbisyo sa echo, ang imong gikinahanglan mao ang numero sa pantalan ug usa ka timailhan nga ang pantalan nagsuporta sa echo protocol. Mahimo nga dili kami magtino sa usa ka piho nga pantalan, tungod kay ... Ang mga kinaiya nagtugot kanimo sa pagpahayag sa mga pamaagi nga walay pagpatuman (abstract nga mga pamaagi). Sa kini nga kaso, kung maghimo usa ka konkreto nga pagsumpo, ang compiler kinahanglan nga maghatag usa ka pagpatuman sa abstract nga pamaagi ug maghatag usa ka numero sa pantalan. Tungod kay gipatuman namon ang pamaagi, kung maghimo usa ka piho nga pagsumpo, mahimo nga dili namon mahibal-an ang lahi nga pantalan. Ang default nga bili gamiton.

Sa pag-configure sa kliyente gipahayag namon ang pagsalig sa serbisyo sa echo:

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

Ang dependency parehas nga tipo sa gi-eksport nga serbisyo echoService. Sa partikular, sa kliyente sa echo kinahanglan namon ang parehas nga protocol. Busa, kung magkonektar sa duha ka serbisyo, makasiguro kami nga ang tanan molihok sa husto.

Pagpatuman sa mga serbisyo

Kinahanglan ang usa ka function aron masugdan ug mapahunong ang serbisyo. (Ang abilidad sa pagpahunong sa serbisyo kritikal alang sa pagsulay.) Sa makausa pa, adunay daghang mga kapilian alang sa pagpatuman sa ingon nga bahin (pananglitan, mahimo natong gamiton ang mga klase nga klase base sa tipo sa pag-configure). Alang sa mga katuyoan niini nga post atong gamiton ang Cake Pattern. Irepresentar namon ang serbisyo gamit ang usa ka klase cats.Resource, kay Kini nga klase naghatag na ug paagi aron luwas nga magarantiya ang pagpagawas sa mga kahinguhaan kung adunay mga problema. Aron makakuha usa ka kapanguhaan, kinahanglan namon nga maghatag pagsulud ug usa ka andam nga nahimo nga konteksto sa runtime. Ang function sa pagsugod sa serbisyo mahimong ingon niini:

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

diin

  • Config β€” tipo sa pag-configure alang niini nga serbisyo
  • AddressResolver β€” usa ka runtime nga butang nga nagtugot kanimo nga mahibal-an ang mga adres sa ubang mga node (tan-awa sa ubos)

ug uban pang matang gikan sa librarya cats:

  • F[_] β€” matang sa epekto (sa pinakasimple nga kaso F[A] mahimong function lang () => A. Niini nga post atong gamiton cats.IO.)
  • Reader[A,B] - labaw pa o dili kaayo parehas sa function A => B
  • cats.Resource - usa ka kapanguhaan nga mahimong makuha ug ipagawas
  • Timer - timer (gitugotan ka nga makatulog sa makadiyot ug sukdon ang mga agwat sa oras)
  • ContextShift - analogue ExecutionContext
  • Applicative β€” usa ka klase nga klase sa epekto nga nagtugot kanimo sa paghiusa sa mga indibidwal nga epekto (halos usa ka monad). Sa mas komplikado nga mga aplikasyon daw mas maayo nga gamiton Monad/ConcurrentEffect.

Gamit kini nga pirma sa function mahimo namong ipatuman ang daghang mga serbisyo. Pananglitan, usa ka serbisyo nga wala’y mahimo:

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

(Cm. gigikanan, diin ang ubang mga serbisyo gipatuman - serbisyo sa echo, echo nga kliyente
ΠΈ tibuok kinabuhi nga mga controller.)

Ang usa ka node usa ka butang nga mahimong maglansad sa daghang mga serbisyo (ang paglansad sa usa ka kadena sa mga kahinguhaan gisiguro sa Cake Pattern):

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

Palihug timan-i nga among gipiho ang eksaktong matang sa configuration nga gikinahanglan alang niini nga node. Kung nakalimtan namon nga ipiho ang usa sa mga tipo sa pag-configure nga gikinahanglan sa usa ka partikular nga serbisyo, adunay usa ka sayup sa pag-compile. Usab, dili kami makasugod sa usa ka node gawas kung maghatag kami usa ka butang sa angay nga tipo sa tanan nga kinahanglan nga datos.

Host Name Resolution

Aron makonektar sa usa ka hilit nga host, kinahanglan namon ang usa ka tinuod nga IP address. Posible nga ang adres mahibal-an sa ulahi kaysa sa nahabilin nga pag-configure. Mao nga kinahanglan namon ang usa ka function nga nag-mapa sa node ID sa usa ka adres:

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

Adunay daghang mga paagi sa pagpatuman niini nga function:

  1. Kung nahibal-an namo ang mga adres sa wala pa i-deploy, mahimo namong makamugna ang Scala code gamit ang
    mga adres ug dayon ipadagan ang pagtukod. Kini mag-compile ug magpadagan sa mga pagsulay.
    Sa kini nga kaso, ang function mahibal-an sa statically ug mahimong irepresentar sa code ingon usa ka mapping Map[NodeId, NodeAddress].
  2. Sa pipila ka mga kaso, ang aktuwal nga adres nahibal-an ra pagkahuman nagsugod ang node.
    Sa kini nga kaso, mahimo naton ipatuman ang usa ka "serbisyo sa pagdiskobre" nga nagdagan sa wala pa ang ubang mga node ug ang tanan nga mga node magparehistro sa kini nga serbisyo ug mangayo sa mga adres sa ubang mga node.
  3. Kung mahimo naton usbon /etc/hosts, unya mahimo nimong gamiton ang predefined hostname (sama sa my-project-main-node ΠΈ echo-backend) ug isumpay lang kini nga mga ngalan
    nga adunay mga IP address sa panahon sa pag-deploy.

Sa kini nga post dili namon tagdon kini nga mga kaso sa mas detalyado. Para sa atong
sa usa ka pananglitan sa dulaan, ang tanan nga mga node adunay parehas nga IP address - 127.0.0.1.

Sunod, among gikonsiderar ang duha ka kapilian alang sa usa ka giapod-apod nga sistema:

  1. Pagbutang sa tanan nga mga serbisyo sa usa ka node.
  2. Ug nag-host sa serbisyo sa echo ug kliyente sa echo sa lainlaing mga node.

Pag-configure alang sa usa ka node:

Pag-configure sa usa ka node

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

Ang butang nagpatuman sa pagsumpo sa kliyente ug server. Ang usa ka time-to-live configuration gigamit usab aron human sa interval lifetime tapuson ang programa. (Ang Ctrl-C naglihok usab ug nagpagawas sa tanan nga mga kapanguhaan sa husto.)

Ang parehas nga hugpong sa mga pag-configure ug mga kinaiya sa pagpatuman mahimong magamit sa paghimo og usa ka sistema nga naglangkob sa duha ka managlahing node:

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

Importante! Matikdi kung giunsa ang mga serbisyo nalambigit. Gitakda namo ang usa ka serbisyo nga gipatuman sa usa ka node isip usa ka pagpatuman sa laing paagi sa dependency sa node. Ang dependency type gisusi sa compiler, tungod kay naglangkob sa matang sa protocol. Kung modagan, ang dependency maglangkob sa husto nga target node ID. Salamat sa kini nga laraw, among gipiho ang numero sa pantalan nga eksakto kausa ug kanunay nga gigarantiyahan nga nagtumong sa husto nga pantalan.

Pagpatuman sa duha ka mga node sa sistema

Alang sa kini nga pag-configure, gigamit namon ang parehas nga mga pagpatuman sa serbisyo nga wala’y mga pagbag-o. Ang bugtong kalainan mao nga kita karon adunay duha ka mga butang nga nagpatuman sa lain-laing mga set sa mga serbisyo:

  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
  }

Ang unang node nag-implementar sa server ug nagkinahanglan lamang sa configuration sa server. Ang ikaduhang node nag-implementar sa kliyente ug naggamit sa laing bahin sa configuration. Usab ang duha ka mga node nagkinahanglan sa tibuok kinabuhi nga pagdumala. Ang server node modagan hangtod nga kini mahunong SIGTERM'om, ug ang node sa kliyente matapos pagkahuman sa pila ka oras. Cm. launcher nga app.

Kinatibuk-ang proseso sa pag-uswag

Atong tan-awon kung giunsa kini nga pamaagi sa pag-configure nakaapekto sa kinatibuk-ang proseso sa pag-uswag.

Ang pag-configure i-compile kauban ang nahabilin nga code ug usa ka artifact (.jar) ang mabuhat. Morag makatarunganon nga ibutang ang pagsumpo sa usa ka lahi nga artifact. Kini tungod kay mahimo kita adunay daghang mga pag-configure base sa parehas nga code. Pag-usab, posible nga makamugna og mga artifact nga katumbas sa lainlaing mga sanga sa pag-configure. Ang mga dependency sa piho nga mga bersyon sa mga librarya gitipigan uban sa configuration, ug kini nga mga bersyon maluwas hangtud sa kahangturan sa matag higayon nga kita modesisyon sa pag-deploy sa maong bersyon sa configuration.

Ang bisan unsang pagbag-o sa configuration mahimong usa ka pagbag-o sa code. Ug busa, matag usa
ang pagbag-o masakop sa normal nga proseso sa pagsiguro sa kalidad:

Ticket sa bug tracker -> PR -> review -> paghiusa sa may kalabutan nga mga sanga ->
panagsama -> pag-deploy

Ang mga nag-unang sangputanan sa pagpatuman sa usa ka hiniusa nga pagsumpo mao ang:

  1. Ang pag-configure mahimong makanunayon sa tanan nga mga node sa gipang-apod-apod nga sistema. Tungod sa kamatuoran nga ang tanan nga mga node makadawat sa parehas nga pagsumpo gikan sa usa ka gigikanan.

  2. Problema ang pagbag-o sa configuration sa usa lang sa mga node. Busa, ang "pag-anod sa pag-configure" dili mahimo.

  3. Nahimong mas lisud ang paghimo og gagmay nga mga pagbag-o sa pag-configure.

  4. Kadaghanan sa mga pagbag-o sa pag-configure mahitabo isip bahin sa kinatibuk-ang proseso sa pag-uswag ug ipailalom sa pagrepaso.

Kinahanglan ba nako ang usa ka bulag nga repository aron matipigan ang pagsumpo sa produksiyon? Kini nga pag-configure mahimong adunay mga password ug uban pang sensitibo nga kasayuran nga gusto namon pugngan ang pag-access. Pinasukad niini, daw makatarunganon nga tipigan ang katapusan nga pagsumpo sa usa ka bulag nga repositoryo. Mahimo nimong bahinon ang configuration ngadto sa duha ka bahinβ€”usa nga adunay mga setting sa configuration nga ma-access sa publiko ug ang usa adunay restricted settings. Kini magtugot sa kadaghanan sa mga developers nga adunay access sa komon nga mga setting. Kini nga panagbulag dali nga makab-ot gamit ang intermediate nga mga kinaiya nga adunay mga default nga kantidad.

Posible nga mga kalainan

Atong sulayan nga itandi ang gihugpong nga pagsumpo sa pipila ka kasagarang mga alternatibo:

  1. Text file sa target nga makina.
  2. Sentralisado nga key-value store (etcd/zookeeper).
  3. Ang mga sangkap sa proseso nga mahimong ma-reconfigure / ma-restart nga dili i-restart ang proseso.
  4. Pagtago sa configuration gawas sa artifact ug version control.

Ang mga text file naghatag og mahinungdanon nga pagka-flexible sa mga termino sa gagmay nga mga pagbag-o. Ang tagdumala sa sistema mahimong maka-log in sa hilit nga node, maghimo mga pagbag-o sa angay nga mga file ug i-restart ang serbisyo. Alang sa dagkong mga sistema, bisan pa, ang ingon nga pagka-flexible mahimong dili gusto. Ang mga pagbag-o nga gihimo wala magbilin ug mga pagsubay sa ubang mga sistema. Walay nagrepaso sa mga kausaban. Lisud ang pagtino kung kinsa gyud ang naghimo sa mga pagbag-o ug sa unsang hinungdan. Ang mga pagbag-o wala gisulayan. Kung ang sistema giapod-apod, nan ang tagdumala mahimong makalimot sa paghimo sa katugbang nga pagbag-o sa ubang mga node.

(Kinahanglan usab nga hinumdoman nga ang paggamit sa usa ka gihugpong nga pagsumpo wala magsira sa posibilidad sa paggamit sa mga file sa teksto sa umaabot. Kini igo na aron makadugang usa ka parser ug validator nga nagpatunghag parehas nga tipo sa output. Config, ug mahimo nimong gamiton ang mga text file. Gisundan dayon niini nga ang pagkakomplikado sa usa ka sistema nga adunay usa ka gihugpong nga pagsasaayos medyo gamay kaysa sa pagkakomplikado sa usa ka sistema gamit ang mga text file, tungod kay Ang mga text file nagkinahanglan og dugang nga code.)

Ang sentralisadong key-value store usa ka maayong mekanismo sa pag-apod-apod sa meta parameters sa usa ka giapod-apod nga aplikasyon. Kinahanglan namon nga magdesisyon kung unsa ang mga parameter sa pag-configure ug kung unsa ra ang datos. Naa tay function C => A => B, ug ang mga parametro C panagsa ra mausab, ug data A - kasagaran. Sa kini nga kaso mahimo naton isulti kana C - mga parameter sa pagsumpo, ug A - datus. Mopatim-aw nga ang mga parameter sa pag-configure lahi sa datos tungod kay sa kasagaran dili kaayo kanunay kini magbag-o kaysa sa datos. Usab, ang data kasagarang gikan sa usa ka tinubdan (gikan sa user), ug configuration parameters gikan sa lain (gikan sa system administrator).

Kung ang panagsa ra nga pagbag-o sa mga parameter kinahanglan nga bag-ohon nga wala’y pagsugod pag-usab sa programa, nan kini kanunay nga mosangput sa komplikasyon sa programa, tungod kay kinahanglan naton nga ihatud ang mga parameter, pagtipig, pag-parse ug pagsusi, ug pagproseso sa dili husto nga mga kantidad. Busa, gikan sa punto sa panglantaw sa pagkunhod sa pagkakomplikado sa programa, makatarunganon ang pagpakunhod sa gidaghanon sa mga parameter nga mahimong mausab sa panahon sa operasyon sa programa (o dili pagsuporta sa maong mga parameter sa tanan).

Alang sa mga katuyoan sa kini nga post, magkalainlain kami tali sa static ug dinamikong mga parameter. Kung ang lohika sa serbisyo nanginahanglan pagbag-o sa mga parameter sa panahon sa operasyon sa programa, unya tawgon namon ang ingon nga mga parameter nga dinamiko. Kung dili ang mga kapilian static ug mahimong ma-configure gamit ang gihugpong nga pagsumpo. Alang sa dinamikong reconfiguration, mahimo nga kinahanglan namon ang usa ka mekanismo aron ma-restart ang mga bahin sa programa nga adunay bag-ong mga parameter, parehas sa kung giunsa ang mga proseso sa operating system gi-restart. (Sa among opinyon, mas maayo nga likayan ang real-time nga reconfiguration, tungod kay kini nagdugang sa pagkakomplikado sa sistema. Kung mahimo, mas maayo nga gamiton ang standard nga kapabilidad sa OS alang sa pag-restart sa mga proseso.)

Usa ka importante nga aspeto sa paggamit sa static nga configuration nga naghimo sa mga tawo nga ikonsiderar ang dinamikong reconfiguration mao ang panahon nga gikinahanglan alang sa sistema sa reboot human sa usa ka configuration update (downtime). Sa tinuud, kung kinahanglan naton maghimo mga pagbag-o sa static nga pag-configure, kinahanglan naton nga i-restart ang sistema aron ma-epekto ang bag-ong mga kantidad. Ang problema sa downtime lainlain ang kagrabe alang sa lainlaing mga sistema. Sa pipila ka mga kaso, mahimo kang mag-iskedyul og reboot sa panahon nga gamay ra ang load. Kung kinahanglan nimo nga maghatag padayon nga serbisyo, mahimo nimong ipatuman Ang koneksyon sa AWS ELB nahurot. Sa samang higayon, kung kinahanglan namong i-reboot ang sistema, maglunsad kami og parallel nga pananglitan niini nga sistema, ibalhin ang balancer niini, ug maghulat nga makompleto ang daan nga mga koneksyon. Pagkahuman sa tanan nga daan nga koneksyon, gisirhan namon ang daan nga pananglitan sa sistema.

Atong tagdon karon ang isyu sa pagtipig sa configuration sa sulod o sa gawas sa artifact. Kung gitipigan namon ang pagsumpo sa sulod sa usa ka artifact, nan labing menos kami adunay higayon nga mapamatud-an ang katukma sa pagsumpo sa panahon sa pag-assemble sa artifact. Kung ang pag-configure naa sa gawas sa kontroladong artifact, lisud ang pagsubay kung kinsa ang nagbag-o sa kini nga file ug ngano. Unsa ka importante kini? Sa among opinyon, alang sa daghang mga sistema sa produksiyon hinungdanon nga adunay usa ka lig-on ug taas nga kalidad nga pagsumpo.

Gitugotan ka sa bersyon sa usa ka artifact nga mahibal-an kung kanus-a kini gibuhat, kung unsang mga kantidad ang naa niini, kung unsang mga function ang gipagana / gipugngan, ug kinsa ang responsable sa bisan unsang pagbag-o sa pag-configure. Siyempre, ang pagtipig sa pagsumpo sa sulod sa usa ka artifact nanginahanglan pipila ka paningkamot, mao nga kinahanglan nimo nga maghimo usa ka nahibal-an nga desisyon.

Mga kalamboan ug kahuyang

Gusto ko nga maghisgot bahin sa mga bentaha ug disbentaha sa gisugyot nga teknolohiya.

Kaayohan

Sa ubos usa ka lista sa mga nag-unang bahin sa usa ka gihugpong nga giapod-apod nga pagsumpo sa sistema:

  1. Static nga pagsusi sa pagsumpo. Gitugotan ka nga makasiguro niana
    sakto ang configuration.
  2. Daghang pinulongan sa pag-configure. Kasagaran, ang ubang mga pamaagi sa pag-configure limitado sa pag-ilis sa variable nga string sa kadaghanan. Kung gigamit ang Scala, daghang mga bahin sa lengguwahe ang magamit aron mapaayo ang imong pag-configure. Pananglitan mahimo natong gamiton
    mga kinaiya alang sa default nga mga kantidad, gamit ang mga butang sa mga parameter sa grupo, mahimo natong i-refer ang mga val nga gideklarar nga kausa ra (DRY) sa gilakip nga sakup. Mahimo nimong i-instantiate ang bisan unsang klase nga direkta sa sulod sa configuration (Seq, Map, naandan nga mga klase).
  3. DSL. Ang Scala adunay daghang mga bahin sa lengguwahe nga nagpadali sa paghimo og DSL. Posible nga pahimuslan kini nga mga bahin ug ipatuman ang usa ka sinultian nga pag-configure nga labi ka kombenyente alang sa target nga grupo sa mga tiggamit, aron ang pagsumpo labing menos mabasa sa mga eksperto sa domain. Ang mga espesyalista mahimo, pananglitan, moapil sa proseso sa pagrepaso sa configuration.
  4. Integridad ug synchrony tali sa mga node. Usa sa mga bentaha sa pag-configure sa usa ka tibuuk nga sistema nga gi-apod-apod nga gitipigan sa usa ka punto mao nga ang tanan nga mga kantidad gideklarar nga eksakto kausa ug dayon gigamit pag-usab bisan diin sila kinahanglan. Ang paggamit sa mga tipo sa phantom aron ipahayag ang mga pantalan nagsiguro nga ang mga node naggamit mga katugbang nga protocol sa tanan nga husto nga mga pag-configure sa sistema. Ang pagbaton og klaro nga mandatory nga dependency tali sa mga node nagsiguro nga ang tanan nga mga serbisyo konektado.
  5. Taas nga kalidad nga mga pagbag-o. Ang paghimo sa mga pagbag-o sa pag-configure gamit ang usa ka sagad nga proseso sa pag-uswag nagpaposible nga makab-ot usab ang taas nga kalidad nga mga sumbanan alang sa pagsumpo.
  6. Dungan nga pag-update sa configuration. Ang awtomatikong pag-deploy sa sistema pagkahuman sa mga pagbag-o sa pag-configure nagsiguro nga ang tanan nga mga node na-update.
  7. Pagpasimple sa aplikasyon. Ang aplikasyon wala magkinahanglan og pag-parse, pagsusi sa configuration, o pagdumala sa sayop nga mga bili. Gipamenos niini ang pagkakomplikado sa aplikasyon. (Pipila sa kakomplikado sa pag-configure nga nakita sa among panig-ingnan dili usa ka hiyas sa gihugpong nga pagsumpo, apan usa lamang ka mahunahunaon nga desisyon nga gimaneho sa tinguha nga mahatagan ang labi ka luwas nga tipo sa kaluwasan.) Sayon ra ang pagbalik sa naandan nga pagsumpo - ipatuman lang ang nawala mga bahin. Busa, mahimo nimo, pananglitan, magsugod sa usa ka hiniusa nga pagsumpo, paglangan sa pagpatuman sa wala kinahanglana nga mga bahin hangtod sa panahon nga kini kinahanglan gyud.
  8. Gipamatud-an nga configuration. Tungod kay ang mga pagbag-o sa pag-configure nagsunod sa naandan nga kapalaran sa bisan unsang ubang mga pagbag-o, ang output nga among makuha usa ka artifact nga adunay usa ka talagsaon nga bersyon. Gitugotan kami niini, pananglitan, nga makabalik sa usa ka miaging bersyon sa pagsumpo kung kinahanglan. Mahimo pa gani namon nga gamiton ang pag-configure gikan sa usa ka tuig ang milabay ug ang sistema molihok nga parehas. Ang usa ka lig-on nga pagsumpo nagpauswag sa pagkatag-an ug kasaligan sa usa ka gipang-apod-apod nga sistema. Tungod kay ang pag-configure gitakda sa yugto sa pag-compile, lisud nga peke kini sa produksiyon.
  9. Modularidad. Ang gisugyot nga gambalay modular ug ang mga modulo mahimong ikombinar sa lain-laing mga paagi sa paghimo og lain-laing mga sistema. Sa partikular, mahimo nimong i-configure ang sistema nga modagan sa usa ka node sa usa ka embodiment, ug sa daghang mga node sa lain. Makahimo ka og daghang mga pag-configure alang sa mga higayon sa produksiyon sa sistema.
  10. Pagsulay. Pinaagi sa pag-ilis sa tagsa-tagsa nga mga serbisyo sa mock nga mga butang, mahimo nimong makuha ang daghang mga bersyon sa sistema nga kombenyente alang sa pagsulay.
  11. Pagsulay sa panagsama. Ang pagbaton og usa ka configuration alang sa tibuok nga gipang-apod-apod nga sistema nagpaposible sa pagpadagan sa tanang mga sangkap sa usa ka kontrolado nga palibot isip kabahin sa integration testing. Sayon nga sundon, pananglitan, usa ka sitwasyon diin ang pipila ka mga node mahimong ma-access.

Mga disbentaha ug limitasyon

Ang gihugpong nga pag-configure lahi sa ubang mga pamaagi sa pag-configure ug mahimong dili angay alang sa pipila nga mga aplikasyon. Sa ubos mao ang pipila ka mga disbentaha:

  1. Static nga configuration. Usahay kinahanglan nimo nga dali nga matul-id ang pagsumpo sa produksiyon, nga laktawan ang tanan nga mga mekanismo sa pagpanalipod. Uban niini nga pamaagi kini mahimong mas lisud. Sa labing gamay, gikinahanglan gihapon ang compilation ug automatic deployment. Kini usa ka mapuslanon nga bahin sa pamaagi ug usa ka disbentaha sa pipila ka mga kaso.
  2. Pagmugna sa pag-configure. Sa kaso nga ang configuration file namugna pinaagi sa usa ka awtomatik nga himan, dugang nga mga paningkamot mahimong gikinahanglan sa paghiusa sa pagtukod script.
  3. Mga galamiton. Sa pagkakaron, ang mga utilities ug mga teknik nga gidesinyo sa pagtrabaho uban sa configuration gibase sa text files. Dili tanan nga ingon nga mga kagamitan / teknik magamit sa usa ka gihugpong nga pagsasaayos.
  4. Kinahanglan ang pagbag-o sa mga tinamdan. Ang mga developer ug DevOps naanad sa mga text file. Ang ideya mismo sa pag-compile sa usa ka pagsumpo mahimong medyo wala damha ug dili kasagaran ug hinungdan sa pagsalikway.
  5. Gikinahanglan ang taas nga kalidad nga proseso sa pag-uswag. Aron komportable nga magamit ang gihugpong nga pagsumpo, ang bug-os nga automation sa proseso sa pagtukod ug pag-deploy sa aplikasyon (CI/CD) gikinahanglan. Kung dili kini mahimong dili kombenyente.

Atong hisgotan usab ang daghang mga limitasyon sa giisip nga panig-ingnan nga wala’y kalabutan sa ideya sa usa ka gihugpong nga pagsumpo:

  1. Kung maghatag kami ug wala kinahanglana nga kasayuran sa pagsumpo nga wala gigamit sa node, nan ang compiler dili makatabang kanamo nga makit-an ang nawala nga pagpatuman. Kini nga problema masulbad pinaagi sa pagbiya sa Cake Pattern ug paggamit sa mas estrikto nga mga tipo, pananglitan, HList o algebraic data type (case classes) para magrepresentar sa configuration.
  2. Adunay mga linya sa configuration file nga walay kalabutan sa configuration mismo: (package, import,mga deklarasyon sa butang; override defalang sa mga parameter nga adunay mga default nga kantidad). Mahimo kining malikayan nga bahin kung imong ipatuman ang imong kaugalingon nga DSL. Dugang pa, ang ubang mga matang sa pag-configure (pananglitan, XML) nagpahamtang usab ug piho nga mga pagdili sa istruktura sa file.
  3. Alang sa mga katuyoan sa kini nga post, wala namon gikonsiderar ang dinamikong pag-configure sa usa ka kumpol sa parehas nga mga node.

konklusyon

Sa kini nga post, among gisuhid ang ideya sa pagrepresentar sa pagsumpo sa source code gamit ang mga advanced nga kapabilidad sa Scala type system. Kini nga pamaagi mahimong magamit sa lain-laing mga aplikasyon isip usa ka puli sa tradisyonal nga mga pamaagi sa pag-configure base sa xml o mga text file. Bisan kung ang among panig-ingnan gipatuman sa Scala, ang parehas nga mga ideya mahimong ibalhin sa ubang mga sinultian nga sinultian (sama sa Kotlin, C #, Swift, ...). Mahimo nimong sulayan kini nga pamaagi sa usa sa mga mosunud nga proyekto, ug, kung dili kini molihok, ipadayon ang file sa teksto, idugang ang nawala nga mga bahin.

Natural, ang usa ka hiniusa nga pagsumpo nanginahanglan usa ka taas nga kalidad nga proseso sa pag-uswag. Agig balos, gisiguro ang taas nga kalidad ug kasaligan sa mga pag-configure.

Ang gikonsiderar nga pamaagi mahimong mapalapad:

  1. Mahimo nimong gamiton ang mga macro aron mahimo ang mga pagsusi sa oras sa pag-compile.
  2. Mahimo nimong ipatuman ang usa ka DSL aron ipresentar ang pagsumpo sa paagi nga ma-access sa mga end user.
  3. Mahimo nimong ipatuman ang dinamikong pagdumala sa kapanguhaan nga adunay awtomatik nga pag-adjust sa configuration. Pananglitan, ang pagbag-o sa gidaghanon sa mga node sa usa ka cluster nagkinahanglan nga (1) ang matag node makadawat og gamay nga lain-laing configuration; (2) ang cluster manager nakadawat og impormasyon bahin sa bag-ong mga node.

Mga Pasalamat

Gusto nakong pasalamatan si Andrei Saksonov, Pavel Popov ug Anton Nekhaev sa ilang mapuslanong pagsaway sa draft nga artikulo.

Source: www.habr.com

Idugang sa usa ka comment