Namboarina Distributed System Configuration

Te-hilaza aminareo mekanika iray mahaliana aho amin'ny fiasana amin'ny fanamafisana ny rafitra mizara. Aseho mivantana amin'ny fiteny natambatra (Scala) amin'ny fampiasana karazana azo antoka ny fanitsiana. Ity lahatsoratra ity dia manome ohatra iray amin'ny fanamafisam-peo toy izany ary miresaka momba ny lafiny samihafa amin'ny fampiharana ny fikirakirana natambatra amin'ny dingana fampandrosoana ankapobeny.

Namboarina Distributed System Configuration

(anglisy)

fampidirana

Ny fananganana rafitra fizarana azo itokisana dia midika fa ny node rehetra dia mampiasa ny fanitsiana marina, miaraka amin'ny nodes hafa. Ny teknolojia DevOps (terraform, ansible na zavatra mitovy amin'izany) dia matetika ampiasaina hamoronana rakitra fikirakirana ho azy (matetika manokana ho an'ny node tsirairay). Tianay ho azo antoka ihany koa fa mampiasa protocols mitovy avokoa ny node mifandray rehetra (anisan'izany ny dikan-teny mitovy). Raha tsy izany dia hatsangana ao anatin'ny rafitra zarainay ny tsy fifanarahana. Ao amin'ny tontolon'ny JVM, ny vokatra iray amin'ity fepetra ity dia tsy maintsy ampiasaina na aiza na aiza ny dikan-teny mitovy amin'ny tranomboky misy ny hafatra protocol.

Ahoana ny amin'ny fitiliana rafitra zaraina? Mazava ho azy fa mihevitra isika fa ny singa rehetra dia manana fitsapana unit alohan'ny hirosoana amin'ny fitsapana fampidirana. (Mba handinihantsika ny valin'ny fitsapana amin'ny fotoana fandehanana, dia tsy maintsy manome tranomboky mitovy ihany koa isika amin'ny dingana fitsapana sy amin'ny fotoana fandehanana.)

Rehefa miasa miaraka amin'ny andrana fampidirana, dia matetika mora kokoa ny mampiasa classpath mitovy na aiza na aiza amin'ny node rehetra. Ny hany tsy maintsy ataontsika dia ny miantoka fa ny classpath mitovy no ampiasaina amin'ny fotoana fandehanana. (Na dia azo atao aza ny mampandeha ny nodes samihafa miaraka amin'ny classpaths samy hafa, izany dia manampy be pitsiny amin'ny ankapobeny configuration sy ny fahasarotana amin'ny fametrahana sy ny fampidirana fitsapana.) Ho an'ny tanjon'ity lahatsoratra ity, dia mihevitra fa ny nodes rehetra dia hampiasa classpath mitovy.

Mivoatra miaraka amin'ny fampiharana ny fanitsiana. Mampiasa dikan-teny izahay hamantarana ireo dingana samihafa amin'ny fivoaran'ny programa. Toa mitombina ihany koa ny mamantatra ny dikan-teny samihafa amin'ny tefy. Ary apetraho ao amin'ny rafitra fanaraha-maso ny dikan-. Raha toa ka tsy misy afa-tsy config ao amin'ny famokarana, dia afaka mampiasa fotsiny ny dikan-laharan'ny. Raha mampiasa ohatra famokarana maro isika dia mila maromaro
sampana fikandrana sy marika fanampiny ho fanampin'ny dikan-teny (ohatra, ny anaran'ny sampana). Amin'izany fomba izany no ahafantarantsika mazava tsara ny fandrindrana marina. Ny identifier configure tsirairay dia mifanandrify amin'ny fitambarana manokana amin'ny nodes zaraina, seranana, loharano ivelany, ary dikan-teny famakiam-boky. Ho an'ny tanjon'ity lahatsoratra ity dia hihevitra isika fa tsy misy afa-tsy sampana iray ary azontsika atao ny mamantatra ny fanamafisam-peo amin'ny fomba mahazatra amin'ny fampiasana isa telo misaraka amin'ny teboka (1.2.3).

Amin'ny tontolo maoderina, zara raha noforonina amin'ny tanana ny fichier configuration. Matetika izy ireo dia novokarina nandritra ny fametrahana ary tsy voakitika intsony (ka aza mandrava na inona na inona). Mipoitra ny fanontaniana voajanahary: nahoana isika no mbola mampiasa endrika lahatsoratra hitahiry ny configuration? Ny safidy azo atao dia toa ny fahafahana mampiasa kaody mahazatra ho an'ny fanamafisana ary mahazo tombony amin'ny fisavana fotoana.

Ato amin'ity lahatsoratra ity isika dia hijery ny hevitra maneho ny configuration ao anaty artifact natambatra.

Configuration natambatra

Ity fizarana ity dia manome ohatra iray amin'ny fikirakirana static natambatra. Serivisy tsotra roa no ampiharina - ny serivisy echo sy ny mpanjifa serivisy echo. Miorina amin'ireo serivisy roa ireo, ny safidy rafitra roa dia miangona. Amin'ny safidy iray, ny serivisy roa dia miorina amin'ny node iray, amin'ny safidy hafa - amin'ny nodes samihafa.

Amin'ny ankapobeny dia misy nodes maromaro ny rafitra zaraina. Azonao atao ny mamantatra ny nodes amin'ny fampiasana sanda misy karazana NodeId:

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

na

case class NodeId(hostName: String)

na dia

object Singleton
type NodeId = Singleton.type

Ny nodes dia manao andraikitra isan-karazany, mitantana serivisy izy ireo ary azo apetraka eo anelanelan'izy ireo ny fifandraisana TCP/HTTP.

Mba hamaritana ny fifandraisana TCP dia mila laharana seranana farafaharatsiny. Te-haneho ny protocola tohana ao amin'io seranana io ihany koa izahay mba hahazoana antoka fa samy mampiasa protocole mitovy ny mpanjifa sy ny mpizara. Hamaritra ny fifandraisana amin'ny fampiasana ity kilasy manaraka ity izahay:

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

izay Port - integer fotsiny Int manondro ny isan'ny soatoavina azo ekena:

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

Karazana voadio

Jereo ny tranomboky voadio ΠΈ ny tatitra. Raha fintinina, ny tranomboky dia ahafahanao manampy teritery amin'ireo karazana voamarika amin'ny fotoana fanangonana. Amin'ity tranga ity, ny sandan'ny laharana port manan-kery dia 16-bit integers. Ho an'ny fanamafisana natambatra, ny fampiasana ny tranomboky voadio dia tsy voatery, fa manatsara ny fahaizan'ny mpanangom-bokatra manamarina ny fanitsiana.

Ho an'ny protocols HTTP (REST), ankoatry ny laharan'ny seranan-tsambo, dia mety mila ny lalana mankany amin'ny serivisy ihany koa isika:

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

Karazana Phantom

Mba hamantarana ny protocol amin'ny fotoana fanangonana, dia mampiasa karazana parameter izay tsy ampiasaina ao anatin'ny kilasy. Ity fanapahan-kevitra ity dia noho ny tsy fampiasana ohatra protocol amin'ny fotoana fampandehanana, fa tianay ny mpanangona hanamarina ny fifanarahana protocol. Amin'ny famaritana ny protocol, dia tsy ho afaka handefa serivisy tsy mety izahay ho fiankinan-doha.

Ny iray amin'ireo protocole mahazatra dia ny REST API miaraka amin'ny serialization Json:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

izay RequestMessage - karazana fangatahana, ResponseMessage - karazana valiny.
Mazava ho azy fa afaka mampiasa famaritana protocol hafa izay manome ny fahamarinan'ny famaritana takianay izahay.

Ho an'ny tanjon'ity lahatsoratra ity dia hampiasa dikan-teny tsotsotra amin'ny protocol izahay:

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

Eto ny fangatahana dia tady ampidirina amin'ny url ary ny valiny dia ny tady miverina ao amin'ny vatan'ny valin'ny HTTP.

Ny tefin'ny serivisy dia faritana amin'ny anaran'ny serivisy, seranan-tsambo ary miankina. Ireo singa ireo dia azo aseho amin'ny Scala amin'ny fomba maro (ohatra, HList-s, karazana angona algebra). Ho an'ny tanjon'ity lahatsoratra ity dia hampiasa ny Pattern Cake izahay ary hanehoana ireo modely mampiasa trait'ov. (Ny Pattern Cake dia tsy singa ilaina amin'ity fomba fiasa ity. Izy io dia fampiharana iray azo atao.)

Ny fiankinan-doha eo amin'ny serivisy dia azo aseho ho fomba mamerina seranana EndPointny nodes hafa:

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

Mba hamoronana serivisy echo, ny laharan'ny seranan-tsambo sy ny famantarana fa ny seranana dia manohana ny protocol echo. Mety tsy mamaritra seranan-tsambo manokana isika, satria... Ny toetra dia mamela anao hanambara fomba tsy misy fampiharana (fomba abstract). Amin'ity tranga ity, rehefa mamorona fanamafisana mivaingana, ny compiler dia mitaky antsika hanome fampiharana ny fomba abstract ary hanome laharana seranana. Koa satria nampihatra ny fomba izahay, rehefa mamorona fikandrana manokana, dia mety tsy manondro seranan-tsambo hafa. Ny sanda default no hampiasaina.

Ao amin'ny fandrindrana mpanjifa dia manambara fiankinan-doha amin'ny serivisy echo izahay:

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

Ny fiankinan-doha dia mitovy karazana amin'ny serivisy aondrana echoService. Indrindra indrindra, amin'ny mpanjifa echo dia mitaky protocol mitovy. Noho izany, rehefa mampifandray serivisy roa dia azo antoka fa handeha tsara ny zava-drehetra.

Fampiharana ny tolotra

Ilaina ny fiasa hanombohana sy hampiato ny serivisy. (Ny fahafahana mampiato ny serivisy dia tena ilaina amin'ny fitsapana.) Indray, misy safidy maromaro amin'ny fampiharana ny endri-javatra toy izany (ohatra, afaka mampiasa kilasy karazana mifototra amin'ny karazana config). Ho an'ny tanjon'ity lahatsoratra ity dia hampiasa ny Pattern Cake izahay. Hisolo tena ny serivisy amin'ny fampiasana kilasy izahay cats.Resource, satria Ity kilasy ity dia efa manome fitaovana hiantohana ny famoahana ireo loharanon-karena raha misy olana. Mba hahazoana loharanon-karena, dia mila manome config sy contexte runtime efa vita. Ny asa fanombohana serivisy dia mety ho toy izao:

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

izay

  • Config β€” karazana fanamafisam-peo ho an'ity serivisy ity
  • AddressResolver - zavatra mandeha amin'ny fotoana ahafahanao mahita ny adiresin'ny node hafa (jereo eto ambany)

ary karazana hafa avy amin'ny tranomboky cats:

  • F[_] - karazana fiantraikany (amin'ny tranga tsotra indrindra F[A] mety ho asa fotsiny () => A. Amin'ity lahatsoratra ity dia hampiasaintsika cats.IO.)
  • Reader[A,B] - mitovitovy na latsaka amin'ny asa A => B
  • cats.Resource - loharano azo alaina sy avoaka
  • Timer - fameram-potoana (mamela anao hatory vetivety ary mandrefy ny elanelan'ny fotoana)
  • ContextShift - Analog ExecutionContext
  • Applicative β€” kilasy karazana vokatra izay ahafahanao manambatra ny vokatry ny tsirairay (saika monad). Amin'ny fampiharana sarotra kokoa dia toa tsara kokoa ny mampiasa Monad/ConcurrentEffect.

Amin'ny fampiasana an'ity sonia ity dia afaka manatanteraka serivisy maromaro izahay. Ohatra, serivisy tsy manao na inona na inona:

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

(Jereo. Source, izay ampiharana tolotra hafa - serivisy echo, mpanjifa echo
ΠΈ mpanara-maso mandritra ny androm-piainany.)

Ny node dia zavatra iray afaka manomboka serivisy maromaro (ny fanombohana loharanon-karena dia azo antoka amin'ny Pattern Cake):

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

Azafady, mariho fa mamaritra ny karazana fanitsiana ilaina amin'ity node ity izahay. Raha adinontsika ny mamaritra ny iray amin'ireo karazana fanamafisam-peo takian'ny serivisy manokana, dia hisy hadisoana fanangonana. Ary koa, tsy afaka manomboka node isika raha tsy manome zavatra mitovy karazana miaraka amin'ny angona ilaina rehetra.

Fanapahan-kevitry ny anaran'ny mpampiantrano

Mba hifandraisana amin'ny mpampiantrano lavitra dia mila adiresy IP tena izy. Mety ho fantatra any aoriana kokoa noho ny hafa amin'ny fanamboarana ny adiresy. Noho izany dia mila fiasa izay mametraka ny ID node amin'ny adiresy iray:

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

Misy fomba maro hampiharana io asa io:

  1. Raha fantatray ny adiresy alohan'ny fandefasana azy dia afaka mamorona code Scala izahay
    adiresy ary avy eo dia mandehana ny fananganana. Izany dia hanangona sy hanao fitsapana.
    Amin'ity tranga ity, ny asa dia ho fantatra statically ary azo aseho amin'ny code ho toy ny sarintany Map[NodeId, NodeAddress].
  2. Amin'ny toe-javatra sasany, ny tena adiresy dia tsy fantatra rehefa nanomboka ny node.
    Amin'ity tranga ity, afaka mametraka "serivisy Discovery" isika izay mandeha alohan'ny nodes hafa ary ny nodes rehetra dia hisoratra anarana amin'ity serivisy ity ary mangataka ny adiresin'ny nodes hafa.
  3. Raha afaka manova isika /etc/hosts, dia azonao atao ny mampiasa anarana mpampiantrano efa voafaritra mialoha (toy ny my-project-main-node ΠΈ echo-backend) ary ampifandraiso fotsiny ireo anarana ireo
    miaraka amin'ny adiresy IP mandritra ny fametrahana.

Amin'ity lahatsoratra ity dia tsy handinika ireo tranga ireo amin'ny antsipiriany bebe kokoa isika. Ho antsika
amin'ny ohatra kilalao, ny node rehetra dia hanana adiresy IP mitovy - 127.0.0.1.

Manaraka izany dia mandinika safidy roa ho an'ny rafitra zaraina isika:

  1. Mametraka ny serivisy rehetra amin'ny node iray.
  2. Ary mampiantrano ny serivisy echo sy ny mpanjifa echo amin'ny nodes samihafa.

Configuration ho an'ny node iray:

Fanofanana node tokana

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

Ny zavatra dia mampihatra ny fanamafisana ny mpanjifa sy ny mpizara. Ampiasaina ihany koa ny fandrindrana ny fotoana hiainana ka aorian'ny elanelam-potoana lifetime atsaharo ny programa. (Miasa ihany koa ny Ctrl-C ary manafaka tsara ny loharano rehetra.)

Ny endri-tsarimihetsika sy fampiharana mitovy dia azo ampiasaina hamoronana rafitra misy nodes roa misaraka:

Fanamboarana node roa

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

Zava-dehibe! Mariho ny fomba ifandraisan'ireo serivisy. Tondroinay ny serivisy ampiharin'ny node iray ho fampiharana ny fomba fiankinan'ny node iray hafa. Ny karazana fiankinan-doha dia nohamarinin'ny compiler, satria misy ny karazana protocole. Rehefa mihazakazaka, ny fiankinan-doha dia ahitana ny ID node kendrena marina. Noho io tetika io dia mamaritra ny laharan'ny seranan-tsambo indray mandeha izahay ary azo antoka foana fa manondro ny seranan-tsambo marina.

Fampiharana ny rafitra roa nodes

Ho an'ity fanamafisana ity dia mampiasa fampiharana serivisy mitovy izahay nefa tsy misy fiovana. Ny hany mahasamihafa antsika dia manana zavatra roa isika ankehitriny izay mampihatra andiana serivisy samihafa:

  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
  }

Ny node voalohany dia manatanteraka ny mpizara ary mila fanamafisana ny mpizara ihany. Ny node faharoa dia mampihatra ny mpanjifa ary mampiasa ampahany hafa amin'ny fanamafisana. Samy mila fitantanana mandritra ny androm-piainany ihany koa ny nodes roa. Ny node mpizara dia mandeha tsy misy fetra mandra-pijanonany SIGTERM'om, ary tapitra ny node mpanjifa rehefa afaka fotoana fohy. Cm. fampiharana launcher.

Dingana fampandrosoana ankapobeny

Andeha hojerentsika ny fiantraikan'io fomba fiasa io amin'ny fizotran'ny fampandrosoana amin'ny ankapobeny.

Ny fanamboarana dia hatambatra miaraka amin'ny kaody ambiny ary hatsangana ny artifact (.jar). Toa misy dikany ny mametraka ny fanamafisam-peo ao anaty artifact mitokana. Izany dia satria isika dia afaka manana fanamafisana maro mifototra amin'ny kaody mitovy. Averina indray, azo atao ny mamokatra artifact mifanaraka amin'ny sampana fanamafisana samihafa. Ny fiankinan-doha amin'ny dikan-teny manokana amin'ny tranomboky dia voatahiry miaraka amin'ny tefy, ary ireo dikan-teny ireo dia voatahiry mandrakizay isaky ny manapa-kevitra ny hametraka an'io dikan-teny io izahay.

Izay fanovana fanovana rehetra dia mivadika ho fanovana kaody. Ary noho izany, ny tsirairay
ny fanovana dia ho voarakotry ny dingana ara-dalΓ na fiantohana kalitao:

Ticket ao amin'ny tracker bug -> PR -> famerenana -> mitambatra amin'ny sampana mifandraika ->
fampidirana -> fametrahana

Ny voka-dratsy lehibe amin'ny fampiharana ny configuration natambatra dia:

  1. Ny fandrindrana dia hifanaraka amin'ny node rehetra amin'ny rafitra zaraina. Noho ny zava-misy fa ny nodes rehetra dia mahazo config mitovy amin'ny loharano tokana.

  2. Sarotra ny manova ny fandrindrana amin'ny iray amin'ireo nodes. Noho izany, ny "configuration drift" dia tsy azo inoana.

  3. Lasa sarotra kokoa ny manao fanovana kely amin'ny fandrindrana.

  4. Ny ankamaroan'ny fanovana ny fandrindrana dia hitranga ao anatin'ny dingana fampandrosoana amin'ny ankapobeny ary hojerena.

Mila fitehirizana misaraka ve aho mba hitahirizana ny fikirakirana famokarana? Mety misy tenimiafina sy fampahalalana saro-pady hafa izay tiantsika hamerana ny fidirana amin'io tenimiafina io. Mifototra amin'izany, toa misy dikany ny mitahiry ny fanamafisam-peo farany ao anaty tahiry mitokana. Azonao zaraina ho roa ny tefyβ€”ny iray misy firafitry ny fikirakirana azo idirana ho an'ny besinimaro ary ny iray misy fika voafetra. Izany dia ahafahan'ny ankamaroan'ny mpamorona afaka miditra amin'ny fandrindrana mahazatra. Ity fisarahana ity dia mora tratrarina amin'ny fampiasana toetra manelanelana misy sanda mahazatra.

Variations mety

Andeha hojerentsika ny fampitahana ny fanamboarana natambatra amin'ny safidy mahazatra:

  1. rakitra lahatsoratra amin'ny milina kendrena.
  2. Fivarotana sanda manan-danja afovoany (etcd/zookeeper).
  3. Ny singa fanodinana izay azo amboarina / averina tsy misy famerenana ny dingana.
  4. Fitehirizana ny fandrindrana ivelan'ny fifehezana artifact sy version.

Ny rakitra an-tsoratra dia manome fahafahana lehibe amin'ny fanovana kely. Ny mpitantana ny rafitra dia afaka miditra ao amin'ny node lavitra, manova ny rakitra mety ary mamerina ny serivisy. Ho an'ny rafitra lehibe, na izany aza, ny flexibilitΓ© toy izany dia mety tsy ilaina. Ny fanovana natao dia tsy mamela soritra amin'ny rafitra hafa. Tsy misy mijery ny fiovana. Sarotra ny mamaritra hoe iza marina no nanao ny fanovana ary inona no antony. Tsy voasedra ny fiovana. Raha zaraina ny rafitra, dia mety hadinon'ny mpitantana ny fanovana mifanaraka amin'izany amin'ny nodes hafa.

(Tokony ho marihina ihany koa fa tsy manakana ny fampiasana rakitra an-tsoratra amin'ny ho avy ny fampiasana config voaangona. Ampy ny manampy parser sy validator izay mamokatra karazana mitovy amin'ny output. Config, ary afaka mampiasa rakitra an-tsoratra ianao. Manaraka avy hatrany fa ny fahasarotan'ny rafitra miaraka amin'ny fanamafisana natambatra dia somary ambany noho ny fahasarotan'ny rafitra mampiasa rakitra lahatsoratra, satria Ny rakitra lahatsoratra dia mila code fanampiny.)

Ny fivarotana sanda manan-danja afovoany dia mekanika tsara amin'ny fizarana meta masontsivana amin'ny fampiharana zaraina. Mila manapa-kevitra isika hoe inona ny mari-pamantarana fanamafisana ary inona no angona fotsiny. Aoka isika hanana asa C => A => B, ary ny paramètre C zara raha miova, ary data A - matetika. Amin'ity tranga ity dia afaka milaza izany isika C - masontsivana configuration, ary A - data. Hita fa tsy mitovy amin'ny angona ny masontsivana fandrindrana satria amin'ny ankapobeny dia miova matetika kokoa noho ny angona. Ary koa, ny angon-drakitra matetika dia avy amin'ny loharano iray (avy amin'ny mpampiasa), ary ny mari-pamantarana fanamafisana avy amin'ny hafa (avy amin'ny mpitantana ny rafitra).

Raha mila havaozina ny masontsivana tsy fahita firy raha tsy manomboka ny programa, dia mety hitarika ho amin'ny fahasarotan'ny programa izany matetika, satria mila manatitra masontsivana isika, mitahiry, manara-maso ary manamarina, ary manodina ny soatoavina diso. Noho izany, raha jerena ny fampihenana ny fahasarotan'ny programa, dia misy dikany ny fampihenana ny isan'ny masontsivana izay mety hiova mandritra ny fiasan'ny programa (na tsy manohana ireo paramètre toy izany mihitsy).

Ho an'ny tanjon'ity lahatsoratra ity dia hanavaka ny masontsivana static sy dynamic isika. Raha ny lojikan'ny serivisy dia mitaky fanovana masontsivana mandritra ny fampandehanana ny programa, dia antsoina hoe dinamika toy izany isika. Raha tsy izany dia static ny safidy ary azo amboarina amin'ny alΓ lan'ny fanamafisana natambatra. Ho an'ny fanavaozana mavitrika dia mety mila mekanika isika hamerenana ny ampahany amin'ny programa miaraka amin'ny mason-tsivana vaovao, mitovy amin'ny fomba nanombohana ny fizotran'ny rafitra fandidiana. (Amin'ny hevitray, tsara ny misoroka ny fanavaozana amin'ny fotoana tena izy, satria mampitombo ny fahasarotan'ny rafitra izany. Raha azo atao dia tsara kokoa ny mampiasa ny fahaiza-manao OS mahazatra amin'ny fanombohana ny dingana.)

Ny lafiny iray manan-danja amin'ny fampiasana ny fikandrana static izay mahatonga ny olona hihevitra ny fanavaozana mavitrika dia ny fotoana ilana ny rafitra hamerenana indray aorian'ny fanavaozana ny fanamafisana (fotoana tsy mety). Raha ny marina, raha mila manao fanovana amin'ny fikirakirana static isika dia tsy maintsy mamerina ny rafitra mba hampiharana ireo soatoavina vaovao. Ny olana amin'ny fiatoana dia miovaova amin'ny hamafin'ny rafitra samihafa. Amin'ny toe-javatra sasany, azonao atao ny mandamina reboot amin'ny fotoana kely indrindra ny entana. Raha mila manome serivisy mitohy ianao dia azonao atao ny mampihatra Ny fifandraisan'ny AWS ELB. Amin'izay fotoana izay ihany koa, rehefa mila mamerina indray ny rafitra isika, dia manomboka ohatra mifanitsy amin'ity rafitra ity, ampidino ny mpifandanja aminy, ary miandry ny fifandraisana taloha ho vita. Rehefa tapitra ny fifandraisana taloha rehetra dia nanakatona ny rafitra taloha izahay.

Andeha hodinihintsika izao ny olana amin'ny fitehirizana ny fanamafisana ao anatiny na ivelan'ny artifact. Raha mitahiry ny fanamafisam-peo ao anaty artifact isika, fara faharatsiny dia nanana fahafahana hanamarina ny fahamarinan'ny fanitsiana nandritra ny fivorian'ny artifact. Raha ivelan'ny artifact voafehy ny fandrindrana dia sarotra ny manara-maso hoe iza no nanao fanovana tamin'ity rakitra ity ary nahoana. Tena zava-dehibe ve izany? Araka ny hevitray, ho an'ny rafitra famokarana maro dia zava-dehibe ny manana fikirakirana maharitra sy avo lenta.

Ny dikan-tenin'ny artifact dia ahafahanao mamaritra hoe oviana no namoronana azy, inona ny soatoavina ao anatiny, inona no fiasa azo avela/kilemaina, ary iza no tompon'andraikitra amin'ny fanovana rehetra eo amin'ny fanamafisana. Mazava ho azy fa mitaky ezaka kely ny fitehirizana ny fikirakirana ao anaty artifact, noho izany dia mila mandray fanapahan-kevitra tsara ianao.

Pros and Cons

Te-hiresaka momba ny tombony sy ny tsy fahampian'ny teknolojia atolotra aho.

tombony

Ity ambany ity ny lisitr'ireo endri-javatra lehibe amin'ny rafitra voaangona voazara:

  1. Fanamarinana ny fanamafisana static. Mamela anao ho azo antoka izany
    marina ny config.
  2. Fiteny fanefena manankarena. Amin'ny ankapobeny, ny fomba fanamafisam-peo hafa dia voafetra amin'ny fanoloana tady miovaova indrindra. Rehefa mampiasa Scala, dia misy endri-pitenenana maro isan-karazany mba hanatsarana ny fandrindranao. Ohatra azo ampiasaina
    Toetra ho an'ny soatoavina default, amin'ny fampiasana zavatra ho an'ny masontsivana vondrona, azontsika atao ny manondro ny vals nambara indray mandeha monja (MARINA) ao amin'ny sehatra manodidina. Azonao atao ny mametraka kilasy mivantana ao anatin'ny konfigurasi (Seq, Map, kilasy mahazatra).
  3. DSL. Scala dia manana endri-teny maromaro izay manamora ny famoronana DSL. Azo atao ny manararaotra ireo endri-javatra ireo ary mampihatra fiteny fanamafisam-peo izay mety kokoa ho an'ny vondron'ny mpampiasa kendrena, mba ho mora vakian'ny manam-pahaizana manokana amin'ny sehatra. Ny manam-pahaizana manokana dia afaka, ohatra, mandray anjara amin'ny fizotry ny famerenana ny fanamafisana.
  4. Ny fahamendrehana sy ny synchrony eo amin'ny nodes. Ny iray amin'ireo tombony amin'ny fananana rafitra iray manontolo voatahiry amin'ny teboka tokana dia ny hoe ny soatoavina rehetra dia ambara indray mandeha ary avy eo dia ampiasaina indray na aiza na aiza ilana azy. Ny fampiasana karazana phantom mba hanambarana ny seranan-tsambo dia miantoka fa ny nodes dia mampiasa protocols mifanaraka amin'ny rafitra rehetra mety. Ny fananana fiankinana tsy maintsy atao mazava eo amin'ny nodes dia miantoka fa mifandray daholo ny serivisy.
  5. Fiovana avo lenta. Ny fanaovana fanovana amin'ny fanamafisam-peo amin'ny alΓ lan'ny fizotry ny fampivoarana mahazatra dia ahafahana manatratra ny fenitra avo lenta ho an'ny fanamafisana ihany koa.
  6. Fanavaozana fanamafisana miaraka. Ny fametrahana rafitra mandeha ho azy aorian'ny fiovan'ny fandrindrana dia miantoka fa havaozina ny node rehetra.
  7. Fanatsorana ny fampiharana. Ny fampiharana dia tsy mila parsing, fanamarinam-pandaminana, na fitantanana sanda diso. Mampihena ny fahasarotan'ny fampiharana izany. (Ny sasany amin'ireo fahasarotan'ny fanamafisam-peo hita amin'ny ohatra asehontsika dia tsy toetran'ny config voaangona, fa fanapahan-kevitra tonga saina fotsiny notarihin'ny faniriana hanome fiarovana karazana lehibe kokoa.) Tena mora ny miverina amin'ny fanamafisam-peo mahazatra - ampiharo fotsiny ny tsy hita. ampahany. Noho izany, azonao atao, ohatra, ny manomboka amin'ny fanamafisana natambatra, manemotra ny fampiharana ny ampahany tsy ilaina mandra-pahatongan'ny fotoana tena ilaina.
  8. Fanofanana voamarina. Satria ny fiovan'ny fanovana dia manaraka ny fiafaran'ny fiovana hafa rehetra, ny vokatra azonay dia artifact misy dikan-teny tokana. Izany dia mamela antsika, ohatra, hiverina amin'ny dikan-teny teo aloha raha ilaina. Afaka mampiasa ny fanamafisam-peo hatramin'ny herintaona lasa izay isika ary ny rafitra dia hiasa mitovy. Ny fanamafisam-peo marin-toerana dia manatsara ny faminaniany sy ny fahamendrehan'ny rafitra zaraina. Satria raikitra amin'ny dingan'ny fanangonana ny fanamafisam-peo, sarotra be ny manamboatra azy io amin'ny famokarana.
  9. Modularity. Ny rafitra natolotra dia modular ary azo atambatra amin'ny fomba samihafa ny maody mba hamoronana rafitra samihafa. Indrindra indrindra, azonao atao ny manitsy ny rafitra mba hihazakazaka amin'ny node tokana amin'ny endrika iray, ary amin'ny node maromaro amin'ny iray hafa. Azonao atao ny mamorona fanitsiana maromaro ho an'ny tranga famokarana amin'ny rafitra.
  10. Fitsapana. Amin'ny fanoloana ny serivisy tsirairay amin'ny zavatra maneso dia azonao atao ny mahazo dikan-teny maromaro amin'ny rafitra mety amin'ny fitsapana.
  11. Fitsapana fampidirana. Ny fananana rafitra tokana ho an'ny rafitra zaraina manontolo dia ahafahana mampandeha ny singa rehetra amin'ny tontolo voafehy ho ampahany amin'ny fitiliana fampidirana. Mora ny maka tahaka, ohatra, toe-javatra iray izay lasa azo idirana ny node sasany.

Ny tsy fahampiana sy ny fetra

Ny fandrindrana natambatra dia tsy mitovy amin'ny fomba fiasa hafa ary mety tsy mety amin'ny fampiharana sasany. Ireto ambany ireto ny fatiantoka sasany:

  1. Fikirakirana static. Indraindray ianao dia mila manitsy haingana ny fanamafisam-peo amin'ny famokarana, mandingana ny rafitra fiarovana rehetra. Amin'ity fomba ity dia mety ho sarotra kokoa izany. Farafaharatsiny, mbola ilaina ny fanangonana sy ny fametrahana mandeha ho azy. Sady endri-javatra mahasoa amin'ny fomba fiasa izany no fatiantoka amin'ny toe-javatra sasany.
  2. Generation Configuration. Raha toa ka avy amin'ny fitaovana mandeha ho azy ny rakitra fikirakirana dia mety ilaina ny ezaka fanampiny mba hampidirana ny script fananganana.
  3. Tools. Amin'izao fotoana izao, mifototra amin'ny rakitra lahatsoratra ny fitaovana sy teknika natao hiasa miaraka amin'ny fanamafisana. Tsy ny fitaovana/teknika rehetra toy izany dia ho hita ao anatin'ny rafitra natambatra.
  4. Ilaina ny fanovana toe-tsaina. Ny mpamorona sy ny DevOps dia zatra amin'ny rakitra an-tsoratra. Ny tena hevitra momba ny fananganana config dia mety ho tsy ampoizina sy tsy mahazatra ary miteraka fandavana.
  5. Ilaina ny dingana fampandrosoana avo lenta. Mba hampiasana am-pahatoniana ny fandrindrana natambatra dia ilaina ny automatique feno ny fizotran'ny fananganana sy ny fametrahana ny fampiharana (CI/CD). Raha tsy izany dia tena tsy mety.

Andeha hojerentsika ihany koa ny fetra maromaro amin'ny ohatra nodinihina izay tsy mifandray amin'ny hevitra momba ny config natambatra:

  1. Raha manome fampahalalana tsy ilaina amin'ny fanamafisana izay tsy ampiasain'ny node izahay, dia tsy hanampy anay hamantatra ny fampiharana tsy hita ny compiler. Ity olana ity dia azo vahana amin'ny alΓ lan'ny fandaozana ny Pattern Cake ary mampiasa karazana henjana kokoa, ohatra, HList na karazana angon-drakitra algebra (kilasy tranga) mba hanehoana ny fikirakirana.
  2. Misy andalana ao amin'ny fichier configuration izay tsy mifandray amin'ny configuration mihitsy: (package, import,fanambarana zavatra; override def's ho an'ny masontsivana manana sanda default). Azo sorohina amin'ny ampahany izany raha mampihatra ny DSL-nao manokana ianao. Ho fanampin'izany, ny karazana fanamafisam-peo hafa (ohatra, XML) dia mametraka fameperana sasany amin'ny firafitry ny rakitra.
  3. Ho an'ny tanjon'ity lahatsoratra ity dia tsy mihevitra ny fanavaozana mavitrika amin'ny vondron'olona mitovy amin'izany izahay.

famaranana

Ato amin'ity lahatsoratra ity, dia nandinika ny hevitra maneho ny fanamafisana amin'ny kaody loharano izahay amin'ny fampiasana ny fahaiza-manaon'ny rafitra karazana Scala. Ity fomba fiasa ity dia azo ampiasaina amin'ny rindranasa isan-karazany ho solon'ny fomba fanamboarana nentim-paharazana mifototra amin'ny xml na rakitra lahatsoratra. Na dia ampiharina amin'ny Scala aza ny ohatra ataontsika, dia azo afindra amin'ny fiteny hafa natambatra ireo hevitra ireo (toy ny Kotlin, C#, Swift, ...). Azonao atao ny manandrana ity fomba ity amin'ny iray amin'ireto tetik'asa manaraka ireto, ary, raha tsy mandeha izany, dia mifindra amin'ny rakitra lahatsoratra, ampio ireo ampahany tsy hita.

Mazava ho azy fa mila dingana fampandrosoana avo lenta ny fanamafisana natambatra. Ho setrin'izany dia azo antoka ny kalitao avo lenta sy ny fahamendrehan'ny fanamafisana.

Ny fomba fijery noheverina dia azo nitatra:

  1. Azonao atao ny mampiasa macros hanaovana fanamarinana ny fotoana fanangonana.
  2. Azonao atao ny mampihatra DSL mba hanehoana ny fandrindrana amin'ny fomba azon'ny mpampiasa farany idirana.
  3. Azonao atao ny mampihatra ny fitantanana ny loharanon-karena mavitrika miaraka amin'ny fanitsiana fanamafisam-peo mandeha ho azy. Ohatra, ny fanovana ny isan'ny node ao amin'ny cluster dia mitaky ny (1) ny node tsirairay dia mahazo tefy hafa kely; (2) nahazo vaovao momba ny nodes vaovao ny mpitantana cluster.

fankatelemana

Te-hisaotra an'i Andrei Saksonov, Pavel Popov ary Anton Nekhaev aho noho ny fanakianana manorina ny lahatsoratra.

Source: www.habr.com

Add a comment