Kukonzekera Kwadongosolo Lophatikizidwa

Ndikufuna ndikuuzeni njira imodzi yosangalatsa yogwirira ntchito ndi kasinthidwe kadongosolo logawidwa. Kukonzekera kumayimiridwa mwachindunji muchilankhulo chophatikizidwa (Scala) pogwiritsa ntchito mitundu yotetezeka. Chotsatirachi chimapereka chitsanzo cha kasinthidwe kotereku ndikukambirana mbali zosiyanasiyana zogwiritsira ntchito makonzedwe ophatikizidwa muzochitika zonse zachitukuko.

Kukonzekera Kwadongosolo Lophatikizidwa

(chingerezi)

Mau oyamba

Kupanga njira yodalirika yogawa kumatanthauza kuti node zonse zimagwiritsa ntchito kasinthidwe koyenera, kugwirizanitsa ndi mfundo zina. Matekinoloje a DevOps (terraform, ansible kapena china chake) nthawi zambiri amagwiritsidwa ntchito kupanga mafayilo amasinthidwe (nthawi zambiri amakhala enieni pa node iliyonse). Tikufunanso kutsimikizira kuti ma node onse olankhulirana akugwiritsa ntchito ma protocol ofanana (kuphatikiza mtundu womwewo). Apo ayi, kusagwirizana kudzamangidwa mu dongosolo lathu logawidwa. M'dziko la JVM, chotsatira chimodzi cha izi ndikuti mtundu womwewo wa laibulale yomwe ili ndi mauthenga a protocol iyenera kugwiritsidwa ntchito kulikonse.

Nanga bwanji kuyesa dongosolo logawidwa? Zachidziwikire, timaganiza kuti zigawo zonse zili ndi mayeso a mayunitsi tisanapite ku kuyesa kophatikiza. (Kuti tiwonjezere zotsatira za mayeso kuti tigwiritse ntchito, tiyeneranso kupereka mndandanda wofanana wamalaibulale panthawi yoyeserera komanso panthawi yoyeserera.)

Pogwira ntchito ndi mayesero ophatikizana, nthawi zambiri zimakhala zosavuta kugwiritsa ntchito kalasi yofanana paliponse pamanode onse. Zomwe tiyenera kuchita ndikuwonetsetsa kuti kalasi yomweyi ikugwiritsidwa ntchito panthawi yothamanga. (Ngakhale kuli kotheka kwathunthu kuyendetsa ma node osiyanasiyana ndi ma kalasi osiyanasiyana, izi zimawonjezera zovuta ku kasinthidwe konsekonse ndi zovuta ndi mayeso otumizira ndi kuphatikiza.) Pazolinga za positiyi, tikuganiza kuti node zonse zidzagwiritsa ntchito kalasi yofanana.

Masinthidwe amasintha ndi pulogalamuyo. Timagwiritsa ntchito matembenuzidwe kuzindikira magawo osiyanasiyana akusintha kwa pulogalamu. Zikuwoneka zomveka kuzindikiranso masinthidwe osiyanasiyana. Ndipo ikani kasinthidwe palokha mu dongosolo lowongolera mtundu. Ngati pali kasinthidwe kamodzi kokha pakupanga, ndiye kuti titha kugwiritsa ntchito nambala yamtunduwu. Ngati tigwiritsa ntchito zochitika zambiri zopanga, ndiye kuti tidzafunika zingapo
nthambi zosinthira ndi chizindikiro chowonjezera kuwonjezera pa mtunduwo (mwachitsanzo, dzina la nthambi). Mwanjira iyi tingathe kuzindikira bwino lomwe kasinthidwe. Chizindikiritso chilichonse cha kasinthidwe chimagwirizana mwapadera ndi kuphatikiza komwe kumagawidwa, madoko, zida zakunja, ndi mitundu ya library. Pazolinga za positi iyi tidzaganiza kuti pali nthambi imodzi yokha ndipo tikhoza kuzindikira masinthidwe mwachizolowezi pogwiritsa ntchito manambala atatu olekanitsidwa ndi kadontho (1.2.3).

M'madera amakono, mafayilo osinthika sapangidwa kawirikawiri pamanja. Nthawi zambiri amapangidwa panthawi yotumizidwa ndipo samakhudzidwanso (kotero osathyola kalikonse). Funso lachilengedwe limabuka: chifukwa chiyani timagwiritsabe ntchito mawonekedwe amtundu kusunga masinthidwe? Njira ina yotheka ikuwoneka ngati kutha kugwiritsa ntchito ma code nthawi zonse pokonzekera ndikupindula ndi macheke a nthawi.

Mu positi iyi tiwona lingaliro loyimira kasinthidwe mkati mwazopangidwa.

Kukonzekera kophatikizidwa

Chigawochi chimapereka chitsanzo cha kasinthidwe kophatikizana kokhazikika. Ntchito ziwiri zosavuta zimakhazikitsidwa - ntchito ya echo ndi kasitomala wa echo service. Kutengera mautumiki awiriwa, njira ziwiri zamakina zimasonkhanitsidwa. Mwa njira imodzi, mautumiki onsewa ali pamfundo imodzi, mwa njira ina - pamagulu osiyanasiyana.

Kawirikawiri dongosolo logawidwa limakhala ndi mfundo zingapo. Mutha kuzindikira ma node pogwiritsa ntchito zikhalidwe zamtundu wina NodeId:

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

kapena

case class NodeId(hostName: String)

kapena ngakhale

object Singleton
type NodeId = Singleton.type

Ma Node amagwira ntchito zosiyanasiyana, amayendetsa ntchito ndipo kulumikizana kwa TCP/HTTP kumatha kukhazikitsidwa pakati pawo.

Kuti tifotokoze kugwirizana kwa TCP timafunika osachepera nambala ya doko. Tikufunanso kuwonetsa protocol yomwe imathandizidwa padokoli kuti tiwonetsetse kuti kasitomala ndi seva akugwiritsa ntchito njira yomweyo. Tidzafotokozera kugwirizana pogwiritsa ntchito kalasi ili:

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

kumene Port - chiwerengero chonse Int kuwonetsa kuchuluka kwa zinthu zovomerezeka:

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

Mitundu yoyengedwa

Onani laibulale oyeretsedwa ΠΈ wanga lipotilo. Mwachidule, laibulale imakulolani kuti muwonjezere zopinga pamitundu yomwe imawunikidwa panthawi yophatikiza. Pankhaniyi, nambala zovomerezeka za doko ndi 16-bit integers. Kwa kasinthidwe kophatikizidwa, kugwiritsa ntchito laibulale yoyengedwa sikofunikira, koma kumakulitsa luso la wopanga kuti ayang'ane kasinthidwe.

Kwa ma protocol a HTTP (REST), kuwonjezera pa nambala ya doko, tingafunikenso njira yopita kuntchito:

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

Mitundu ya Phantom

Kuti tidziwe protocol pa nthawi yophatikiza, timagwiritsa ntchito mtundu wa parameter womwe sugwiritsidwa ntchito m'kalasi. Chisankhochi ndi chifukwa chakuti sitigwiritsa ntchito chitsanzo pa nthawi yothamanga, koma tikufuna kuti wojambulayo ayang'ane kugwirizana kwa protocol. Mwa kufotokoza ndondomekoyi, sitidzatha kupereka ntchito yosayenera ngati kudalira.

Imodzi mwazinthu zodziwika bwino ndi REST API yokhala ndi Json serialization:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

kumene RequestMessage - mtundu wa pempho, ResponseMessage - mtundu wamayankhidwe.
Zachidziwikire, titha kugwiritsa ntchito mafotokozedwe ena a protocol omwe amapereka kulondola kwamafotokozedwe omwe tikufuna.

Pazolinga za positi iyi, tigwiritsa ntchito njira yosavuta ya protocol:

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

Apa pempho ndi chingwe chowonjezeredwa ku ulalo ndipo yankho ndilo chingwe chobwezeredwa mu thupi la yankho la HTTP.

Kukonzekera kwa ntchito kumafotokozedwa ndi dzina lautumiki, madoko, ndi zodalira. Zinthu izi zitha kuyimiridwa ku Scala m'njira zingapo (mwachitsanzo, HList-s, mitundu ya data ya algebraic). Pazifukwa za positiyi, tigwiritsa ntchito Keke Pattern ndikuyimira ma modules pogwiritsa ntchito trait'ov. (Mtundu wa Keke si chinthu chofunikira panjira iyi. Ndi njira imodzi yokha yokwaniritsira.)

Kudalira pakati pa mautumiki kumatha kuimiridwa ngati njira zomwe zimabwezera madoko EndPointma node ena:

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

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

Kuti mupange utumiki wa echo, zomwe mukufunikira ndi nambala ya doko ndi chisonyezo chakuti doko limathandizira echo protocol. Sitingatchule malo enieni, chifukwa... Makhalidwe amakulolani kulengeza njira popanda kukhazikitsa (njira zosamveka). Pachifukwa ichi, popanga kasinthidwe konkire, wolembayo angafune kuti tipereke kukhazikitsidwa kwa njira yosamvetsetseka ndikupereka nambala ya doko. Popeza takhazikitsa njirayo, popanga masinthidwe enieni, sitingatchule doko losiyana. Mtengo wokhazikika udzagwiritsidwa ntchito.

Mu kasinthidwe ka kasitomala timalengeza kudalira ntchito ya echo:

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

Kudalira ndikofanana ndi ntchito yotumizidwa kunja echoService. Makamaka, mu kasitomala wa echo timafuna protocol yomweyo. Choncho, polumikiza mautumiki awiri, tikhoza kukhala otsimikiza kuti zonse zidzagwira ntchito bwino.

Kukhazikitsa ntchito

Ntchito ikufunika kuti muyambitse ndikuyimitsa ntchitoyo. (Kutha kuyimitsa ntchito ndikofunikira pakuyesa.) Apanso, pali njira zingapo zogwiritsira ntchito izi (mwachitsanzo, titha kugwiritsa ntchito makalasi amtundu kutengera mtundu wa kasinthidwe). Pazolinga za positi iyi tigwiritsa ntchito Keke Pattern. Tiyimilira ntchitoyo pogwiritsa ntchito kalasi cats.Resource, chifukwa Kalasi iyi yapereka kale njira zotsimikizira kumasulidwa kwazinthu ngati pangakhale mavuto. Kuti tipeze gwero, tiyenera kupereka kasinthidwe ndi nthawi yokonzekera yokonzekera. Ntchito yoyambira ntchito imatha kuwoneka motere:

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

kumene

  • Config - mtundu kasinthidwe kwa utumiki uwu
  • AddressResolver - chinthu chothamanga chomwe chimakupatsani mwayi wodziwa ma adilesi a node zina (onani pansipa)

ndi mitundu ina ya laibulale cats:

  • F[_] - mtundu wa zotsatira (posavuta F[A] ikhoza kukhala ntchito () => A. Mu positi tigwiritsa ntchito cats.IO.)
  • Reader[A,B] - zambiri kapena zochepa zofanana ndi ntchito A => B
  • cats.Resource - gwero lomwe lingapezeke ndikumasulidwa
  • Timer - timer (imakupatsani mwayi kuti mugone kwakanthawi ndikuyesa nthawi)
  • ContextShift - analogi ExecutionContext
  • Applicative - kalasi yamtundu wamtundu womwe umakupatsani mwayi wophatikiza zotsatira zapayekha (pafupifupi monad). Muzinthu zovuta kwambiri zikuwoneka bwino kugwiritsa ntchito Monad/ConcurrentEffect.

Pogwiritsa ntchito siginecha iyi titha kukhazikitsa mautumiki angapo. Mwachitsanzo, ntchito yomwe sichita chilichonse:

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

(Cm. gwero, momwe ntchito zina zimagwiritsidwira ntchito - utumiki wa echo, echo kasitomala
ΠΈ olamulira moyo wonse.)

Node ndi chinthu chomwe chitha kuyambitsa mautumiki angapo (kukhazikitsidwa kwazinthu zambiri kumatsimikiziridwa ndi Keke Pattern):

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

Chonde dziwani kuti tikulongosola mtundu weniweni wa kasinthidwe komwe kumafunikira pa node iyi. Ngati tiiwala kufotokoza mtundu umodzi wa kasinthidwe womwe umafunidwa ndi ntchito inayake, padzakhala cholakwika chophatikiza. Komanso, sitingathe kuyambitsa node pokhapokha titapereka chinthu china chamtundu woyenera ndi deta zonse zofunika.

Host Name Resolution

Kuti tilumikizane ndi olandila akutali, timafunikira adilesi yeniyeni ya IP. Ndizotheka kuti adilesiyo idzadziwika mochedwa kuposa kasinthidwe ena onse. Chifukwa chake tikufuna ntchito yomwe imayika ma ID a node ku adilesi:

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

Pali njira zingapo zogwiritsira ntchito izi:

  1. Ngati ma adilesi adziwika kwa ife tisanatumizidwe, ndiye kuti titha kupanga nambala ya Scala ndi
    ma adilesi ndikuyendetsa kumanga. Izi zidzaphatikiza ndikuyesa mayeso.
    Pankhaniyi, ntchitoyi idzadziwika mokhazikika ndipo ikhoza kuyimiridwa mu code ngati mapu Map[NodeId, NodeAddress].
  2. Nthawi zina, adilesi yeniyeni imadziwika pokhapokha node itayamba.
    Pankhaniyi, tikhoza kukhazikitsa "ntchito yotulukira" yomwe imayenda patsogolo pa ma node ena ndipo ma node onse adzalembetsa ndi ntchitoyi ndikupempha maadiresi a ma node ena.
  3. Ngati tingathe kusintha /etc/hosts, ndiye mutha kugwiritsa ntchito mayina omwe adafotokozedweratu (monga my-project-main-node ΠΈ echo-backend) ndikungolumikiza mayinawa
    ndi ma adilesi a IP panthawi yotumiza.

Mu positi iyi sitidzalingalira za milanduyi mwatsatanetsatane. Zathu
mu chitsanzo cha chidole, node zonse zidzakhala ndi adilesi yomweyo ya IP - 127.0.0.1.

Kenako, timayang'ana njira ziwiri za dongosolo logawa:

  1. Kuyika mautumiki onse pa node imodzi.
  2. Ndipo kuchititsa utumiki wa echo ndi echo kasitomala pamagulu osiyanasiyana.

Kukonzekera kwa node imodzi:

Kukonzekera kwa node imodzi

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

Chinthucho chimagwiritsa ntchito kasinthidwe ka kasitomala ndi seva. Kukonzekera kwa nthawi yokhala ndi moyo kumagwiritsidwanso ntchito kuti pakatha nthawiyi lifetime kuletsa pulogalamu. (Ctrl-C imagwiranso ntchito ndikumasula zonse moyenera.)

Makhalidwe omwewo a kasinthidwe ndi kukhazikitsa angagwiritsidwe ntchito popanga dongosolo lokhala ndi mfundo ziwiri zosiyana:

Kukonzekera kwa node ziwiri

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

Zofunika! Zindikirani momwe mautumikiwa akugwirizanirana. Timalongosola ntchito yokhazikitsidwa ndi node imodzi ngati kukhazikitsa njira yodalira ya node ina. Mtundu wodalira umawunikidwa ndi wolemba, chifukwa ili ndi mtundu wa protocol. Mukathamanga, kudalira kudzakhala ndi ID yolondola ya node. Chifukwa cha chiwembu ichi, timatchula nambala ya doko ndendende kamodzi ndipo timatsimikiziridwa nthawi zonse kuti tilozera ku doko lolondola.

Kukhazikitsa mfundo ziwiri zadongosolo

Pokonzekera uku, timagwiritsa ntchito machitidwe omwewo popanda kusintha. Kusiyana kokha ndikuti tili ndi zinthu ziwiri zomwe zimagwiritsa ntchito mautumiki osiyanasiyana:

  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
  }

Node yoyamba imagwiritsa ntchito seva ndipo imangofunika kasinthidwe ka seva. Node yachiwiri imagwiritsa ntchito kasitomala ndikugwiritsa ntchito gawo lina la kasinthidwe. Komanso ma node onsewa amafunikira kasamalidwe ka moyo wonse. Node ya seva imayenda mpaka kalekale mpaka itayimitsidwa SIGTERM'om, ndipo node ya kasitomala imatha pakapita nthawi. Cm. pulogalamu yoyambitsa.

General chitukuko ndondomeko

Tiyeni tiwone momwe njira yosinthira iyi imakhudzira chitukuko chonse.

Kukonzekera kudzapangidwa pamodzi ndi ma code ena onse ndipo chojambula (.jar) chidzapangidwa. Zikuwoneka kuti ndizomveka kuyika kasinthidwe muzinthu zosiyana. Izi ndichifukwa choti titha kukhala ndi masinthidwe angapo kutengera ma code omwewo. Apanso, ndizotheka kupanga zinthu zakale zogwirizana ndi nthambi zosinthika zosiyanasiyana. Kudalira kwamitundu ina ya malaibulale kumasungidwa limodzi ndi kasinthidwe, ndipo matembenuzidwewa amasungidwa kwanthawi zonse tikaganiza zotumiza makonzedwewo.

Kusintha kulikonse kumasinthidwa kukhala kusintha kwa code. Choncho, aliyense
kusinthaku kudzatsatiridwa ndi njira yotsimikizika yabwino:

Tikiti mu bug tracker -> PR -> ndemanga -> kuphatikiza ndi nthambi zoyenera ->
kuphatikiza -> kutumiza

Zotsatira zazikulu za kukhazikitsa kasinthidwe kophatikizidwa ndi:

  1. Kukonzekera kudzakhala kofanana pamagulu onse a dongosolo logawidwa. Chifukwa chakuti mfundo zonse zimalandira kasinthidwe kofanana kuchokera ku gwero limodzi.

  2. Ndizovuta kusintha masinthidwe mu imodzi mwa node. Chifukwa chake, "kusintha kwakusintha" sikutheka.

  3. Zimakhala zovuta kupanga zosintha zazing'ono pakukonzekera.

  4. Zosintha zambiri zamasinthidwe zidzachitika ngati gawo lachitukuko chonse ndipo zidzawunikidwanso.

Kodi ndikufunika nkhokwe yapadera kuti ndisunge masinthidwe opanga? Kusinthaku kutha kukhala ndi mawu achinsinsi ndi zidziwitso zina zachinsinsi zomwe tikufuna kuletsa kuzilowetsa. Kutengera izi, zikuwoneka kuti ndizomveka kusunga kasinthidwe komaliza kumalo osungirako osiyana. Mutha kugawa zosinthazo m'magawo awiri-imodzi yokhala ndi zokonda zopezeka ndi anthu ndipo imodzi yokhala ndi zoletsedwa. Izi zidzalola opanga ambiri kukhala ndi mwayi wogwiritsa ntchito zomwe wamba. Kupatukanaku ndikosavuta kukwaniritsidwa pogwiritsa ntchito zikhalidwe zapakatikati zomwe zili ndi zikhalidwe zosasinthika.

Zosintha zotheka

Tiyeni tiyese kufananiza kasinthidwe kophatikizidwa ndi njira zina zodziwika:

  1. Lembani fayilo pamakina omwe mukufuna.
  2. Sitolo yamtengo wapatali yapakati (etcd/zookeeper).
  3. Zigawo za ndondomeko zomwe zingathe kukonzedwanso / kuyambiranso popanda kuyambitsanso ndondomekoyi.
  4. Kusunga zochunira kunja kwa zinthu zakale komanso zowongolera mtundu.

Mafayilo olembera amapereka kusinthasintha kwakukulu potengera kusintha kwakung'ono. Woyang'anira dongosolo amatha kulowa mu node yakutali, kusintha mafayilo oyenerera ndikuyambiranso ntchitoyo. Kwa machitidwe akuluakulu, komabe, kusinthasintha koteroko sikungakhale kofunikira. Zosintha zomwe zidachitika sizikusiyanso m'machitidwe ena. Palibe amene amawona zosinthazi. N'zovuta kudziwa amene kwenikweni anasintha ndi chifukwa chiyani. Zosintha sizimayesedwa. Ngati dongosolo likugawidwa, ndiye kuti woyang'anira akhoza kuiwala kupanga kusintha kofanana pa mfundo zina.

(Kuyeneranso kuzindikiridwa kuti kugwiritsa ntchito kasinthidwe kophatikizidwa sikutseka mwayi wogwiritsa ntchito mafayilo olembedwa m'tsogolomu. Zidzakhala zokwanira kuwonjezera parser ndi validator yomwe imapanga mtundu wofanana ndi zotsatira. Config, ndipo mutha kugwiritsa ntchito mafayilo amawu. Nthawi yomweyo zimatsatira kuti zovuta zamakina omwe ali ndi kasinthidwe kophatikizidwa ndizocheperako kuposa zovuta zamakina ogwiritsa ntchito mafayilo amawu, chifukwa. mafayilo amafunikira ma code owonjezera.)

Sitolo yamtengo wapatali yapakati ndi njira yabwino yogawa magawo a meta a ntchito yogawidwa. Tiyenera kusankha kuti masinthidwe ndi ati komanso zomwe ndi data chabe. Tiyeni tikhale ndi ntchito C => A => B, ndi magawo C kawirikawiri kusintha, ndi deta A - nthawi zambiri. Pamenepa tikhoza kunena kuti C - magawo kasinthidwe, ndi A - data. Zikuwoneka kuti masinthidwe amasiyana ndi deta chifukwa nthawi zambiri amasintha mocheperapo poyerekeza ndi deta. Komanso, deta nthawi zambiri imachokera ku gwero limodzi (kuchokera kwa wogwiritsa ntchito), ndi magawo osinthika kuchokera kwa wina (kuchokera kwa woyang'anira dongosolo).

Ngati nthawi zambiri kusintha magawo kumafunika kusinthidwa popanda kuyambitsanso pulogalamuyo, ndiye kuti izi zimatha kuyambitsa zovuta za pulogalamuyo, chifukwa tidzafunika mwanjira ina kupereka magawo, kusunga, kuwona ndikuwona, ndikukonza zolakwika. Choncho, pakuwona kuchepetsa zovuta za pulogalamuyi, ndizomveka kuchepetsa chiwerengero cha magawo omwe angasinthe panthawi ya pulogalamu (kapena osachirikiza magawo oterowo).

Pazolinga za positiyi, tisiyanitsa pakati pa magawo osasunthika komanso osinthika. Ngati lingaliro lautumiki likufuna kusintha magawo panthawi yogwiritsira ntchito pulogalamuyo, ndiye kuti timatcha magawo oterowo kukhala amphamvu. Apo ayi zosankhazo ndizokhazikika ndipo zingathe kukhazikitsidwa pogwiritsa ntchito kasinthidwe kophatikizidwa. Pakusinthanso kwamphamvu, tingafunike njira yoti tiyambitsenso magawo a pulogalamuyo ndi magawo atsopano, ofanana ndi momwe magwiridwe antchito amayambitsidwiranso. (M'malingaliro athu, ndibwino kuti tipewe kukonzanso nthawi yeniyeni, chifukwa izi zimawonjezera zovuta za dongosololi. Ngati n'kotheka, ndi bwino kugwiritsa ntchito mphamvu za OS kuti muyambitsenso njira.)

Chinthu chimodzi chofunikira chogwiritsira ntchito static configuration chomwe chimapangitsa anthu kulingalira kukonzanso kosinthika ndi nthawi yomwe imatengera kuti dongosolo liyambirenso pambuyo pa kusintha kwa kasinthidwe (nthawi yopuma). M'malo mwake, ngati tifunika kusintha masinthidwe okhazikika, tidzayenera kuyambitsanso dongosolo kuti zikhalidwe zatsopano ziyambe kugwira ntchito. Vuto la nthawi yochepetsera limasiyanasiyana mozama kwa machitidwe osiyanasiyana. Nthawi zina, mukhoza kukonza kuyambiransoko panthawi yomwe katunduyo ndi wochepa. Ngati mukufuna kupereka utumiki mosalekeza, mukhoza kukhazikitsa AWS ELB kugwirizana kukhetsa. Panthawi imodzimodziyo, pamene tifunika kuyambiranso dongosolo, timayambitsa chitsanzo chofanana cha dongosololi, kusinthana ndi balancer, ndikudikirira kuti malumikizidwe akale amalize. Malumikizidwe onse akale atatha, timatseka mawonekedwe akale a dongosolo.

Tiyeni tsopano tilingalire nkhani yosunga kasinthidwe mkati kapena kunja kwa chinthucho. Ngati tisunga kasinthidwe mkati mwa chinthu chopangidwa, ndiye kuti tinali ndi mwayi wotsimikizira kulondola kwa kasinthidwe panthawi yosonkhanitsa zinthuzo. Ngati kasinthidwe ali kunja kwa zida zoyendetsedwa, zimakhala zovuta kudziwa yemwe adasintha fayiloyi komanso chifukwa chake. Ndilofunika bwanji? M'malingaliro athu, kwa machitidwe ambiri opanga ndikofunika kukhala ndi dongosolo lokhazikika komanso lapamwamba.

Mtundu wa chinthu chopangidwacho umakupatsani mwayi wodziwa nthawi yomwe idapangidwa, zomwe zili ndi mfundo zake, ndi ntchito ziti zomwe zimayatsidwa / kuzimitsa, komanso ndani yemwe ali ndi udindo pakusintha kulikonse. Inde, kusunga kasinthidwe mkati mwa chinthu chopangidwa kumafuna khama, kotero muyenera kupanga chisankho mwanzeru.

Zabwino ndi zowawa

Ndikufuna kukhala pazabwino ndi zoyipa zaukadaulo womwe ukufunsidwa.

ubwino

Pansipa pali mndandanda wazinthu zazikulu za kasinthidwe kachitidwe kogawidwa:

  1. Chekeni kasinthidwe. Zimakulolani kuti mutsimikizire kuti
    kasinthidwe ndi kolondola.
  2. Chilankhulo chochulukira. Nthawi zambiri, njira zina zosinthira zimangokhala zosinthira zingwe nthawi zambiri. Mukamagwiritsa ntchito Scala, zilankhulo zambiri zimapezeka kuti musinthe masinthidwe anu. Mwachitsanzo tingagwiritse ntchito
    Makhalidwe amakhalidwe osasinthika, pogwiritsa ntchito zinthu kumagulu amagulu, titha kuloza ku ma vals omwe amalengezedwa kamodzi kokha (DRY) mumayendedwe otsekeredwa. Mutha kukhazikitsa makalasi aliwonse mwachindunji mkati mwa kasinthidwe (Seq, Map, maphunziro apadera).
  3. DSL. Scala ili ndi zilankhulo zingapo zomwe zimapangitsa kukhala kosavuta kupanga DSL. Ndizotheka kupezerapo mwayi pazinthu izi ndikukhazikitsa chilankhulo chosinthira chomwe chili chosavuta kwa gulu la ogwiritsa ntchito, kotero kuti kasinthidwe kake kakhoza kuwerengedwa ndi akatswiri odziwika. Akatswiri atha, mwachitsanzo, kutenga nawo gawo pakuwunikanso kasinthidwe.
  4. Umphumphu ndi synchrony pakati mfundo. Ubwino umodzi wokhala ndi kasinthidwe kadongosolo lonse logawidwa losungidwa pamalo amodzi ndikuti zikhalidwe zonse zimalengezedwa ndendende kamodzi ndiyeno zimagwiritsidwanso ntchito kulikonse komwe zikufunika. Kugwiritsa ntchito mitundu ya phantom kulengeza madoko kumatsimikizira kuti ma node akugwiritsa ntchito ma protocol ogwirizana pamasinthidwe olondola adongosolo. Kukhala ndi kudalira kovomerezeka pakati pa ma node kumatsimikizira kuti mautumiki onse alumikizidwa.
  5. Kusintha kwapamwamba kwambiri. Kupanga kusintha kwa kasinthidwe pogwiritsa ntchito njira yachitukuko yofanana kumapangitsa kuti zikhale zotheka kukwaniritsa miyezo yapamwamba yokonzekera komanso.
  6. Kusintha kosinthika munthawi yomweyo. Kutumiza kwadongosolo kokha pambuyo pa kusintha kwa kasinthidwe kumatsimikizira kuti node zonse zasinthidwa.
  7. Kufewetsa ntchito. Pulogalamuyi sifunikira kusanthula, kuyang'ana masinthidwe, kapena kuwongolera zolakwika. Izi zimachepetsa zovuta za ntchito. (Zina mwazovuta za kasinthidwe zomwe zawonedwa mu chitsanzo chathu sizitengera kasinthidwe kophatikizidwa, koma ndi lingaliro lozindikira lotsogozedwa ndi chikhumbo chofuna kupereka chitetezo chamtundu wambiri.) Ndikosavuta kubwerera ku kasinthidwe wamba - ingogwiritsani ntchito zomwe zikusowa. magawo. Chifukwa chake, mutha, mwachitsanzo, kuyamba ndi kasinthidwe kophatikizidwa, kuchedwetsa kukhazikitsidwa kwa magawo osafunikira mpaka nthawi yomwe ikufunika.
  8. Kusintha kotsimikizika. Popeza masinthidwe amasinthidwe amatsata zomwe zasintha pakusintha kwina kulikonse, zomwe timapeza ndizopangidwa ndi mtundu wapadera. Izi zimatipatsa ife, mwachitsanzo, kubwerera ku mtundu wakale wa kasinthidwe ngati kuli kofunikira. Titha kugwiritsa ntchito kasinthidwe kuyambira chaka chapitacho ndipo dongosolo lidzagwira ntchito chimodzimodzi. Kukonzekera kokhazikika kumawongolera kulosera ndi kudalirika kwa dongosolo logawidwa. Popeza kasinthidwe kameneka kamakhazikitsidwa panthawi yophatikizira, ndizovuta kwambiri kuti apangire zabodza.
  9. Modularity. Ndondomeko yomwe ikuperekedwayi ndi modular ndipo ma modules akhoza kuphatikizidwa m'njira zosiyanasiyana kuti apange machitidwe osiyanasiyana. Makamaka, mutha kukonza dongosolo kuti liziyenda pamfundo imodzi mwanjira imodzi, komanso pamanodi angapo mumzake. Mutha kupanga masinthidwe angapo opangira zochitika zadongosolo.
  10. Kuyesa. Posintha mautumiki apaokha ndi zinthu zonyozeka, mutha kupeza mitundu ingapo yamakina omwe ndi yabwino kuyesa.
  11. Kuyesa kwa kuphatikiza. Kukhala ndi dongosolo limodzi la dongosolo lonse logawidwa kumapangitsa kuti zikhale zotheka kuyendetsa zigawo zonse mu malo olamulidwa monga gawo la kuyesa kugwirizanitsa. Ndikosavuta kutengera, mwachitsanzo, momwe ma node ena amafikirako.

Zoipa ndi zolephera

Masinthidwe ophatikizidwa amasiyana ndi makonzedwe ena ndipo mwina sangakhale oyenera kugwiritsa ntchito zina. M'munsimu muli zovuta zina:

  1. Kusintha kokhazikika. Nthawi zina muyenera kukonza kasinthidwe mukupanga, kudutsa njira zonse zotetezera. Ndi njira iyi zingakhale zovuta kwambiri. Pang'ono ndi pang'ono, kuphatikizika ndi kutumizidwa kwaotomatiki kudzafunikabe. Izi ndi mbali zothandiza za njira komanso kuipa nthawi zina.
  2. Kupanga kasinthidwe. Ngati fayilo yosinthika ipangidwa ndi chida chodziwikiratu, kuyesetsa kwina kungafunike kuphatikiza zolemba zomanga.
  3. Zida. Pakadali pano, zida ndi njira zomwe zimapangidwira kuti zizigwira ntchito ndi kasinthidwe zimatengera mafayilo amawu. Sizinthu zonse / njira zotere zomwe zidzapezeke pokonzekera.
  4. M'pofunika kusintha maganizo. Madivelopa ndi Ma DevOps amazolowera mafayilo amawu. Lingaliro lenilenilo lopanga masinthidwe litha kukhala losayembekezereka komanso lachilendo ndikupangitsa kukanidwa.
  5. Njira yachitukuko yapamwamba ndiyofunikira. Kuti mugwiritse ntchito bwino kasinthidwe kophatikizidwa, makina okhazikika omanga ndi kutumiza pulogalamuyo (CI/CD) ndiyofunikira. Apo ayi, zidzakhala zovuta kwambiri.

Tiyeni tikumbukirenso zofooka zingapo za chitsanzo chomwe sichikugwirizana ndi lingaliro la kasinthidwe kophatikizidwa:

  1. Ngati tipereka chidziwitso chosafunikira chomwe sichimagwiritsidwa ntchito ndi node, ndiye kuti wopangayo sangatithandizire kuzindikira zomwe zikusowa. Vutoli litha kuthetsedwa mwa kusiya Chitsanzo cha Keke ndikugwiritsa ntchito mitundu yolimba, mwachitsanzo, HList kapena mitundu ya data ya algebraic (makalasi amilandu) kuyimira kasinthidwe.
  2. Pali mizere mufayilo yosinthira yomwe siyikugwirizana ndi kasinthidwe komweko: (package, import,zolengeza za chinthu; override def's za magawo omwe ali ndi makonda osasintha). Izi zitha kupewedwa pang'ono ngati mugwiritsa ntchito DSL yanu. Kuphatikiza apo, mitundu ina ya kasinthidwe (mwachitsanzo, XML) imayikanso zoletsa zina pamafayilo.
  3. Pazifukwa za positi iyi, sitikulingalira kukonzanso kosinthika kwamagulu a ma node ofanana.

Pomaliza

Mu positi iyi, tidasanthula lingaliro loyimira kasinthidwe mu code code pogwiritsa ntchito luso lapamwamba la mtundu wa Scala. Njirayi itha kugwiritsidwa ntchito m'mapulogalamu osiyanasiyana monga m'malo mwa njira zamasinthidwe achikhalidwe potengera xml kapena mafayilo amawu. Ngakhale chitsanzo chathu chikugwiritsidwa ntchito ku Scala, malingaliro omwewo amatha kusamutsidwa kuzilankhulo zina zophatikizidwa (monga Kotlin, C #, Swift, ...). Mutha kuyesa njira iyi mu imodzi mwazinthu zotsatirazi, ndipo, ngati sizikugwira ntchito, pitilizani ku fayilo yamawu, ndikuwonjezera magawo omwe akusowa.

Mwachilengedwe, kasinthidwe kophatikizidwa kumafuna njira yachitukuko chapamwamba. Pobwezera, khalidwe lapamwamba ndi kudalirika kwa kasinthidwe kumatsimikiziridwa.

Njira yowonjezera ikhoza kuwonjezeredwa:

  1. Mutha kugwiritsa ntchito ma macros kuti mupange macheke a nthawi.
  2. Mutha kugwiritsa ntchito DSL kuti muwonetse kasinthidwe m'njira yomwe ikupezeka kwa ogwiritsa ntchito kumapeto.
  3. Mutha kugwiritsa ntchito dynamic resource management ndikusintha kasinthidwe kodziwikiratu. Mwachitsanzo, kusintha chiwerengero cha nodes mu masango kumafuna kuti (1) node iliyonse ilandire kasinthidwe kosiyana pang'ono; (2) woyang'anira gulu adalandira zambiri za node zatsopano.

Zothokoza

Ndikufuna kuthokoza Andrei Saksonov, Pavel Popov ndi Anton Nekhaev chifukwa cha kutsutsa kwawo kolimbikitsa pa nkhani yokonzekera.

Source: www.habr.com

Kuwonjezera ndemanga