Kukonzekera kogwirizana kwa dongosolo logawidwa

Mu positi iyi tikufuna kugawana njira yosangalatsa yothanirana ndi kasinthidwe kadongosolo logawidwa.
Kukonzekera kumayimiridwa mwachindunji muchilankhulo cha Scala mwanjira yotetezeka. Chitsanzo kukhazikitsa chikufotokozedwa mwatsatanetsatane. Mbali zosiyanasiyana za ndondomekoyi zikukambidwa, kuphatikizapo chikoka pa chitukuko chonse.

Kukonzekera kogwirizana kwa dongosolo logawidwa

(mu Russian)

Introduction

Kupanga machitidwe ogawa olimba kumafuna kugwiritsa ntchito koyenera komanso kogwirizana pamanode onse. Njira yothetsera vutoli ndikugwiritsa ntchito kufotokozera kwa malemba (terraform, ansible kapena chinachake chofanana) ndi mafayilo osinthidwa okha (nthawi zambiri - operekedwa pa node / gawo lililonse). Tikufunanso kugwiritsa ntchito ma protocol omwewo pamagawo aliwonse olumikizirana (kupanda kutero tingakumane ndi zosagwirizana). M'dziko la JVM izi zikutanthauza kuti laibulale yotumizira mauthenga iyenera kukhala yofanana pamitundu yonse yolumikizirana.

Nanga bwanji kuyesa dongosolo? Zachidziwikire, tiyenera kukhala ndi mayeso a mayunitsi pazinthu zonse tisanabwere ku mayeso ophatikiza. Kuti tithe kutulutsa zotsatira za mayeso pa nthawi yothamanga, tiyenera kuwonetsetsa kuti zomasulira za malaibulale onse zikusungidwa mofanana m'malo oyeserera komanso nthawi yoyeserera.

Mukayesa kuyesa kuphatikiza, nthawi zambiri zimakhala zosavuta kukhala ndi njira yofanana pamanode onse. Tiyenera kuwonetsetsa kuti kalasi yomweyi ikugwiritsidwa ntchito potumiza. (N'zotheka kugwiritsa ntchito njira zosiyanasiyana zamakalasi pamanode osiyanasiyana, koma ndizovuta kwambiri kuyimira kasinthidwe uku ndikuyika moyenera.) Kotero kuti zinthu zikhale zosavuta tidzangoganizira zamagulu ofanana pamagulu onse.

Kukonzekera kumakonda kusinthika pamodzi ndi mapulogalamu. Nthawi zambiri timagwiritsa ntchito matembenuzidwe kuzindikira zosiyanasiyana
magawo a kusintha kwa mapulogalamu. Zikuwoneka zomveka kubisa masinthidwe pansi pa kasamalidwe ka mtunduwo ndikuzindikira masinthidwe osiyanasiyana ndi zilembo zina. Ngati pali masinthidwe amodzi okha, titha kugwiritsa ntchito mtundu umodzi ngati chizindikiritso. Nthawi zina titha kukhala ndi malo angapo opanga. Ndipo pa chilengedwe chilichonse tingafunike nthambi yosinthira. Chifukwa chake masinthidwe amatha kulembedwa ndi nthambi ndi mtundu kuti azindikire masinthidwe osiyanasiyana. Chilembo chilichonse chanthambi ndi mtundu zimafanana ndi kuphatikiza kumodzi kwa ma node, madoko, zida zakunja, mitundu ya library ya classpath pa node iliyonse. Apa tingoyang'ana nthambi imodzi ndikuzindikira masanjidwe ndi magawo atatu a decimal (1.2.3), mofanana ndi zinthu zina zakale.

M'malo amakono mafayilo amasinthidwe sasinthidwanso pamanja. Nthawi zambiri timapanga
config pa nthawi yotumiza ndi musawakhudze konse pambuyo pake. Ndiye wina atha kufunsa chifukwa chiyani tikugwiritsabe ntchito malembedwe pamafayilo osinthira? Njira yabwino ndikuyika kasinthidwe mkati mwa gulu lophatikizira ndikupindula ndi kutsimikizika kwa nthawi yophatikizira.

Mu positi iyi tiwona lingaliro lakusunga kasinthidwe muzopangidwazo.

Kukonzekera kogwirizana

M'chigawo chino tikambirana chitsanzo cha static kasinthidwe. Ntchito ziwiri zosavuta - echo service ndi kasitomala wa echo service ikukonzedwa ndikukhazikitsidwa. Ndiye machitidwe awiri osiyana omwe amagawidwa omwe ali ndi mautumiki onsewa amakhazikitsidwa. Imodzi ndi ya kasinthidwe ka node imodzi ndi inanso ya ma node awiri.

Dongosolo logawanitsa lili ndi mfundo zingapo. Ma node amatha kudziwika pogwiritsa ntchito mitundu ina:

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

kapena basi

case class NodeId(hostName: String)

kapena ngakhale

object Singleton
type NodeId = Singleton.type

Ma nodewa amagwira ntchito zosiyanasiyana, amayendetsa ntchito zina ndipo amayenera kulumikizana ndi ma node ena pogwiritsa ntchito ma TCP/HTTP.

Pa kulumikizana kwa TCP osachepera nambala ya doko ndiyofunika. Tikufunanso kuwonetsetsa kuti kasitomala ndi seva akulankhula njira yomweyo. Kuti tichite chitsanzo cha mgwirizano pakati pa nodes tiyeni tilengeze gulu ili:

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

kumene Port ndi a Int mkati mwa mtunda wololedwa:

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

Mitundu yoyengedwa

Onani oyeretsedwa laibulale. Mwachidule, zimalola kuwonjezera zolepheretsa nthawi ku mitundu ina. Pamenepa Int zimangololedwa kukhala ndi ma 16-bit omwe angayimire nambala ya doko. Palibe chifukwa chogwiritsa ntchito laibulale iyi pakukonzekera njira iyi. Zikungowoneka kuti zikugwirizana bwino kwambiri.

Kwa HTTP (REST) ​​​​tingafunikenso njira yautumiki:

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

Mtundu wa Phantom

Kuti tidziwe protocol pakuphatikiza tikugwiritsa ntchito mawonekedwe a Scala polengeza mkangano wamtundu Protocol zomwe sizimagwiritsidwa ntchito m'kalasi. Ndi zomwe zimatchedwa mtundu wa phantom. Pa nthawi yothamanga sitifuna kawirikawiri chizindikiro cha protocol, ndichifukwa chake sitimachisunga. Pakuphatikiza mtundu wa phantom umapereka chitetezo chamtundu wina. Sitingadutse doko ndi protocol yolakwika.

Imodzi mwama protocol omwe amagwiritsidwa ntchito kwambiri ndi REST API yokhala ndi Json serialization:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

kumene RequestMessage ndiye mtundu woyambira wa mauthenga omwe kasitomala angatumize ku seva ndi ResponseMessage ndi meseji yoyankha kuchokera ku seva. Zachidziwikire, titha kupanga mafotokozedwe ena a protocol omwe amafotokozera njira yolumikizirana yomwe tikufuna.

Pazolinga za positi iyi tigwiritsa ntchito njira yosavuta ya protocol:

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

Mu uthenga wopempha wa protocol uwu umawonjezeredwa ku url ndipo uthenga wamayankho umabwezedwa ngati chingwe chosavuta.

Kukonzekera kwa ntchito kumatha kufotokozedwa ndi dzina lautumiki, gulu la madoko ndi zodalira zina. Pali njira zingapo zotheka zoyimira zinthu zonsezi ku Scala (mwachitsanzo, HList, mitundu ya data ya algebraic). Pazifukwa za positi iyi tigwiritsa ntchito Keke Pattern ndikuyimira zidutswa zophatikiza (ma module) ngati mawonekedwe. (Pangani Keke sichofunikira panjira yophatikizika iyi. Ndi njira imodzi yokha yokwaniritsira lingalirolo.)

Kudalira kutha kuyimiridwa pogwiritsa ntchito Keke Pattern monga mapeto a mfundo zina:

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

Ntchito ya Echo imangofunika doko lokhazikitsidwa. Ndipo tikulengeza kuti dokoli limathandizira echo protocol. Zindikirani kuti sitiyenera kutchula doko linalake pakadali pano, chifukwa chikhalidwechi chimalola kulengeza kwa njira zosadziwika. Ngati tigwiritsa ntchito njira zosawerengeka, compiler idzafuna kukhazikitsa muzochitika zosintha. Apa tapereka kukhazikitsidwa (8081) ndipo idzagwiritsidwa ntchito ngati mtengo wokhazikika ngati tidumpha mu kasinthidwe konkire.

Titha kulengeza kudalira pakusintha kwa kasitomala wa echo:

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

Kudalira kuli ndi mtundu wofanana ndi wa echoService. Makamaka, imafuna protocol yomweyo. Chifukwa chake, titha kukhala otsimikiza kuti ngati tilumikiza zida ziwirizi zigwira ntchito moyenera.

Kukhazikitsa ntchito

Sevisi ikufunika kugwira ntchito kuti iyambike ndikuyimitsa mwaulemu. (Kutha kuyimitsa ntchito ndikofunikira pakuyezetsa.) Palinso njira zingapo zotchulira ntchito yotere pamakonzedwe operekedwa (mwachitsanzo, titha kugwiritsa ntchito makalasi amtundu). Pa positi iyi tigwiritsanso ntchito Keke Pattern. Tikhoza kuyimira ntchito pogwiritsa ntchito cats.Resource zomwe zimapereka kale mabatani ndi kumasulidwa kwazinthu. Kuti tipeze gwero tiyenera kupereka kasinthidwe ndi nthawi yothamanga. Chifukwa chake ntchito yoyambira ntchito ikhoza kuwoneka ngati:

  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 wamasinthidwe omwe amafunikira ndi woyambitsa ntchitoyu
  • AddressResolver - chinthu chothamanga chomwe chimatha kupeza maadiresi enieni a node zina (pitirizani kuwerenga zambiri).

mitundu ina imachokera cats:

  • F[_] - mtundu wa zotsatira (M'njira yosavuta F[A] zikhoza kukhala zolungama () => A. Mu positi iyi tigwiritsa ntchito cats.IO.)
  • Reader[A,B] - ndi mawu ofanana ndi ntchito A => B
  • cats.Resource - ali ndi njira zopezera ndi kumasula
  • Timer - amalola kugona / kuyeza nthawi
  • ContextShift -analogue ya ExecutionContext
  • Applicative - chopukutira ntchito (pafupifupi monad) (titha kusintha ndi china chake)

Pogwiritsa ntchito mawonekedwewa tikhoza 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](()))
  }

(Onani Chikho chachinsinsi pakukhazikitsa ntchito zina - utumiki wa echo,
echo kasitomala ndi olamulira moyo wonse.)

Node ndi chinthu chimodzi chomwe chimagwira ntchito zingapo (kuyambitsa zinthu zambiri kumathandizidwa ndi Cake Pattern):

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

Dziwani kuti mu node timafotokozera mtundu weniweni wa kasinthidwe komwe kumafunika ndi node iyi. Wopanga sangatilole kuti timange chinthucho (Keke) ndi mtundu wosakwanira, chifukwa mawonekedwe aliwonse amawonetsa cholepheretsa Config mtundu. Komanso sitingathe kuyambitsa node popanda kupereka masinthidwe athunthu.

Kusintha kwa adilesi ya node

Kuti tikhazikitse kugwirizana timafunikira adiresi yeniyeni yeniyeni pa node iliyonse. Itha kudziwika mochedwa kuposa magawo ena a kasinthidwe. Chifukwa chake, tikufuna njira yoperekera mapu pakati pa node id ndi adilesi yake. Mapu awa ndi ntchito:

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

Pali njira zingapo zogwiritsira ntchito ntchitoyi.

  1. Ngati tidziwa maadiresi enieni tisanatumizidwe, panthawi yogwiritsira ntchito ma node, ndiye kuti tikhoza kupanga code ya Scala ndi maadiresi enieni ndikuyendetsa zomanga pambuyo pake (zomwe zimapanga kufufuza nthawi ndikuyendetsa mayeso ophatikizana). Pamenepa ntchito yathu yojambula mapu imadziwika mokhazikika ndipo imatha kusinthidwa kukhala chinthu chonga a Map[NodeId, NodeAddress].
  2. Nthawi zina timapeza maadiresi enieni pakapita nthawi pamene mfundo zayambika, kapena tilibe ma adilesi omwe sanayambitsidwebe. Apa titha kukhala ndi ntchito yotulukira yomwe imayambika ma node ena onse asanakhalepo ndipo node iliyonse imatha kulengeza ma adilesi ake muutumikiwo ndikulembetsa ku zodalira.
  3. Ngati tingathe kusintha /etc/hosts, titha kugwiritsa ntchito mayina omwe adafotokozedwa kale (monga my-project-main-node ndi echo-backend) ndikuphatikiza dzinali ndi adilesi ya ip panthawi yotumiza.

Mu positi iyi sitikufotokoza zambiri za milanduyi. M'malo mwake muzoseweretsa wathu ma node onse adzakhala ndi adilesi yomweyo ya IP - 127.0.0.1.

Mu positi iyi tiwona magawo awiri a dongosolo logawidwa:

  1. Mapangidwe a node amodzi, pomwe mautumiki onse amayikidwa pa node imodzi.
  2. Mapangidwe awiri a node, komwe ntchito ndi kasitomala zili pamagulu osiyanasiyana.

Kukonzekera kwa a node imodzi masanjidwe ali motere:

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

Apa tikupanga kasinthidwe kamodzi komwe kumakulitsa kasinthidwe ka seva ndi kasitomala. Komanso timakonza chowongolera chamoyo chomwe chimathetsa kasitomala ndi seva pambuyo pake lifetime pakapita nthawi.

Mipangidwe yofanana ya ntchito ndi masinthidwe angagwiritsidwe ntchito kupanga masanjidwe adongosolo ndi ma node awiri osiyana. Timangofunika kulenga configs awiri osiyana node ndi ntchito zoyenera:

Awiri nodes kasinthidwe

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

Onani momwe timafotokozera kudalira. Timatchula ntchito zina zoperekedwa ndi node ngati kudalira komwe kulipo. Mtundu wodalira umafufuzidwa chifukwa uli ndi mtundu wa phantom womwe umalongosola protocol. Ndipo panthawi yothamanga tidzakhala ndi id yolondola ya node. Ichi ndi chimodzi mwazinthu zofunika kwambiri pakukonza koyenera. Zimatipatsa kuthekera kokhazikitsa doko kamodzi kokha ndikuwonetsetsa kuti tikulozera doko lolondola.

Kukhazikitsa node ziwiri

Kukonzekera uku timagwiritsa ntchito machitidwe omwewo. Palibe zosintha. Komabe, timapanga mitundu iwiri yosiyana ya node yomwe imakhala ndi 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 ndipo ikufunika gawo lina la config. Ma node onsewa amafunikira tsatanetsatane wa moyo wonse. Pazolinga za positi iyi node idzakhala ndi moyo wopanda malire womwe utha kuthetsedwa pogwiritsa ntchito SIGTERM, pomwe kasitomala wa echo adzayimitsa pakatha nthawi yokhazikika. Onani pulogalamu yoyambira mwatsatanetsatane.

Njira yachitukuko chonse

Tiyeni tiwone momwe njirayi imasinthira momwe timagwirira ntchito ndi kasinthidwe.

Kukonzekera ngati code kudzapangidwa ndikupanga chojambula. Zikuoneka kuti n'zomveka kulekanitsa zokhazikitsidwa ndi ma code ena. Nthawi zambiri timatha kukhala ndi masinthidwe ambiri pama code omwewo. Ndipo zowonadi, titha kukhala ndi mitundu ingapo ya nthambi zosinthira zosiyanasiyana. Mu kasinthidwe titha kusankha mitundu ina ya malaibulale ndipo izi zikhalabe nthawi zonse tikamayika kasinthidwe.

Kusintha kwa kasinthidwe kumakhala kusintha kwa code. Chifukwa chake, ziyenera kutsatiridwa ndi njira yotsimikizika yofananira:

Tikiti -> PR -> ndemanga -> kuphatikiza -> kuphatikiza mosalekeza -> kutumizidwa mosalekeza

Pali zotsatira zotsatirazi za njira:

  1. Kukonzekera kumayenderana ndi zochitika zamakina ena. Zikuwoneka kuti palibe njira yolumikizirana yolakwika pakati pa node.
  2. Sikophweka kusintha kasinthidwe mu mfundo imodzi yokha. Zikuwoneka kuti sizomveka kulowa ndikusintha mafayilo amawu. Kotero kasinthidwe kachitidwe kumakhala kocheperako.
  3. Zosintha zazing'ono zosintha sizovuta kupanga.
  4. Zosintha zambiri zamasinthidwe zidzatsata njira yofananira yachitukuko, ndipo zidzapereka ndemanga.

Kodi tikufuna malo osiyana kuti tikonze zopanga? Zokonda kupanga zitha kukhala ndi zidziwitso zodziwikiratu zomwe tikufuna kuti anthu ambiri asakumane nazo. Chifukwa chake kungakhale koyenera kusunga malo osiyana omwe ali ndi malire omwe angakhale ndi kasinthidwe kapangidwe. Titha kugawa kasinthidwe m'magawo awiri - imodzi yomwe ili ndi magawo otseguka kwambiri opangira komanso yomwe ili ndi gawo lachinsinsi la kasinthidwe. Izi zipangitsa mwayi wofikira kwa omanga ambiri ku magawo ambiri kwinaku akuletsa mwayi wopeza zinthu zovuta kwambiri. Ndikosavuta kuchita izi pogwiritsa ntchito zikhalidwe zapakatikati zokhala ndi magawo osasinthika.

Kusiyanasiyana

Tiyeni tiwone zabwino ndi zoyipa za njira yomwe ikufunsidwa poyerekeza ndi njira zina zoyendetsera kasinthidwe.

Choyamba, tilemba njira zingapo kuzinthu zosiyanasiyana za njira yomwe ikufunsidwa yochitira ndi kasinthidwe:

  1. Lembani fayilo pamakina omwe mukufuna.
  2. Centralized key-value yosungirako (monga etcd/zookeeper).
  3. Zigawo za subprocess zomwe zitha kukonzedwanso / kuyambiranso popanda kuyambiranso.
  4. Kukonzekera kunja kwa zinthu zakale ndi kuwongolera mtundu.

Fayilo yamalemba imapereka kusinthika kwina malinga ndi zosintha za ad-hoc. Woyang'anira dongosolo atha kulowa mu node yomwe mukufuna, kusintha ndikungoyambitsanso ntchitoyo. Izi sizingakhale zabwino kwa machitidwe akuluakulu. Palibe zotsalira zomwe zasiyidwa pambuyo pakusintha. Kusintha sikuwunikiridwanso ndi maso ena. Zingakhale zovuta kudziwa chomwe chapangitsa kusinthaku. Sizinayesedwe. Kuchokera pamawonekedwe a dongosolo logawidwa, woyang'anira akhoza kungoiwala kusintha kasinthidwe mu imodzi mwa mfundo zina.

(Btw, ngati pamapeto pake padzakhala kufunika koyamba kugwiritsa ntchito mafayilo osinthira malemba, tidzangowonjezera parser + validator yomwe ingathe kupanga zomwezo. Config type ndipo zingakhale zokwanira kuyamba kugwiritsa ntchito ma configs. Izi zikuwonetsanso kuti zovuta zamasinthidwe a nthawi yophatikizira ndizocheperako pang'ono kuti zovuta za ma configs ozikidwa palemba, chifukwa pamawu omasulira timafunikira ma code ena.)

Kusungidwa kwamtengo wapatali wapakati ndi njira yabwino yogawa magawo a meta. Apa tikuyenera kuganizira zomwe timaziona ngati zosintha komanso zomwe ndi data chabe. Kupatsidwa ntchito C => A => B nthawi zambiri timatcha zikhalidwe zomwe sizisintha kawirikawiri C "kusintha", pomwe data imasinthidwa pafupipafupi A - ingolowetsani deta. Kukonzekera kuyenera kuperekedwa ku ntchitoyi kale kuposa deta A. Chifukwa cha lingaliro ili titha kunena kuti zimayembekezereka kusintha komwe kungagwiritsidwe ntchito kusiyanitsa zosintha ndi data yokha. Komanso deta nthawi zambiri imachokera ku gwero limodzi (wosuta) ndipo kasinthidwe amachokera ku gwero lina (admin). Kuchita ndi magawo omwe angasinthidwe pambuyo poyambitsa kumayambitsa kuwonjezereka kwa zovuta zogwiritsira ntchito. Pazigawo zotere tidzayenera kuthana ndi njira yawo yobweretsera, kugawa ndi kutsimikizira, kuthana ndi zolakwika. Chifukwa chake, kuti tichepetse zovuta zamapulogalamu, kuli bwino tichepetse kuchuluka kwa magawo omwe angasinthe panthawi yothamanga (kapena kuwachotseratu).

Kuchokera pamalingaliro a positi iyi tiyenera kupanga kusiyana pakati pa magawo osasunthika ndi osinthika. Ngati ndondomeko ya utumiki ikufuna kusintha kosowa kwa magawo ena panthawi yothamanga, tikhoza kuwatcha ma parameters osinthika. Kupanda kutero amakhala osasunthika ndipo amatha kukhazikitsidwa pogwiritsa ntchito njira yomwe akufunira. Pakukonzanso kosinthika njira zina zitha kufunikira. Mwachitsanzo, magawo a dongosololi akhoza kuyambiranso ndi magawo atsopano a kasinthidwe mofananamo kuti ayambitsenso njira zosiyana za dongosolo logawidwa.
(Lingaliro langa lodzichepetsa ndikupewa kukonzanso nthawi yothamanga chifukwa kumawonjezera zovuta zamakina.
Zitha kukhala zowongoka kwambiri kungodalira chithandizo cha OS pakuyambiranso njira. Komabe, sizingakhale zotheka nthawi zonse.)

Mbali imodzi yofunikira pakugwiritsa ntchito kasinthidwe kokhazikika komwe nthawi zina kumapangitsa anthu kuganiza zosintha (popanda zifukwa zina) ndi kutha kwa ntchito panthawi yosinthira. Zowonadi, ngati tikuyenera kusintha masinthidwe okhazikika, tiyenera kuyambitsanso dongosolo kuti zikhalidwe zatsopano zikhale zogwira mtima. Zofunikira pakuchepetsa nthawi zimasiyanasiyana pamakina osiyanasiyana, chifukwa chake sizingakhale zovuta. Ngati ndizovuta, ndiye kuti tiyenera kukonzekera pasadakhale kuti tiyambitsenso dongosolo lililonse. Mwachitsanzo, tikhoza kukhazikitsa AWS ELB kugwirizana kukhetsa. Muzochitika izi nthawi zonse tikafunika kuyambiranso dongosolo, timayambanso njira yatsopano yofanana, kenaka sinthani ELB kwa iyo, ndikulola dongosolo lakale kuti limalize kutumizira maulumikizidwe omwe alipo.

Nanga bwanji kusunga kasinthidwe mkati mwazojambula zosinthidwa kapena zakunja? Kusunga kasinthidwe mkati mwa chinthu chopangidwa kumatanthauza nthawi zambiri kuti kasinthidwe kameneka kamadutsa njira yotsimikizira zamtundu wofanana ndi zina. Chifukwa chake wina akhoza kukhala wotsimikiza kuti kasinthidwe ndi kabwino komanso kodalirika. M'malo mwake kasinthidwe mu fayilo yosiyana kumatanthauza kuti palibe zowonetsa za ndani komanso chifukwa chiyani adasintha fayiloyo. Kodi izi ndizofunikira? Timakhulupilira kuti pamakina ambiri opanga ndi bwino kukhala okhazikika komanso apamwamba kwambiri.

Mtundu wa chinthucho umalola kudziwa nthawi yomwe idapangidwa, zomwe zili ndi mfundo zake, ndi zinthu ziti zomwe zimayatsidwa / kuzimitsa, yemwe anali ndi udindo wopanga kusintha kulikonse. Zingafunike kuyesetsa kuti musunge zosinthika mkati mwazojambula ndipo ndi kusankha koyenera kupanga.

Ubwino & kuipa

Apa tikufuna tiwunikire zabwino zina ndikukambirana zovuta zina za njira yomwe akufunsidwa.

ubwino

Mawonekedwe a kasinthidwe kophatikizana kwa dongosolo lonse logawidwa:

  1. Kuwunika kokhazikika kwa kasinthidwe. Izi zimapereka chidaliro chachikulu, kuti kasinthidwe ndi kolondola kupatsidwa zovuta zamtundu.
  2. Chilankhulo chochulukira cha kasinthidwe. Nthawi zambiri masinthidwe njira zina zimangokhala pazosintha zambiri.
    Kugwiritsa ntchito Scala munthu amatha kugwiritsa ntchito zilankhulo zingapo kuti masinthidwe ake akhale abwino. Mwachitsanzo, titha kugwiritsa ntchito mikhalidwe kuti tipereke zikhalidwe zosasinthika, zinthu zomwe zingakhazikike mosiyanasiyana, zomwe tingatchule vals amatanthauzidwa kamodzi kokha mu mawonekedwe akunja (DRY). Ndikotheka kugwiritsa ntchito kutsata kwenikweni, kapena zochitika zamagulu ena (Seq, Map, Ndi zina zotero).
  3. DSL. Scala ili ndi chithandizo chabwino kwa olemba a DSL. Mmodzi angagwiritse ntchito zinthuzi kuti akhazikitse chinenero chokonzekera chomwe chiri chosavuta komanso chosavuta kugwiritsa ntchito, kotero kuti kasinthidwe komaliza ndi kowerengeka ndi ogwiritsa ntchito.
  4. Umphumphu ndi kugwirizana pa mfundo zonse. Ubwino umodzi wokhala ndi kasinthidwe kadongosolo lonse logawidwa pamalo amodzi ndikuti zikhalidwe zonse zimafotokozedwa kamodzi ndiyeno zimagwiritsidwanso ntchito m'malo onse omwe timazifuna. Komanso lembani zidziwitso zotetezeka zamadoko ziwonetsetse kuti pamasinthidwe onse olondola ma node amalankhula chilankhulo chimodzi. Pali kudalira pakati pa ma node zomwe zimapangitsa kuti zikhale zovuta kuiwala kupereka ntchito zina.
  5. Kusintha kwapamwamba kwambiri. Njira yonse yosinthira masinthidwe kudzera munjira yanthawi zonse ya PR imakhazikitsa miyezo yapamwamba komanso pamasinthidwe.
  6. Zosintha nthawi imodzi. Nthawi zonse tikasintha kusintha kokhazikika kumatsimikizira kuti ma node onse akusinthidwa.
  7. Kugwiritsa ntchito mosavuta. Pulogalamuyi sikufunika kusanthula ndikutsimikizira masinthidwe ndikusintha masinthidwe olakwika. Izi zimathandizira ntchito yonse. (Kuwonjezeka kwina kwazovuta kuli mu kasinthidwe komweko, koma ndikugulitsa mozindikira kuchitetezo.) Ndizowongoka bwino kubwerera ku kasinthidwe wamba - ingowonjezerani zidutswa zomwe zikusowa. Ndikosavuta kuti muyambe ndi masinthidwe ophatikizidwa ndikuchedwetsa kukhazikitsidwa kwa zidutswa zina mpaka nthawi zina zamtsogolo.
  8. Kusintha kosinthidwa. Chifukwa chosintha masinthidwe amatsata njira yofananira yachitukuko, chifukwa chake timapeza chopangidwa ndi mtundu wapadera. Zimatilola kusinthanso kasinthidwe ngati pakufunika. Titha kuyikanso masinthidwe omwe adagwiritsidwa ntchito chaka chapitacho ndipo agwira ntchito chimodzimodzi. Kukonzekera kokhazikika kumawongolera kulosera komanso kudalirika kwa dongosolo logawidwa. Kukonzekera kumakhazikitsidwa pa nthawi yosonkhanitsa ndipo sikungasokonezedwe mosavuta pa dongosolo lopangira.
  9. Modularity. Ma module omwe akufunsidwawo ndi a modular ndipo ma module amatha kuphatikizidwa m'njira zosiyanasiyana
    kuthandizira masanjidwe osiyanasiyana (makhazikitsidwe / masanjidwe). Makamaka, ndizotheka kukhala ndi masinthidwe ang'onoang'ono a node imodzi komanso makonzedwe akulu amitundu yambiri. Ndizomveka kukhala ndi masanjidwe angapo opanga.
  10. Kuyesa. Pazifukwa zoyesera munthu atha kugwiritsa ntchito ntchito yachipongwe ndikuigwiritsa ntchito ngati kudalira m'njira yotetezeka. Mapangidwe angapo oyesera okhala ndi magawo osiyanasiyana osinthidwa ndi zoseketsa akhoza kusungidwa nthawi imodzi.
  11. Kuyesa kwa kuphatikiza. Nthawi zina m'makina ogawidwa ndizovuta kuyendetsa mayeso ophatikiza. Pogwiritsa ntchito njira yomwe tafotokozayi kuti tiyike kasinthidwe kotetezeka kwa dongosolo lonse logawidwa, tikhoza kuyendetsa magawo onse ogawidwa pa seva imodzi m'njira yowongoka. N’zosavuta kutengera mmene zinthu zilili
    pamene imodzi mwa mautumikiwa sakupezeka.

kuipa

Kukonzekera kophatikizidwa ndi kosiyana ndi kasinthidwe "kwanthawi zonse" ndipo sikungagwirizane ndi zosowa zonse. Nazi zina mwazovuta za config yophatikizidwa:

  1. Kusintha kokhazikika. Itha kukhala yosayenera pamapulogalamu onse. Nthawi zina pamafunika kukonza mwachangu kasinthidwe mukupanga ndikudutsa njira zonse zotetezera. Njirayi imapangitsa kuti zikhale zovuta. Kuphatikizika ndi kutumizidwanso kumafunika pambuyo popanga kusintha kulikonse. Izi ndi mbali zonse ndi katundu.
  2. Kupanga kasinthidwe. Zosintha zikapangidwa ndi chida china chodzipangira njira iyi imafunikira kuphatikiza kotsatira (komwe kungalephereke). Zingafunike kuyesetsa kowonjezera kuti muphatikize gawo lowonjezerali mu dongosolo lomanga.
  3. Zida. Pali zida zambiri zomwe zikugwiritsidwa ntchito masiku ano zomwe zimadalira ma configs-based configs. Ena a iwo
    sichidzagwiritsidwa ntchito pamene kasinthidwe apangidwa.
  4. Kusintha kwa malingaliro ndikofunikira. Madivelopa ndi DevOps amadziwa bwino mafayilo amawu. Lingaliro lakupanga kasinthidwe limatha kuwoneka lachilendo kwa iwo.
  5. Musanakhazikitse kasinthidwe kophatikizana, ndikofunikira kupanga pulogalamu yapamwamba kwambiri.

Pali zoletsa zina zachitsanzo chomwe chakhazikitsidwa:

  1. Ngati tipereka masinthidwe owonjezera omwe sakufunidwa ndi kukhazikitsa ma node, compiler sidzatithandiza kuzindikira kukhazikitsidwa komwe kulibe. Izi zitha kuthetsedwa pogwiritsa ntchito HList kapena ma ADT (makasitomala) akusintha ma node m'malo mwa mawonekedwe ndi Keke Pattern.
  2. Tiyenera kupereka boilerplate mu fayilo ya config: (package, import, object zolengeza;
    override def's za magawo omwe ali ndi makonda osasintha). Izi zitha kuthetsedwa pang'ono pogwiritsa ntchito DSL.
  3. Mu positi iyi sitikuphimba kukonzanso kwamagulu amagulu ofanana.

Kutsiliza

Mu positi iyi takambirana za lingaliro lakuyimira kasinthidwe mwachindunji mu code source munjira yotetezeka. Njirayi itha kugwiritsidwa ntchito m'mapulogalamu ambiri ngati choloweza m'malo mwa xml- ndi masinthidwe ena otengera malemba. Ngakhale kuti chitsanzo chathu chakhazikitsidwa ku Scala, chitha kumasuliridwanso kuzilankhulo zina zomwe zingaphatikizidwe (monga Kotlin, C #, Swift, etc.). Wina atha kuyesa njirayi mu pulojekiti yatsopano ndipo, ngati siyikugwirizana bwino, sinthani ku njira yakale.

Zachidziwikire, kasinthidwe kophatikizana kumafuna njira yachitukuko chapamwamba. M'malo mwake, imalonjeza kuti ipereka kasinthidwe kolimba kwambiri.

Njira iyi ikhoza kuwonjezeredwa m'njira zosiyanasiyana:

  1. Wina atha kugwiritsa ntchito ma macros kuti atsimikizire kasinthidwe ndikulephera panthawi yophatikiza ngati vuto lililonse lazamalonda litalephera.
  2. DSL ikhoza kukhazikitsidwa kuyimira kasinthidwe m'njira yosavuta kugwiritsa ntchito domain.
  3. Dynamic resource management yokhala ndi zosintha zokha. Mwachitsanzo, tikasintha kuchuluka kwa ma cluster node omwe tingafune (1) ma node kuti tipeze masinthidwe osinthidwa pang'ono; (2) Cluster manejala kuti alandire zatsopano za node.

zikomo

Ndikufuna kunena zikomo kwa Andrey Saksonov, Pavel Popov, Anton Nehaev popereka ndemanga zolimbikitsa pazolemba za positiyi zomwe zandithandiza kuti zimveke bwino.

Source: www.habr.com