ʻO ka hoʻonohonoho hoʻonohonoho hoʻolaha ʻia

Makemake wau e haʻi iā ʻoe i kahi ʻano hana hoihoi no ka hana ʻana me ka hoʻonohonoho ʻana o kahi ʻōnaehana puʻupuʻu. Hōʻike pololei ʻia ka hoʻonohonoho ʻana ma kahi ʻōlelo i hōʻuluʻulu ʻia (Scala) me ka hoʻohana ʻana i nā ʻano palekana. Hāʻawi kēia pou i kahi hiʻohiʻona o ia ʻano hoʻonohonoho a kūkākūkā i nā ʻano like ʻole o ka hoʻokō ʻana i kahi hoʻonohonoho i hui ʻia i loko o ke kaʻina hana hoʻomohala holoʻokoʻa.

ʻO ka hoʻonohonoho hoʻonohonoho hoʻolaha ʻia

(Pelekania)

Hōʻike

ʻO ke kūkulu ʻana i kahi ʻōnaehana puʻupuʻu hilinaʻi ʻo ia ka hoʻohana ʻana o nā nodes a pau i ka hoʻonohonoho kūpono, i hui pū ʻia me nā nodes ʻē aʻe. Hoʻohana pinepine ʻia nā ʻenehana DevOps (terraform, ansible a i ʻole kekahi mea e like me ia) e hana maʻalahi i nā faila hoʻonohonoho (pinepine kikoʻī no kēlā me kēia node). Makemake mākou e hōʻoia i ka hoʻohana ʻana o nā node kamaʻilio i nā protocol like (me ka mana like). A i ʻole, e kūkulu ʻia ka launa ʻole i loko o kā mākou ʻōnaehana puʻunaue. Ma ka honua JVM, hoʻokahi hopena o kēia koi ʻo ia ka mana like o ka waihona i loaʻa nā memo protocol pono e hoʻohana i nā wahi āpau.

Pehea e pili ana i ka hoʻāʻo ʻana i kahi ʻōnaehana puʻunaue? ʻOiaʻiʻo, manaʻo mākou aia nā ʻāpana āpau i nā hoʻokolohua ʻāpana ma mua o ka neʻe ʻana i ka hoʻāʻo hoʻohui. (I mea e hiki ai iā mākou ke hoʻonui i nā hopena hōʻike i ka wā holo, pono mākou e hāʻawi i kahi pūʻulu like o nā hale waihona puke ma ke kahua hoʻāʻo a i ka wā holo.)

I ka hana ʻana me nā hoʻāʻo hoʻohui, ʻoi aku ka maʻalahi o ka hoʻohana ʻana i ke ala papa like ma nā wahi āpau ma nā node āpau. ʻO nā mea a mākou e hana ai, ʻo ka hōʻoia ʻana e hoʻohana ʻia ka classpath like i ka wā holo. (ʻOiai hiki loa ke holo i nā node ʻokoʻa me nā papa papa like ʻole, hoʻohui kēia i ka paʻakikī i ka hoʻonohonoho holoʻokoʻa a me nā pilikia me ka hoʻonohonoho ʻana a me nā hoʻāʻo hoʻohui.) No nā kumu o kēia pou, ke manaʻo nei mākou e hoʻohana nā nodes a pau i ke ala papa like.

Hoʻololi ka hoʻonohonoho me ka noi. Hoʻohana mākou i nā mana e ʻike i nā pae like ʻole o ka ulu ʻana o ka papahana. He mea kūpono ke ʻike i nā mana like ʻole o nā hoʻonohonoho. A kau i ka hoʻonohonoho ponoʻī i loko o ka ʻōnaehana mana mana. Inā hoʻokahi wale nō hoʻonohonoho i ka hana ʻana, a laila hiki iā mākou ke hoʻohana i ka helu mana. Inā mākou e hoʻohana i nā manawa hana he nui, a laila pono mākou i kekahi
nā lālā hoʻonohonoho a me kahi lepili hou i ka hoʻohui ʻana i ka mana (no ka laʻana, ka inoa o ka lālā). Ma kēia ala hiki iā mākou ke ʻike maopopo i ka hoʻonohonoho pololei. Hoʻohālikelike ʻia kēlā me kēia mea hoʻonohonoho hoʻonohonoho i kahi hui pū ʻana o nā nodes i puʻunaue ʻia, nā awa, nā kumuwaiwai waho, a me nā mana waihona. No nā kumu o kēia pou e manaʻo mākou he hoʻokahi wale nō lālā a hiki iā mākou ke ʻike i ka hoʻonohonoho ma ke ʻano maʻamau me ka hoʻohana ʻana i ʻekolu mau helu i hoʻokaʻawale ʻia e kahi kiko (1.2.3).

I nā kaiapuni hou, ʻaʻole hana lima ʻia nā faila hoʻonohonoho. Hoʻonui pinepine ʻia lākou i ka wā o ka waiho ʻana a ʻaʻole hoʻopā hou ʻia (no laila mai uhai i kekahi mea). He nīnau kūlohelohe: no ke aha mākou e hoʻohana mau ai i ka ʻano kikokikona e mālama i ka hoʻonohonoho? ʻO kahi koho kūpono e like me ka hiki ke hoʻohana i ka code maʻamau no ka hoʻonohonoho ʻana a me ka pōmaikaʻi mai nā loiloi-manawa hōʻuluʻulu.

Ma kēia pou e ʻimi mākou i ka manaʻo o ka hōʻike ʻana i kahi hoʻonohonoho i loko o kahi artifact i hui ʻia.

Hoʻonohonoho hoʻonohonoho ʻia

Hāʻawi kēia ʻāpana i kahi laʻana o kahi hoʻonohonoho static compiled. Hoʻokō ʻia ʻelua mau lawelawe maʻalahi - ka lawelawe echo a me ka mea lawelawe lawelawe echo. Ma muli o kēia mau lawelawe ʻelua, ua ʻākoakoa ʻia nā koho ʻōnaehana ʻelua. Ma kahi koho, aia nā lawelawe ʻelua ma ka node hoʻokahi, ma kahi koho ʻē aʻe - ma nā node like ʻole.

ʻO ka maʻamau, aia kekahi ʻōnaehana puʻunaue i kekahi mau nodes. Hiki iā ʻoe ke ʻike i nā nodes me ka hoʻohana ʻana i nā waiwai o kekahi ʻano NodeId:

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

ai ole ia,

case class NodeId(hostName: String)

aiʻole

object Singleton
type NodeId = Singleton.type

Hana nā Nodes i nā hana like ʻole, holo lākou i nā lawelawe a hiki ke hoʻokumu ʻia nā pilina TCP/HTTP ma waena o lākou.

No ka wehewehe ʻana i kahi pilina TCP pono mākou i kahi helu port. Makemake mākou e noʻonoʻo i ka protocol i kākoʻo ʻia ma kēlā awa e hōʻoia i ka hoʻohana ʻana o ka mea kūʻai aku a me ke kikowaena i ka protocol like. E wehewehe mākou i ka pilina me ka hoʻohana ʻana i kēia papa:

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

kahi Port - he helu helu wale Int e hōʻike ana i ka laulā o nā waiwai kūpono:

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

ʻAno hoʻomaʻemaʻe

See hale waihona puke hoʻopauʻia и maiʻu ka loio. I ka pōkole, ʻae ka waihona iā ʻoe e hoʻohui i nā kaohi i nā ʻano i nānā ʻia i ka manawa hōʻuluʻulu. I kēia hihia, ʻo nā helu helu port kūpono he 16-bit integers. No ka hoʻonohonoho hoʻonohonoho ʻana, ʻaʻole koi ʻia ka hoʻohana ʻana i ka waihona i hoʻomaʻemaʻe ʻia, akā hoʻomaikaʻi ia i ka hiki o ka mea hoʻopili ke nānā i ka hoʻonohonoho.

No nā protocol HTTP (REST), me ka helu port, pono paha mākou i ke ala i ka lawelawe:

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

Nā ʻano Phantom

No ka ʻike ʻana i ka protocol i ka manawa hōʻuluʻulu, hoʻohana mākou i kahi ʻano ʻano i hoʻohana ʻole ʻia i loko o ka papa. ʻO kēia hoʻoholo ma muli o ka ʻoiaʻiʻo ʻaʻole mākou e hoʻohana i kahi hiʻohiʻona protocol i ka wā holo, akā makemake mākou i ka compiler e nānā i ka hoʻohālikelike protocol. Ma ka wehewehe ʻana i ka protocol, ʻaʻole hiki iā mākou ke hāʻawi i kahi lawelawe kūpono ʻole ma ke ʻano he hilinaʻi.

ʻO kekahi o nā protocol maʻamau ka REST API me Json serialization:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

kahi RequestMessage - ʻano noi, ResponseMessage - ʻano pane.
ʻOiaʻiʻo, hiki iā mākou ke hoʻohana i nā wehewehe protocol ʻē aʻe e hāʻawi i ka pololei o ka wehewehe a mākou e koi ai.

No nā kumu o kēia pou, e hoʻohana mākou i kahi mana maʻalahi o ka protocol:

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

Eia ka noi he kaula i hoʻopili ʻia i ka url a ʻo ka pane ʻo ke kaula i hoʻihoʻi ʻia i loko o ke kino o ka pane HTTP.

Hōʻike ʻia ka hoʻonohonoho lawelawe e ka inoa lawelawe, nā awa, a me nā hilinaʻi. Hiki ke hōʻike ʻia kēia mau mea ma Scala ma nā ʻano he nui (e laʻa, HList-s, nā ʻano ʻikepili algebraic). No nā kumu o kēia pou, e hoʻohana mākou i ka Cake Pattern a hōʻike i nā modula e hoʻohana ana trait'ov. (ʻAʻole pono ka Cake Pattern i kēia ʻano.

Hiki ke hōʻike ʻia nā hilinaʻi ma waena o nā lawelawe e like me nā ala e hoʻihoʻi ai i nā awa EndPointnā node ʻē aʻe:

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

No ka hana ʻana i kahi lawelawe echo, ʻo nā mea āu e pono ai he helu port a me kahi hōʻailona e kākoʻo ana ke awa i ka protocol echo. ʻAʻole hiki iā mākou ke kuhikuhi i kahi awa kikoʻī, no ka mea... ʻAe nā hiʻohiʻona iā ʻoe e haʻi i nā ʻano me ka ʻole o ka hoʻokō ʻana (nā kumu abstract). I kēia hihia, i ka wā e hana ai i kahi hoʻonohonoho paʻa, e koi ka mea hōʻuluʻulu iā mākou e hāʻawi i kahi hoʻokō o ke ʻano abstract a hāʻawi i kahi helu port. No ka mea ua hoʻokō mākou i ke ʻano, i ka wā e hana ai i kahi hoʻonohonoho kikoʻī, ʻaʻole hiki iā mākou ke kuhikuhi i kahi awa ʻē aʻe. E hoʻohana ʻia ka waiwai paʻamau.

Ma ka hoʻonohonoho o ka mea kūʻai aku ke haʻi aku nei mākou i kahi hilinaʻi i ka lawelawe echo:

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

He ʻano like ka hilinaʻi me ka lawelawe i lawe ʻia aku echoService. ʻO ka mea kūikawā, i ka mea kūʻai echo pono mākou i ka protocol like. No laila, i ka hoʻohui ʻana i nā lawelawe ʻelua, hiki iā mākou ke hōʻoia e holo pololei nā mea āpau.

Hoʻokō i nā lawelawe

Pono kahi hana e hoʻomaka a hoʻopau i ka lawelawe. (He mea koʻikoʻi ka hiki ke hoʻōki i ka lawelawe no ka hoʻāʻo ʻana.) Eia hou, nui nā koho no ka hoʻokō ʻana i ia hiʻohiʻona (no ka laʻana, hiki iā mākou ke hoʻohana i nā papa ʻano e pili ana i ke ʻano hoʻonohonoho). No nā kumu o kēia pou e hoʻohana mākou i ke ʻano Cake. E hōʻike mākou i ka lawelawe me ka hoʻohana ʻana i kahi papa cats.Resource, no ka mea Hāʻawi kēia papa i nā ala e hōʻoiaʻiʻo ai i ka hoʻokuʻu ʻana i nā kumuwaiwai inā pilikia. No ka loaʻa ʻana o kahi kumuwaiwai, pono mākou e hāʻawi i ka hoʻonohonoho ʻana a me kahi pōʻaiapili manawa holo mākaukau. Hiki ke nānā aku ka hana hoʻomaka lawelawe penei:

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

kahi

  • Config — ʻano hoʻonohonoho no kēia lawelawe
  • AddressResolver - kahi mea holo manawa e hiki ai iā ʻoe ke ʻike i nā helu wahi o nā node ʻē aʻe (e nānā i lalo)

a me nā ʻano ʻē aʻe mai ka waihona cats:

  • F[_] - ke ʻano o ka hopena (ma ka hihia maʻalahi F[A] hiki ke lilo i hana () => A. Ma kēia pou e hoʻohana mākou cats.IO.)
  • Reader[A,B] - ʻoi aku a liʻiliʻi paha me ka hana A => B
  • cats.Resource - he kumuwaiwai hiki ke loaʻa a hoʻokuʻu
  • Timer - ka manawa (ʻae iā ʻoe e hiamoe no kekahi manawa a ana i nā manawa manawa)
  • ContextShift - analog ExecutionContext
  • Applicative - kahi papa ʻano hopena e hiki ai iā ʻoe ke hoʻohui i nā hopena pilikino (kokoke i kahi monad). I nā noi paʻakikī ʻoi aku ka maikaʻi o ka hoʻohana ʻana Monad/ConcurrentEffect.

Ke hoʻohana nei i kēia pūlima hana hiki iā mākou ke hoʻokō i kekahi mau lawelawe. No ka laʻana, he lawelawe hana ʻole:

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

(Cm. kumuwaiwai, kahi e hoʻokō ʻia ai nā lawelawe ʻē aʻe - lawelawe echo, mea kūʻai echo
и nā mea mālama ola.)

ʻO kahi node kahi mea hiki ke hoʻomaka i nā lawelawe (ʻo ka hoʻomaka ʻana o kahi kaulahao waiwai e hōʻoia ʻia e ka Cake Pattern):

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

E ʻoluʻolu e hoʻomaopopo mākou i ke ʻano kikoʻī o ka hoʻonohonoho pono e pono ai no kēia node. Inā poina mākou e kuhikuhi i kekahi o nā ʻano hoʻonohonoho i koi ʻia e kahi lawelawe kūikawā, e loaʻa kahi hewa compilation. Eia kekahi, ʻaʻole hiki iā mākou ke hoʻomaka i kahi node ke ʻole mākou e hāʻawi i kekahi mea o ke ʻano kūpono me nā ʻikepili pono āpau.

Hoʻoholo inoa hoʻokipa

No ka hoʻopili ʻana i kahi host mamao, pono mākou i kahi helu IP maoli. Hiki paha ke ʻike ʻia ka helu wahi ma mua o ke koena o ka hoʻonohonoho. No laila pono mākou i kahi hana e palapala i ka node ID i kahi helu:

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

Nui nā ala e hoʻokō ai i kēia hana:

  1. Inā ʻike ʻia nā ʻōlelo iā mākou ma mua o ka hoʻolaha ʻana, hiki iā mākou ke hana i ka code Scala me
    a laila holo i ke kūkulu. E hōʻuluʻulu a holo kēia i nā hoʻokolohua.
    I kēia hihia, e ʻike ʻia ka hana i ka statically a hiki ke hōʻike ʻia ma ke code e like me ka palapala ʻāina Map[NodeId, NodeAddress].
  2. I kekahi mau hihia, ʻike ʻia ka helu maoli ma hope o ka hoʻomaka ʻana o ka node.
    I kēia hihia, hiki iā mākou ke hoʻokō i kahi "lawelawe ʻike" e holo ana ma mua o nā nodes ʻē aʻe a e hoʻopaʻa inoa nā nodes a pau me kēia lawelawe a noi i nā helu o nā nodes ʻē aʻe.
  3. Inā hiki iā mākou ke hoʻololi /etc/hosts, a laila hiki iā ʻoe ke hoʻohana i nā inoa inoa i koho mua ʻia (like my-project-main-node и echo-backend) a hoʻopili wale i kēia mau inoa
    me nā helu IP i ka wā o ka hoʻolaha ʻana.

Ma kēia pou ʻaʻole mākou e noʻonoʻo i kēia mau hihia i nā kikoʻī. No kā mākou
ma kahi laʻana mea pāʻani, e loaʻa i nā node a pau ka leka uila IP like - 127.0.0.1.

A laila, e noʻonoʻo mākou i ʻelua mau koho no kahi ʻōnaehana puʻupuʻu:

  1. Ke kau nei i nā lawelawe a pau ma kahi node.
  2. A me ka lawelawe ʻana i ka lawelawe echo a me ka mea kūʻai aku echo ma nā node like ʻole.

Hoʻonohonoho no hookahi node:

Hoʻonohonoho node hoʻokahi

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

Hoʻokō ka mea i ka hoʻonohonoho o ka mea kūʻai aku a me ke kikowaena. Hoʻohana ʻia kahi hoʻonohonoho manawa-i-ola no laila ma hope o ka wā lifetime hoʻopau i ka papahana. (Hoʻohana pū ʻo Ctrl-C a hoʻokuʻu pono i nā kumuwaiwai āpau.)

Hiki ke hoʻohana ʻia ka hoʻonohonoho like o ka hoʻonohonoho ʻana a me nā ʻano hoʻokō e hana i kahi ʻōnaehana i loaʻa ʻelua node ʻokoʻa:

ʻElua node hoʻonohonoho

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

Mea nui! E nānā i ka pili ʻana o nā lawelawe. Hōʻike mākou i kahi lawelawe i hoʻokō ʻia e kekahi node ma ke ʻano he hoʻokō ʻana i ke ʻano hilinaʻi o kekahi node. ʻIke ʻia ke ʻano hilinaʻi e ka mea hoʻopili, no ka mea aia ke ʻano protocol. Ke holo nei, e loaʻa i ka hilinaʻi ka ID node kūpono. Mahalo i kēia papahana, hōʻike mākou i ka helu awa i hoʻokahi manawa a ua hōʻoia mau ʻia e kuhikuhi i ke awa kūpono.

Ka hoʻokō ʻana i ʻelua node ʻōnaehana

No kēia hoʻonohonoho, hoʻohana mākou i nā lawelawe lawelawe like me ka ʻole o nā loli. ʻO ka ʻokoʻa wale nō ka loaʻa iā mākou ʻelua mau mea e hoʻokō i nā ʻano lawelawe like ʻole:

  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
  }

Hoʻokomo ka node mua i ke kikowaena a pono wale ka hoʻonohonoho kikowaena. Hoʻokomo ka node ʻelua i ka mea kūʻai aku a hoʻohana i kahi ʻāpana ʻē aʻe o ka hoʻonohonoho. Pono pū nā node ʻelua i ka hoʻokele ola. Holo mau ka node server a hiki i ka pau ʻana SIGTERM'om, a pau ka node o ka mea kūʻai aku ma hope o kekahi manawa. Cm. polokalamu hoʻolaha.

Kaʻina hana hoʻomohala maʻamau

E ʻike kākou pehea e pili ai kēia ʻano hoʻonohonoho hoʻonohonoho i ke kaʻina hana hoʻomohala holoʻokoʻa.

E hōʻuluʻulu ʻia ka hoʻonohonoho me ke koena o ke code a e hana ʻia kahi artifact (.jar). Me he mea lā he mea kūpono ke kau ʻana i ka hoʻonohonoho ʻana i loko o kahi artifact kaʻawale. ʻO kēia no ka mea hiki iā mākou ke loaʻa nā hoʻonohonoho he nui e pili ana i ka code like. Eia hou, hiki ke hana i nā artifact e pili ana i nā lālā hoʻonohonoho like ʻole. Mālama ʻia nā hilinaʻi i nā mana kikoʻī o nā hale waihona puke me ka hoʻonohonoho ʻana, a mālama ʻia kēia mau mana i nā manawa a pau a mākou e hoʻoholo ai e kau i kēlā mana o ka hoʻonohonoho.

Lilo kekahi hoʻololi hoʻonohonoho i hoʻololi code. A no laila, kēlā me kēia
e uhi ʻia ka hoʻololi e ke kaʻina hana hōʻoia maikaʻi maʻamau:

Ticket ma ka bug tracker -> PR -> loiloi -> hui me nā lālā pili ->
hoʻohui ʻia -> hoʻolaha

ʻO nā hopena nui o ka hoʻokō ʻana i kahi hoʻonohonoho i hui ʻia:

  1. E kūpaʻa ka hoʻonohonoho ʻana ma nā node a pau o ka ʻōnaehana puʻunaue. Ma muli o ka loaʻa ʻana o nā nodes a pau i ka hoʻonohonoho like ʻana mai kahi kumu hoʻokahi.

  2. He pilikia ka hoʻololi ʻana i ka hoʻonohonoho hoʻokahi wale nō o nā nodes. No laila, ʻaʻole hiki ke "configuration drift".

  3. ʻOi aku ka paʻakikī e hana i nā hoʻololi liʻiliʻi i ka hoʻonohonoho.

  4. ʻO ka hapa nui o nā hoʻololi hoʻonohonoho e hana ʻia ma ke ʻano o ke kaʻina hana hoʻomohala holoʻokoʻa a e nānā ʻia.

Makemake au i kahi waihona ʻokoʻa no ka mālama ʻana i ka hoʻonohonoho hana? Loaʻa paha i kēia hoʻonohonoho ʻana i nā ʻōlelo huna a me nā ʻike koʻikoʻi ʻē aʻe a mākou e makemake ai e kaohi i ke komo ʻana. Ma muli o kēia, ʻike ʻia ka mālama ʻana i ka hoʻonohonoho hope loa i kahi waihona ʻokoʻa. Hiki iā ʻoe ke hoʻokaʻawale i ka hoʻonohonoho ʻana i ʻelua ʻāpana—ʻo kekahi i loaʻa nā hoʻonohonoho hoʻonohonoho hiki i ka lehulehu a ʻo kekahi me nā hoʻonohonoho i kaupalena ʻia. E ʻae kēia i ka hapa nui o nā mea hoʻomohala e loaʻa i nā hoʻonohonoho maʻamau. He maʻalahi kēia kaʻawale ʻana me ka hoʻohana ʻana i nā ʻano waena i loaʻa nā waiwai paʻamau.

Hiki ke hoʻololi

E hoʻāʻo kākou e hoʻohālikelike i ka hoʻonohonoho hoʻonohonoho ʻia me kekahi mau mea maʻamau:

  1. Waihona kikokikona ma ka mīkini ʻimi.
  2. Hale kūʻai waiwai kī waena (etcd/zookeeper).
  3. Kaʻina hana i hiki ke hoʻonohonoho hou / hoʻomaka hou me ka hoʻomaka ʻole i ke kaʻina hana.
  4. Ka mālama ʻana i ka hoʻonohonoho ʻana ma waho o ka mana kiʻi a me ka mana mana.

Hāʻawi nā faila kikokikona i nā loli liʻiliʻi. Hiki i ka luna hoʻonohonoho ke komo i loko o ka node mamao, e hoʻololi i nā faila kūpono a hoʻomaka hou i ka lawelawe. No nā ʻōnaehana nui, akā naʻe, ʻaʻole makemake ʻia kēlā ʻano maʻalahi. ʻO nā hoʻololi i hana ʻia ʻaʻole waiho i nā meheu i nā ʻōnaehana ʻē aʻe. ʻAʻohe mea nānā i nā loli. He mea paʻakikī ke hoʻoholo i ka mea nāna i hoʻololi a no ke kumu. ʻAʻole hoʻāʻo ʻia nā hoʻololi. Inā puʻunaue ʻia ka ʻōnaehana, a laila poina paha ka luna hoʻomalu e hana i ka hoʻololi kūpono ma nā nodes ʻē aʻe.

(Pono e hoʻomaopopo ʻia ʻo ka hoʻohana ʻana i kahi hoʻonohonoho i hui ʻia ʻaʻole e pani i ka hiki ke hoʻohana i nā faila kikokikona i ka wā e hiki mai ana. Config, a hiki iā ʻoe ke hoʻohana i nā faila kikokikona. Ma hope koke iho, ʻoi aku ka liʻiliʻi o ka paʻakikī o kahi ʻōnaehana me kahi hoʻonohonoho i hui ʻia ma mua o ka paʻakikī o kahi ʻōnaehana e hoʻohana ana i nā faila kikokikona, no ka mea Pono nā waihona kikokikona i ke code hou.)

ʻO kahi hale kūʻai waiwai kī kikowaena he mīkini maikaʻi ia no ka puʻunaue ʻana i nā ʻāpana meta o kahi noi hoʻolaha. Pono mākou e hoʻoholo i nā ʻāpana hoʻonohonoho a me nā ʻikepili wale nō. E loaʻa iā mākou kahi hana C => A => B, a me nā palena C kakaʻikahi ka loli, a me ka ʻikepili A - pinepine. Ma kēia hihia hiki iā mākou ke ʻōlelo pēlā C - nā palena hoʻonohonoho, a A - ʻikepili. ʻIke ʻia he ʻokoʻa nā ʻāpana hoʻonohonoho mai ka ʻikepili no ka mea maʻamau ka loli pinepine ʻana ma mua o ka ʻikepili. Eia kekahi, hele mai ka ʻikepili mai kahi kumu (mai ka mea hoʻohana), a me nā ʻāpana hoʻonohonoho mai kahi ʻē aʻe (mai ka luna ʻōnaehana).

Inā ʻaʻole pono e hoʻololi i nā ʻāpana liʻiliʻi me ka ʻole o ka hoʻomaka hou ʻana i ka papahana, hiki i kēia ke alakaʻi pinepine i ka hoʻopiʻi o ka papahana, no ka mea, pono mākou e hāʻawi i nā ʻāpana, mālama, parse a nānā, a hana i nā waiwai hewa. No laila, mai ka manaʻo o ka hōʻemi ʻana i ka paʻakikī o ka papahana, kūpono ke hōʻemi i ka helu o nā ʻāpana i hiki ke hoʻololi i ka wā o ka hana o ka papahana (a i ʻole kākoʻo ʻole i kēlā mau ʻāpana).

No nā kumu o kēia pou, e hoʻokaʻawale mākou ma waena o nā ʻāpana static a me ka ikaika. Inā makemake ka loiloi o ka lawelawe i ka hoʻololi ʻana i nā ʻāpana i ka wā o ka hana ʻana o ka papahana, a laila e kapa mākou i kēlā mau ʻāpana dynamic. A i ʻole, paʻa nā koho a hiki ke hoʻonohonoho ʻia me ka hoʻohana ʻana i ka hoʻonohonoho hoʻonohonoho. No ka hoʻonohonoho hou ʻana, pono paha mākou i kahi mīkini e hoʻomaka hou i nā ʻāpana o ka papahana me nā ʻāpana hou, e like me ke ʻano o ka hoʻomaka ʻana o nā kaʻina hana. (I ko mākou manaʻo, ʻoi aku ka maikaʻi o ka pale ʻana i ka hoʻonohonoho hou ʻana i ka manawa maoli, no ka mea e hoʻonui kēia i ka paʻakikī o ka ʻōnaehana.

ʻO kahi ʻano koʻikoʻi o ka hoʻohana ʻana i ka hoʻonohonoho static e noʻonoʻo ai ka poʻe i ka hoʻonohonoho hou ʻana i ka ikaika ʻo ia ka manawa e hoʻomaka hou ai ka ʻōnaehana ma hope o kahi hoʻonohonoho hoʻonohonoho (downtime). I ka ʻoiaʻiʻo, inā pono mākou e hoʻololi i ka hoʻonohonoho static, pono mākou e hoʻomaka hou i ka ʻōnaehana no ka hoʻokō ʻana o nā waiwai hou. ʻOkoʻa ka pilikia o ka downtime no nā ʻōnaehana like ʻole. I kekahi mau hihia, hiki iā ʻoe ke hoʻonohonoho i kahi reboot i ka manawa i ka liʻiliʻi o ka ukana. Inā pono ʻoe e hoʻolako i ka lawelawe mau, hiki iā ʻoe ke hoʻokō ʻO ka hoʻokahe ʻana i ka pilina AWS ELB. I ka manawa like, i ka wā e pono ai mākou e hoʻomaka hou i ka ʻōnaehana, hoʻomaka mākou i kahi hiʻohiʻona like o kēia ʻōnaehana, hoʻololi i ka mea kaulike iā ia, a kali i ka pau ʻana o nā pilina kahiko. Ma hope o ka pau ʻana o nā pilina kahiko, pani mākou i ka mea kahiko o ka ʻōnaehana.

E noʻonoʻo kākou i ka pilikia o ka mālama ʻana i ka hoʻonohonoho i loko a i waho paha o ka artifact. Inā mākou e mālama i ka hoʻonohonoho i loko o kahi artifact, a laila ua loaʻa iā mākou ka manawa kūpono e hōʻoia i ka pololei o ka hoʻonohonoho ʻana i ka wā o ka hui ʻana o ka artifact. Inā ʻaʻole i waho ka hoʻonohonoho hoʻonohonoho, paʻakikī ke ʻimi i ka mea nāna i hoʻololi i kēia faila a me ke kumu. Pehea ka mea nui? I ko mākou manaʻo, no ka nui o nā ʻōnaehana hana he mea nui ka loaʻa ʻana o kahi hoʻonohonoho paʻa a kiʻekiʻe.

ʻO ka mana o kahi artifact hiki iā ʻoe ke hoʻoholo i ka wā i hana ʻia ai, he aha nā waiwai i loaʻa iā ia, he aha nā hana i hiki ke hoʻopau ʻia, a ʻo wai ke kuleana no kekahi hoʻololi i ka hoʻonohonoho. ʻOiaʻiʻo, ʻo ka mālama ʻana i ka hoʻonohonoho ʻana i loko o kahi artifact e koi ai i kahi hoʻoikaika, no laila pono ʻoe e hoʻoholo i ka ʻike.

ʻO ka hoʻopiʻi a me ka ʻohu

Makemake au e noʻonoʻo i nā mea maikaʻi a me nā mea ʻino o ka ʻenehana i manaʻo ʻia.

pono

Aia ma lalo kahi papa inoa o nā hiʻohiʻona nui o kahi hoʻonohonoho hoʻonohonoho pūnaehana i hoʻopili ʻia:

  1. Nānā hoʻonohonoho paʻa. ʻAe iā ʻoe e hōʻoia i kēlā
    pololei ka hoʻonohonoho.
  2. ʻŌlelo hoʻonohonoho waiwai. ʻO ka mea maʻamau, ua kaupalena ʻia nā ʻano hana hoʻonohonoho ʻē aʻe i ka hoʻololi ʻana i nā string variable i ka hapa nui. I ka hoʻohana ʻana iā Scala, loaʻa nā hiʻohiʻona ʻōlelo ākea e hoʻomaikaʻi i kāu hoʻonohonoho. No ka laʻana hiki iā mākou ke hoʻohana
    nā hiʻohiʻona no nā koina paʻamau, me ka hoʻohana ʻana i nā mea i nā ʻāpana hui, hiki iā mākou ke kuhikuhi i nā vals i haʻi ʻia i hoʻokahi wale nō (DRY) i loko o ka pā. Hiki iā ʻoe ke hoʻololi koke i nā papa i loko o ka hoʻonohonoho (Seq, Map, nā papa maʻamau).
  3. DSL. Loaʻa iā Scala nā hiʻohiʻona ʻōlelo e maʻalahi ai ka hana ʻana i kahi DSL. Hiki ke hoʻohana i kēia mau hiʻohiʻona a hoʻokō i kahi ʻōlelo hoʻonohonoho i ʻoi aku ka maʻalahi no ka pūʻulu o nā mea hoʻohana, i hiki ke heluhelu ʻia ka hoʻonohonoho ʻana e nā poʻe loea. Hiki i nā loea, no ka laʻana, ke komo i ke kaʻina loiloi hoʻonohonoho.
  4. ʻO ka pono a me ka synchrony ma waena o nā nodes. ʻO kekahi o nā pono o ka loaʻa ʻana o ka hoʻonohonoho ʻana o kahi ʻōnaehana puʻupuʻu holoʻokoʻa i mālama ʻia i kahi manawa hoʻokahi, ʻo ia ka hōʻike ʻana o nā waiwai āpau i hoʻokahi manawa a laila hoʻohana hou ʻia i nā wahi āpau e pono ai. ʻO ka hoʻohana ʻana i nā ʻano phantom e haʻi i nā awa e hōʻoia i ka hoʻohana ʻana o nā nodes i nā protocol kūpono i nā hoʻonohonoho ʻōnaehana kūpono. ʻO ka loaʻa ʻana o nā hilinaʻi pono ma waena o nā nodes e hōʻoia i ka pili ʻana o nā lawelawe āpau.
  5. Hoʻololi kūlana kiʻekiʻe. ʻO ka hoʻololi ʻana i ka hoʻonohonoho ʻana me ka hoʻohana ʻana i kahi kaʻina hoʻomohala maʻamau e hiki ai ke hoʻokō i nā kūlana kiʻekiʻe no ka hoʻonohonoho pū kekahi.
  6. Hoʻohou hoʻonohonoho like. Hoʻokomo ʻia ka ʻōnaehana ma hope o ka hoʻololi ʻana i ka hoʻonohonoho ʻana e hōʻoia i ka hoʻonui ʻia ʻana o nā node a pau.
  7. Hoʻomaʻamaʻa i ka noi. ʻAʻole pono ka palapala noi i ka parsing, ka nānā ʻana i ka hoʻonohonoho ʻana, a i ʻole ka lawelawe ʻana i nā waiwai hewa. Hoʻemi kēia i ka paʻakikī o ka noi. (ʻO kekahi o ka paʻakikī o ka hoʻonohonoho ʻana i ʻike ʻia i kā mākou laʻana, ʻaʻole ia he ʻano o ka hoʻonohonoho i hui ʻia, akā he hoʻoholo noʻonoʻo wale nō i alakaʻi ʻia e ka makemake e hāʻawi i kahi palekana ʻano ʻoi aku ka nui.) He mea maʻalahi ke hoʻi i ka hoʻonohonoho maʻamau - hoʻokō wale i ka nalo. ʻāpana. No laila, hiki iā ʻoe, no ka laʻana, e hoʻomaka me kahi hoʻonohonoho hoʻonohonoho, e hoʻopaneʻe i ka hoʻokō ʻana i nā ʻāpana pono ʻole a hiki i ka manawa e pono ai.
  8. Hoʻonohonoho i hōʻoia ʻia. Ma muli o ka hoʻololi ʻana o ka hoʻonohonoho ʻana e hahai i ka hopena maʻamau o nā hoʻololi ʻē aʻe, ʻo ka hopena i loaʻa iā mākou he mea kiʻi me kahi mana kūʻokoʻa. ʻAe kēia iā mākou, no ka laʻana, e hoʻi i kahi mana o ka hoʻonohonoho mua inā pono. Hiki iā mākou ke hoʻohana i ka hoʻonohonoho ʻana mai hoʻokahi makahiki aku nei a e hana like ka ʻōnaehana. Hoʻonui ka hoʻonohonoho paʻa i ka wānana a me ka hilinaʻi o kahi ʻōnaehana puʻunaue. No ka mea ua hoʻopaʻa ʻia ka hoʻonohonoho ʻana i ka pae hoʻohui, paʻakikī loa ka hoʻopunipuni ʻana i ka hana.
  9. Modularity. He modular ka hoʻolālā i manaʻo ʻia a hiki ke hoʻohui ʻia nā modula i nā ʻano like ʻole e hana i nā ʻōnaehana like ʻole. Ma keʻano kūikawā, hiki iā ʻoe ke hoʻonohonoho i ka ʻōnaehana e holo ma ka node hoʻokahi i hoʻokahi ʻano, a ma nā nodes he nui i kekahi. Hiki iā ʻoe ke hana i kekahi mau hoʻonohonoho no nā manawa hana o ka ʻōnaehana.
  10. Hoʻāʻo. Ma ka hoʻololi ʻana i nā lawelawe pākahi me nā mea hoʻohenehene, hiki iā ʻoe ke loaʻa i kekahi mau mana o ka ʻōnaehana kūpono no ka hoʻāʻo ʻana.
  11. Ho'āʻo hoʻohui. ʻO ka loaʻa ʻana o kahi hoʻonohonoho hoʻokahi no ka ʻōnaehana puʻupuʻu holoʻokoʻa e hiki ai ke holo i nā ʻāpana āpau i kahi kaiapuni i hoʻomalu ʻia ma ke ʻano o ka hoʻāʻo hoʻohui. He mea maʻalahi ke hoʻohālike, no ka laʻana, kahi kūlana i hiki ai i kekahi mau nodes ke komo.

Nā hemahema a me nā palena

He ʻokoʻa ka hoʻonohonoho hoʻonohonoho ʻia mai nā ala hoʻonohonoho ʻē aʻe a ʻaʻole kūpono paha no kekahi mau noi. Aia ma lalo kekahi mau hemahema:

  1. Hoʻonohonoho paʻa. I kekahi manawa pono ʻoe e hoʻoponopono koke i ka hoʻonohonoho ʻana i ka hana ʻana, ke kāʻalo ʻana i nā mīkini pale āpau. Me kēia ala hiki ke paʻakikī. ʻO ka liʻiliʻi loa, e koi ʻia ka hoʻopili ʻana a me ka hoʻonohonoho maʻalahi. He hiʻohiʻona pono kēia o ka hoʻokokoke a me ka hemahema i kekahi mau hihia.
  2. Hanana hoʻonohonoho. Inā hoʻokumu ʻia ka faila hoʻonohonoho e kahi mea hana maʻalahi, pono paha nā hana hou e hoʻohui i ka palapala kūkulu.
  3. Mea hana. I kēia manawa, hoʻokumu ʻia nā pono hana a me nā ʻenehana e hana me ka hoʻonohonoho ʻana i nā faila kikokikona. ʻAʻole hiki ke loaʻa nā pono hana a pau i kahi hoʻonohonoho i hui ʻia.
  4. Pono e hoʻololi i nā manaʻo. Ua maʻa nā mea hoʻomohala a me nā DevOps i nā faila kikokikona. ʻO ka manaʻo maoli o ka hoʻopili ʻana i kahi hoʻonohonoho ʻana paha he mea i manaʻo ʻole ʻia a ʻokoʻa a kumu hoʻi e hōʻole ʻia.
  5. Pono kahi kaʻina hana hoʻomohala kiʻekiʻe. I mea e ʻoluʻolu ai ka hoʻohana ʻana i ka hoʻonohonoho i hui ʻia, pono ka automation piha o ke kaʻina hana o ke kūkulu ʻana a me ka hoʻohana ʻana i ka noi (CI/CD). A i ʻole, e lilo ia i mea paʻakikī.

E noʻonoʻo kākou i kekahi mau palena o ka hiʻohiʻona i manaʻo ʻia ʻaʻole pili i ka manaʻo o kahi hoʻonohonoho i hui ʻia:

  1. Inā hāʻawi mākou i ka ʻike hoʻonohonoho pono ʻole i hoʻohana ʻole ʻia e ka node, a laila ʻaʻole kōkua ka mea hōʻuluʻulu iā mākou e ʻike i ka hoʻokō nalo. Hiki ke hoʻoponopono ʻia kēia pilikia ma ka haʻalele ʻana i ke ʻano Cake a me ka hoʻohana ʻana i nā ʻano paʻakikī, no ka laʻana, HList a i ʻole nā ​​ʻano ʻikepili algebraic (nā papa hihia) e hōʻike i ka hoʻonohonoho.
  2. Aia nā laina i loko o ka faila hoʻonohonoho i pili ʻole i ka hoʻonohonoho ponoʻī: (package, import,mea hoolaha; override def's no nā palena i loa'a nā waiwai pa'amau). Hiki ke pale ʻia kēia inā hoʻokō ʻoe i kāu DSL ponoʻī. Eia kekahi, ʻo nā ʻano hoʻonohonoho ʻē aʻe (no ka laʻana, XML) ke kau nei i kekahi mau palena i ka hoʻolālā faila.
  3. No nā kumu o kēia pou, ʻaʻole mākou e noʻonoʻo i ka hoʻonohonoho hou ʻana o kahi hui o nā nodes like.

hopena

Ma kēia pou, ua ʻimi mākou i ka manaʻo o ka hōʻike ʻana i ka hoʻonohonoho ʻana i ka code source me ka hoʻohana ʻana i nā mana holomua o ka ʻōnaehana type Scala. Hiki ke hoʻohana ʻia kēia ala i nā noi like ʻole ma ke ʻano he pani no nā ʻano hoʻonohonoho kuʻuna ma muli o xml a i ʻole nā ​​faila kikokikona. ʻOiai ua hoʻokō ʻia kā mākou hiʻohiʻona ma Scala, hiki ke hoʻololi ʻia nā manaʻo like i nā ʻōlelo i hui pū ʻia (e like me Kotlin, C#, Swift, ...). Hiki iā ʻoe ke hoʻāʻo i kēia ala ma kekahi o kēia mau papahana, a inā ʻaʻole ia e hana, e neʻe i ka faila kikokikona, e hoʻohui i nā ʻāpana i nalowale.

Ma keʻano maʻamau, pono kahi hoʻonohonoho hoʻonohonoho i kahi kaʻina hoʻomohala kiʻekiʻe. I ka hoʻihoʻi ʻana, hōʻoia ʻia ka maikaʻi kiʻekiʻe a me ka hilinaʻi o nā hoʻonohonoho.

Hiki ke hoʻonui ʻia ke ala i manaʻo ʻia:

  1. Hiki iā ʻoe ke hoʻohana i nā macros e hana i nā hōʻoia manawa hoʻonohonoho.
  2. Hiki iā ʻoe ke hoʻokō i kahi DSL e hōʻike i ka hoʻonohonoho ʻana i kahi ala e hiki ai i nā mea hoʻohana hope.
  3. Hiki iā ʻoe ke hoʻokō i ka hoʻokele waiwai ikaika me ka hoʻoponopono hoʻonohonoho ʻakomi. No ka laʻana, pono e hoʻololi i ka helu o nā node i loko o kahi hui (1) e loaʻa i kēlā me kēia node kahi hoʻonohonoho ʻokoʻa iki; (2) ua loaʻa i ka luna hui ka ʻike e pili ana i nā nodes hou.

Mahalo

Makemake au e hoʻomaikaʻi aku iā Andrei Saksonov, Pavel Popov a me Anton Nekhaev no kā lākou hoʻohewa maikaʻi ʻana i ka ʻatikala.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka