Hoʻonohonoho hoʻohui ʻia o kahi ʻōnaehana puʻunaue

Ma kēia pou makemake mākou e kaʻana like i kahi ala hoihoi e pili ana i ka hoʻonohonoho ʻana o kahi ʻōnaehana puʻunaue.
Hōʻike pololei ʻia ka hoʻonohonoho ʻana ma ka ʻōlelo Scala ma kahi ʻano palekana. Hōʻike ʻia kahi hoʻokō laʻana i nā kikoʻī. Kūkākūkā ʻia nā ʻano like ʻole o ka manaʻo, me ka hoʻopili ʻana i ke kaʻina hana hoʻomohala holoʻokoʻa.

Hoʻonohonoho hoʻohui ʻia o kahi ʻōnaehana puʻunaue

(i Lūkini)

Introduction

Pono ke kūkulu ʻana i nā ʻōnaehana puʻunaue ikaika i ka hoʻohana ʻana i ka hoʻonohonoho pololei a paʻa i nā node a pau. ʻO kahi hopena maʻamau ka hoʻohana ʻana i kahi wehewehe wehewehe kikokikona (terraform, ansible a i ʻole kekahi mea like) a me nā faila hoʻonohonoho maʻamau (pinepine - hoʻolaʻa ʻia no kēlā me kēia node / kuleana). Makemake mākou e hoʻohana i nā kuʻina like o nā mana like ma kēlā me kēia nodes kamaʻilio (inā ʻaʻole mākou e ʻike i nā pilikia incompatibility). Ma ka honua JVM, ʻo ia hoʻi, ʻo ka liʻiliʻi o ka waihona memo e like me ka mana like ma nā nodes kamaʻilio āpau.

Pehea e pili ana i ka hoʻāʻo ʻana i ka ʻōnaehana? ʻOiaʻiʻo, pono e loaʻa iā mākou nā hoʻokolohua ʻāpana no nā ʻāpana āpau ma mua o ka hele ʻana i nā hoʻokolohua hoʻohui. I mea e hiki ai ke hoʻonui i nā hopena hōʻike i ka wā holo, pono mākou e hōʻoia i ka mālama ʻana o nā mana o nā hale waihona puke a pau i ka wā holo a me ka hoʻāʻo ʻana.

I ka holo ʻana i nā hoʻokolohua hoʻohui, ʻoi aku ka maʻalahi o ka loaʻa ʻana o ke ala papa like ma nā node āpau. Pono mākou e hōʻoia e hoʻohana ʻia ka papa kuhikuhi like ma ka hoʻolālā. (Hiki ke hoʻohana i nā papa papa ʻokoʻa ma nā node like ʻole, akā ʻoi aku ka paʻakikī o ka hoʻonohonoho ʻana i kēia hoʻonohonoho a hoʻonohonoho pono iā ia.) No laila, i mea e maʻalahi ai nā mea, e noʻonoʻo mākou i nā papa papa like ʻole ma nā nodes a pau.

E ulu pū ana ka hoʻonohonoho me ka polokalamu. Hoʻohana pinepine mākou i nā mana e ʻike i nā ʻano like ʻole
nā pae o ka hoʻomohala polokalamu. He mea kūpono ke uhi i ka hoʻonohonoho ma lalo o ka hoʻokele mana a ʻike i nā hoʻonohonoho like ʻole me kekahi mau lepili. Inā hoʻokahi wale nō hoʻonohonoho i ka hana ʻana, hiki iā mākou ke hoʻohana i hoʻokahi mana ma ke ʻano he ʻike. I kekahi manawa, loaʻa iā mākou nā wahi hana he nui. A no kēlā me kēia kaiapuni e pono paha mākou i kahi lālā kaʻawale o ka hoʻonohonoho. No laila hiki ke hoʻopaʻa inoa ʻia nā hoʻonohonoho me ka lālā a me ka mana e ʻike kūʻokoʻa i nā hoʻonohonoho like ʻole. Pili kēlā me kēia lālā lālā a me ka mana i ka hui pū ʻana o nā node i puʻunaue ʻia, nā awa, nā kumuwaiwai o waho, nā mana waihona classpath ma kēlā me kēia node. Ma ʻaneʻi e uhi wale mākou i ka lālā hoʻokahi a e ʻike i nā hoʻonohonoho ʻana e kahi mana decimal ʻekolu (1.2.3), ma ke ʻano like me nā mea kiʻi ʻē aʻe.

ʻAʻole hoʻololi hou ʻia nā faila hoʻonohonoho i nā kaiapuni hou. Hoʻopuka maʻamau mākou
config i nā faila i ka manawa hoʻolālā a mai hoopa aku ia lakou mahope iho. No laila hiki i kekahi ke nīnau no ke aha mākou e hoʻohana mau ai i ka palapala kikokikona no nā faila hoʻonohonoho? ʻO kahi koho kūpono e kau i ka hoʻonohonoho i loko o kahi hui hoʻohui a loaʻa ka pōmaikaʻi mai ka hōʻoia ʻana i ka manawa hoʻonohonoho.

Ma kēia pou e nānā mākou i ka manaʻo o ka mālama ʻana i ka hoʻonohonoho i ka artifact i hōʻuluʻulu ʻia.

Hoʻonohonoho hoʻonohonoho

Ma kēia ʻāpana e kūkākūkā mākou i kahi laʻana o ka hoʻonohonoho static. ʻElua mau lawelawe maʻalahi - echo service a me ka mea kūʻai aku o ka lawelawe echo ke hoʻonohonoho ʻia a hoʻokō ʻia. A laila hoʻomaka koke ʻia nā ʻōnaehana māhele ʻelua me nā lawelawe ʻelua. Hoʻokahi no ka hoʻonohonoho node hoʻokahi a ʻo kekahi no ka hoʻonohonoho node ʻelua.

Aia kekahi ʻōnaehana puʻunaue maʻamau i kekahi mau nodes. Hiki ke ʻike ʻia nā nodes me kekahi ʻano:

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

aiʻole

case class NodeId(hostName: String)

a i ole

object Singleton
type NodeId = Singleton.type

Hana kēia mau nodes i nā hana like ʻole, holo i kekahi mau lawelawe a pono e hiki ke kamaʻilio me nā nodes ʻē aʻe ma o nā pilina TCP/HTTP.

No ka hoʻopili TCP pono ʻia kahi helu awa. Makemake mākou e hōʻoia i ka mea kūʻai aku a me ke kikowaena e kamaʻilio nei i ka protocol like. I mea e hoʻohālike ai i ka pilina ma waena o nā nodes e haʻi aku i kēia papa:

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

kahi Port he mea wale nō Int i loko o ka laulā i ʻae ʻia:

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

ʻAno hoʻomaʻemaʻe

ike hoʻopauʻia hale waihona puke. I ka pōkole, hiki iā ia ke hoʻohui i nā palena manawa hoʻohui i nā ʻano ʻē aʻe. Ma keia hihia Int ʻae wale ʻia e loaʻa nā waiwai 16-bit hiki ke hōʻike i ka helu port. ʻAʻohe koi e hoʻohana i kēia waihona no kēia ala hoʻonohonoho. Me he mea lā ua kūpono loa.

No HTTP (REST) ​​pono paha mākou i kahi ala o ka lawelawe:

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

ʻAno Phantom

I mea e ʻike ai i ka protocol i ka wā o ka hōʻuluʻulu ʻana ke hoʻohana nei mākou i ka hiʻohiʻona Scala o ka haʻi ʻana i ke ʻano hoʻopaʻapaʻa Protocol ʻaʻole i hoʻohana ʻia i ka papa. He mea i kapaia ʻano phantom. I ka wā holo ʻaʻole pono mākou i kahi laʻana o ka ʻike protocol, ʻo ia ke kumu ʻaʻole mākou e mālama. I ka wā o ka hui ʻana, hāʻawi kēia ʻano phantom i kahi palekana ʻano ʻē aʻe. ʻAʻole hiki iā mākou ke hele i ke awa me ka protocol hewa.

ʻO kekahi o nā protocol i hoʻohana nui ʻia ʻo REST API me Json serialization:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

kahi RequestMessage ʻo ia ke ʻano kumu o nā memo i hiki i ka mea kūʻai ke hoʻouna i ke kikowaena a ResponseMessage ʻo ia ka leka pane mai ke kikowaena. ʻOiaʻiʻo, hiki iā mākou ke hana i nā wehewehe protocol ʻē aʻe e kuhikuhi i ka protocol kamaʻilio me ka pololei i makemake ʻia.

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]

Ma kēia protocol ua hoʻopili ʻia ka memo i ka url a ua hoʻihoʻi ʻia ka memo pane ma ke ʻano he kaula maʻamau.

Hiki ke wehewehe ʻia kahi hoʻonohonoho lawelawe e ka inoa lawelawe, kahi hōʻiliʻili o nā awa a me kekahi mau hilinaʻi. Aia kekahi mau ala e hiki ai ke hōʻike i kēia mau mea āpau ma Scala (no ka laʻana, HList, ʻano ʻikepili algebraic). No nā kumu o kēia pou, e hoʻohana mākou i ka Cake Pattern a hōʻike i nā ʻāpana hui ʻia (modules) ma ke ʻano he ʻano. (ʻAʻole koi ʻia ka Cake Pattern no kēia ʻano hoʻonohonoho hoʻonohonoho.

Hiki ke hōʻike ʻia nā mea hilinaʻi me ka hoʻohana ʻana i ka Cake Pattern ma ke ʻano he hopena o nā nodes ʻē 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)
  }

Pono ka lawelawe echo i kahi awa i hoʻonohonoho ʻia. A ke haʻi aku nei mākou ua kākoʻo kēia awa i ka protocol echo. E hoʻomaopopo ʻaʻole pono mākou e kuhikuhi i kahi awa kūikawā i kēia manawa, no ka mea hiki i ka trait ke ʻae i nā ʻano hana abstract. Inā mākou e hoʻohana i nā ʻano abstract, e koi ka compiler i kahi hoʻokō i kahi laʻana hoʻonohonoho. Eia mākou i hoʻolako i ka hoʻokō (8081) a e hoʻohana ʻia ʻo ia ma ke ʻano he kumu paʻamau inā mākou e hoʻokuʻu iā ia i kahi hoʻonohonoho paʻa.

Hiki iā mākou ke haʻi i kahi hilinaʻi i ka hoʻonohonoho ʻana o ka mea lawelawe 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 echoService. ʻO ka mea kūikawā, koi ia i ka protocol like. No laila, hiki iā mākou ke maopopo inā pili mākou i kēia mau hilinaʻi ʻelua e hana pololei lākou.

Hoʻokō lawelawe

Pono kahi lawelawe e hoʻomaka a pani maikaʻi. (He mea koʻikoʻi ka hiki ke pani i kahi lawelawe no ka hoʻāʻo ʻana.) Eia hou kekahi mau koho no ka wehewehe ʻana i ia hana no kahi config i hāʻawi ʻia (no ka laʻana, hiki iā mākou ke hoʻohana i nā papa ʻano). No kēia pou e hoʻohana hou mākou i ka Cake Pattern. Hiki iā mākou ke hōʻike i kahi lawelawe me ka hoʻohana ʻana cats.Resource ka mea i hāʻawi mua i ka bracketing a me ka hoʻokuʻu waiwai. No ka loaʻa ʻana o kahi kumuwaiwai pono mākou e hāʻawi i kahi hoʻonohonoho a me kekahi pōʻaiapili runtime. No laila ke ʻano o ka hana hoʻomaka lawelawe e like me:

  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 i koi ʻia e kēia mea hoʻomaka lawelawe
  • AddressResolver - kahi mea holo manawa i hiki ke kiʻi i nā helu maoli o nā nodes ʻē aʻe (e hoʻomau i ka heluhelu ʻana no nā kikoʻī).

mai nā ʻano ʻē aʻe cats:

  • F[_] - ʻano hopena (Ma ka hihia maʻalahi F[A] hiki wale () => A. Ma kēia pou e hoʻohana mākou cats.IO.)
  • Reader[A,B] — ʻoi aku a liʻiliʻi paha kahi ʻano like no kahi hana A => B
  • cats.Resource - loaʻa nā ala e loaʻa a hoʻokuʻu
  • Timer — hiki ke hiamoe/ana i ka manawa
  • ContextShift - analog o ExecutionContext
  • Applicative - ka ʻōwili o nā hana i ka hopena (kokoke i kahi monad) (hiki iā mākou ke hoʻololi iā ia me kahi mea ʻē aʻe)

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

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

(E nānā Hoʻopā'ālua no nā lawelawe lawelawe ʻē aʻe - lawelawe echo,
mea kūʻai echo a nā mea mālama ola.)

ʻO ka node kahi mea hoʻokahi e holo ana i kekahi mau lawelawe (e hoʻomaka ana i kahi kaulahao o nā kumuwaiwai e hoʻohana ʻia e Cake Pattern):

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

E hoʻomaopopo i loko o ka node mākou e kuhikuhi i ke ʻano o ka hoʻonohonoho pono e pono ai kēia node. ʻAʻole ʻae ʻo Compiler iā mākou e kūkulu i ka mea (Cake) me ka lawa ʻole o ke ʻano, no ka mea, hōʻike kēlā me kēia ʻano lawelawe i kahi kaohi ma ka Config ʻano ʻano. ʻAʻole hiki iā mākou ke hoʻomaka i ka node me ka hāʻawi ʻole i ka hoʻonohonoho piha.

Ka hoʻoholo ʻana o ka helu wahi node

No ka hoʻokumu ʻana i kahi pilina pono mākou i kahi helu host maoli no kēlā me kēia node. Hiki ke ʻike ʻia ma mua o nā ʻāpana ʻē aʻe o ka hoʻonohonoho. No laila, pono mākou i kahi ala e hāʻawi ai i kahi palapala ʻāina ma waena o ka node id a me ka helu maoli. He hana kēia palapala 'āina:

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

Aia kekahi mau ala hiki ke hoʻokō i ia hana.

  1. Inā ʻike mākou i nā ʻōlelo maoli ma mua o ka hoʻoili ʻia ʻana, i ka manawa o ka node hosts instantiation, a laila hiki iā mākou ke hana i ka code Scala me nā ʻōlelo maoli a holo i ke kūkulu ma hope (e hana ana i ka hōʻuluʻulu ʻana i nā loiloi manawa a laila holo i ka suite hoʻāʻo hoʻohui). I kēia hihia, ʻike ʻia kā mākou hana mapping a hiki ke maʻalahi i kahi mea e like me a Map[NodeId, NodeAddress].
  2. I kekahi manawa, loaʻa iā mākou nā ʻōlelo kikoʻī ma hope wale nō i ka wā i hoʻomaka maoli ʻia ai ka node, a i ʻole ʻaʻohe o mākou mau helu nodes i hoʻomaka ʻole ʻia. I kēia hihia, loaʻa paha iā mākou kahi lawelawe ʻike i hoʻomaka ʻia ma mua o nā node ʻē aʻe a hiki i kēlā me kēia node ke hoʻolaha i kona helu wahi ma ia lawelawe a kau inoa i nā mea hilinaʻi.
  3. Inā hiki iā mākou ke hoʻololi /etc/hosts, hiki iā mākou ke hoʻohana i nā inoa host i koho mua ʻia (like my-project-main-node a echo-backend) a hoʻopili wale i kēia inoa me ka helu ip i ka manawa hoʻolālā.

Ma kēia pou ʻaʻole mākou e uhi i kēia mau hihia i nā kikoʻī hou aku. ʻO ka ʻoiaʻiʻo i kā mākou hiʻohiʻona pāʻani e loaʻa i nā node āpau ka leka uila IP like - 127.0.0.1.

Ma kēia pou, e noʻonoʻo mākou i ʻelua ʻōnaehana hoʻonohonoho hoʻolaha:

  1. Hoʻolālā node hoʻokahi, kahi e kau ʻia ai nā lawelawe āpau ma ka node hoʻokahi.
  2. ʻElua node hoʻolālā, kahi o ka lawelawe a me ka mea kūʻai aku ma nā node ʻokoʻa.

ʻO ka hoʻonohonoho no a node hoʻokahi penei ka hoʻolālā:

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

Maʻaneʻi mākou e hana i kahi hoʻonohonoho hoʻokahi e hoʻonui i ka hoʻonohonoho kikowaena a me ka mea kūʻai aku. Hoʻonohonoho pū mākou i kahi mea hoʻokele lifecycle e hoʻopau maʻamau i ka mea kūʻai aku a me ka server ma hope lifetime hala waena.

Hiki ke hoʻohana ʻia ka hoʻonohonoho like o nā lawelawe lawelawe a me nā hoʻonohonoho no ka hana ʻana i kahi hoʻonohonoho ʻōnaehana me nā node ʻelua. Pono mākou e hana ʻelua hoʻonohonoho node ʻokoʻa me nā lawelawe kūpono:

ʻElua nodes 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"
  }

E ʻike pehea mākou e wehewehe ai i ka hilinaʻi. Ke haʻi nei mākou i ka lawelawe i hāʻawi ʻia e ka node ma ke ʻano he hilinaʻi o ka node o kēia manawa. ʻIke ʻia ke ʻano o ka hilinaʻi no ka mea aia ke ʻano phantom e wehewehe ana i ka protocol. A i ka wā holo e loaʻa iā mākou ka node id kūpono. ʻO kēia kekahi o nā mea koʻikoʻi o ke ala hoʻonohonoho i manaʻo ʻia. Hāʻawi ia iā mākou i ka hiki ke hoʻonohonoho i ke awa hoʻokahi wale nō a ʻike pono mākou e kuhikuhi ana i ke awa kūpono.

ʻElua nodes hoʻokō

No kēia hoʻonohonoho hoʻohana mākou i nā lawelawe lawelawe like. ʻAʻohe loli iki. Eia naʻe, hana mākou i ʻelua hoʻokō node ʻokoʻa i loaʻa 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 ka server a pono wale ia i ka ʻaoʻao ʻaoʻao config. Hoʻokomo ka node ʻelua i ka mea kūʻai aku a pono i kahi ʻāpana o ka config. Pono nā node ʻelua i nā kikoʻī o ke ola. No nā kumu o kēia node lawelawe post e loaʻa i ke ola pau ʻole i hiki ke hoʻopau ʻia me ka hoʻohana ʻana SIGTERM, ʻoiai e hoʻopau ʻia ka mea kūʻai echo ma hope o ka lōʻihi i hoʻonohonoho ʻia. E nana i ka palapala hoʻomaka no ka mea, details.

Kaʻina hoʻomohala holoʻokoʻa

E ʻike kākou pehea e hoʻololi ai kēia ala i ke ʻano o kā mākou hana me ka hoʻonohonoho.

E hōʻuluʻulu ʻia ka hoʻonohonoho ma ke ʻano he code a hana i kahi artifact. He mea kūpono ke hoʻokaʻawale i nā artifact hoʻonohonoho mai nā mea kiʻi code ʻē aʻe. I ka manawa pinepine hiki iā mākou ke loaʻa i ka nui o nā hoʻonohonoho ma ka waihona code like. A ʻoiaʻiʻo, hiki iā mākou ke loaʻa i nā mana he nui o nā lālā hoʻonohonoho like ʻole. Ma kahi hoʻonohonoho hiki iā mākou ke koho i nā mana kūikawā o nā hale waihona puke a e hoʻomau mau kēia i ka wā a mākou e kau ai i kēia hoʻonohonoho.

ʻO kahi hoʻololi hoʻonohonoho e lilo i hoʻololi code. No laila pono e uhi ʻia e ke kaʻina hana hōʻoia maikaʻi like:

Ticket -> PR -> loiloi -> hui -> hoʻohui mau -> hoʻomau mau

Aia nā hopena ma hope o ke ala:

  1. Hoʻohui like ka hoʻonohonoho ʻana no ka laʻana o kahi ʻōnaehana. Me he mea lā ʻaʻohe ala e loaʻa ai ka pilina pololei ma waena o nā nodes.
  2. ʻAʻole maʻalahi ka hoʻololi ʻana i ka hoʻonohonoho ʻana i hoʻokahi node. He mea kūpono ʻole ke komo ʻana a hoʻololi i kekahi mau faila kikokikona. No laila ua emi ka hiki ʻana o ka drift hoʻonohonoho.
  3. ʻAʻole maʻalahi nā hoʻololi hoʻonohonoho liʻiliʻi.
  4. ʻO ka hapa nui o nā hoʻololi hoʻonohonoho e hahai i ke kaʻina hana hoʻomohala like, a e hala kekahi loiloi.

Pono mākou i kahi waihona kūʻokoʻa no ka hoʻonohonoho hana? Loaʻa paha i ka hoʻonohonoho hoʻonohonoho ʻana ka ʻike koʻikoʻi a mākou e makemake ai e pale aku i ka hiki ʻole o nā poʻe he nui. No laila pono paha ka mālama ʻana i kahi waihona ʻokoʻa me ka hiki ke komo i loko o ka hoʻonohonoho hana. Hiki iā mākou ke hoʻokaʻawale i ka hoʻonohonoho ʻana i ʻelua ʻāpana - hoʻokahi i loaʻa nā ʻāpana ākea loa o ka hana ʻana a ʻo kekahi i loaʻa ka ʻāpana huna o ka hoʻonohonoho. Hiki i kēia ke komo i ka hapa nui o nā mea hoʻomohala i ka hapa nui o nā ʻāpana ʻoiai ke kaohi ʻana i ke komo ʻana i nā mea koʻikoʻi maoli. He mea maʻalahi ka hoʻokō ʻana i kēia me ka hoʻohana ʻana i nā ʻano waena me nā koina paʻamau.

likeʻole

E ʻike kākou i nā pono a me nā pōʻino o ke ala i manaʻo ʻia e hoʻohālikelike ʻia me nā ʻenehana hoʻokele hoʻonohonoho ʻē aʻe.

ʻO ka mea mua, e papa inoa mākou i kekahi mau mea ʻokoʻa i nā ʻano like ʻole o ke ala i manaʻo ʻia e pili ana i ka hoʻonohonoho ʻana:

  1. Waihona kikokikona ma ka mīkini ʻimi.
  2. Hoʻopaʻa waiwai kī waena (e like me etcd/zookeeper).
  3. Hiki ke hoʻonohonoho hou ʻia nā ʻāpana subprocess me ka ʻole o ka hoʻomaka hou ʻana.
  4. Ka hoʻonohonoho ʻana ma waho o nā mea artifact a me ka mana mana.

Text file gives some flexibility in terms of ad-hoc fixes. A system’s administrator can login to the target node, make a change and simply restart the service. This might not be as good for bigger systems. No traces are left behind the change. The change is not reviewed by another pair of eyes. It might be difficult to find out what have caused the change. It has not been tested. From distributed system’s perspective an administrator can simply forget to update the configuration in one of the other nodes.

(Btw, inā pono e hoʻomaka i ka hoʻohana ʻana i nā faila config, pono mākou e hoʻohui i ka parser + validator hiki ke hana like. Config type a lawa ia e hoʻomaka ai e hoʻohana i nā configs kikokikona. Hōʻike pū kēia i ka liʻiliʻi liʻiliʻi o ka paʻakikī o ka hoʻonohonoho ʻana i ka manawa hōʻuluʻulu ma mua o ka paʻakikī o nā configs pili kikokikona, no ka mea, i ka mana kikokikona pono mākou i kekahi code hou.)

ʻO ka mālama ʻana i nā waiwai kī waena he mīkini maikaʻi no ka puʻunaue ʻana i nā ʻāpana meta noi. Maanei pono mākou e noʻonoʻo e pili ana i ka mea a mākou e manaʻo ai he mau waiwai hoʻonohonoho a he aha ka ʻikepili wale nō. Hāʻawi ʻia i kahi hana C => A => B ke kapa pinepine nei makou i na waiwai hoololi C "hoʻonohonoho", ʻoiai ua hoʻololi pinepine ʻia ka ʻikepili A - hoʻokomo wale i ka ʻikepili. Pono e hāʻawi ʻia ka hoʻonohonoho ʻana i ka hana ma mua o ka ʻikepili A. Hāʻawi ʻia kēia manaʻo hiki iā mākou ke ʻōlelo i ka manaʻo pinepine o nā loli i hiki ke hoʻohana ʻia e hoʻokaʻawale i ka ʻikepili hoʻonohonoho mai ka ʻikepili wale nō. Loaʻa mai ka ʻikepili mai kahi kumu (mea hoʻohana) a mai kahi kumu ʻē aʻe (admin). ʻO ka hana ʻana me nā ʻāpana hiki ke hoʻololi ʻia ma hope o ke kaʻina hana hoʻomaka e alakaʻi i ka piʻi ʻana o ka paʻakikī o ka noi. No ia mau ʻāpana, pono mākou e mālama i kā lākou hoʻouna ʻana, ka parsing a me ka hōʻoia, ka lawelawe ʻana i nā waiwai hewa. No laila, i mea e hōʻemi ai i ka paʻakikī o ka papahana, ʻoi aku ka maikaʻi o ka hoʻemi ʻana i ka helu o nā ʻāpana i hiki ke loli i ka wā holo (a i ʻole e hoʻopau loa iā lākou).

Mai ka hiʻohiʻona o kēia pou pono mākou e hoʻokaʻawale i waena o nā ʻāpana static a me ka ikaika. Inā makemake ka loiloi lawelawe i ka loli ʻole o kekahi mau ʻāpana i ka wā holo, a laila hiki iā mākou ke kapa iā lākou he mau ʻāpana ikaika. A i ʻole, paʻa lākou a hiki ke hoʻonohonoho ʻia me ka hoʻohana ʻana i ke ala i manaʻo ʻia. No ka hoʻonohonoho hou ʻana i ka ikaika, pono paha nā ala ʻē aʻe. No ka laʻana, hiki ke hoʻomaka hou ʻia nā ʻāpana o ka ʻōnaehana me nā ʻāpana hoʻonohonoho hou ma ke ʻano like me ka hoʻomaka hou ʻana i nā kaʻina kaʻawale o kahi ʻōnaehana puʻunaue.
(ʻO koʻu manaʻo haʻahaʻa e pale i ka hoʻonohonoho hou ʻana i ka wā holo no ka mea e hoʻonui i ka paʻakikī o ka ʻōnaehana.
ʻOi aku ka maʻalahi o ka hilinaʻi wale ʻana i ke kākoʻo OS no ka hoʻomaka hou ʻana i nā kaʻina hana. ʻOiai, ʻaʻole hiki i nā manawa a pau.)

ʻO kahi ʻano koʻikoʻi o ka hoʻohana ʻana i ka hoʻonohonoho static i kekahi manawa e noʻonoʻo ai ka poʻe i ka hoʻonohonoho hoʻoikaika (me nā kumu ʻē aʻe) ʻo ia ka manawa haʻahaʻa i ka wā o ka hoʻonohonoho hoʻonohonoho. ʻ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 i lilo i mea waiwai hou. ʻOkoʻa nā koi no ka downtime no nā ʻōnaehana like ʻole, no laila ʻaʻole ia he koʻikoʻi. Inā he koʻikoʻi, a laila pono mākou e hoʻolālā i mua no ka hoʻomaka hou ʻana o ka ʻōnaehana. No ka laʻana, hiki iā mākou ke hoʻokō ʻO ka hoʻoheheʻe ʻana o ka pilina AWS ELB. Ma kēia hiʻohiʻona i nā manawa a pau e pono ai mākou e hoʻomaka hou i ka ʻōnaehana, hoʻomaka mākou i kahi manawa hou o ka ʻōnaehana i ka like, a laila e hoʻololi iā ELB iā ia, ʻoiai e ʻae ana i ka ʻōnaehana kahiko e hoʻopau i ka lawelawe ʻana i nā pilina.

Pehea e pili ana i ka mālama ʻana i ka hoʻonohonoho ʻana i loko o nā mea artifact versioned a i waho paha? ʻO ka mālama ʻana i ka hoʻonohonoho ʻana i loko o kahi artifact, ʻo ia ka mea ma ka hapa nui o nā hihia ua hala kēia hoʻonohonoho i ke kaʻina hana hōʻoia maikaʻi like me nā mea hana ʻē aʻe. No laila hiki ke maopopo i ka hoʻonohonoho ʻana he maikaʻi a hilinaʻi. ʻO ka hoʻonohonoho ʻē aʻe i kahi faila ʻokoʻa ʻo ia ka mea ʻaʻohe ʻike o ka mea a me ke kumu i hoʻololi ai i kēlā faila. He mea nui kēia? Manaʻo mākou no ka hapa nui o nā ʻōnaehana hana ʻoi aku ka maikaʻi o ka hoʻonohonoho paʻa a me ke kūlana kiʻekiʻe.

Hiki i ka mana o ka artifact ke ʻike i ka wā i hana ʻia ai, he aha nā waiwai i loaʻa iā ia, he aha nā hiʻohiʻona i hiki ke hoʻopau ʻia, ʻo ia ke kuleana no ka hana ʻana i kēlā me kēia hoʻololi i ka hoʻonohonoho. Pono paha e hoʻoikaika i ka hoʻonohonoho ʻana i loko o kahi kiʻi kiʻi a he koho hoʻolālā ia e hana ai.

Pros & cons

Maʻaneʻi makemake mākou e hōʻike i kekahi mau mea maikaʻi a kūkākūkā i kekahi mau hemahema o ke ala i manaʻo ʻia.

pono

Nā hiʻohiʻona o ka hoʻonohonoho hoʻonohonoho ʻana o kahi ʻōnaehana hoʻolaha piha:

  1. Nānā paʻakū o ka hoʻonohonoho. Hāʻawi kēia i kahi kūlana kiʻekiʻe o ka hilinaʻi, ua pololei ka hoʻonohonoho ʻana i hāʻawi ʻia i nā ʻano kaohi.
  2. ʻŌlelo waiwai o ka hoʻonohonoho. ʻO ka mea maʻamau, ua kaupalena ʻia nā ala hoʻonohonoho ʻē aʻe i ka nui o nā pani hoʻololi.
    Me ka hoʻohana ʻana iā Scala hiki i kekahi ke hoʻohana i kahi ākea o nā hiʻohiʻona ʻōlelo e hoʻomaikaʻi i ka hoʻonohonoho ʻana. No ka laʻana, hiki iā mākou ke hoʻohana i nā hiʻohiʻona e hāʻawi i nā waiwai paʻamau, nā mea e hoʻonohonoho i nā ʻano like ʻole, hiki iā mākou ke kuhikuhi vals i wehewehe ʻia i hoʻokahi wale nō ma ke kiko o waho (DRY). Hiki ke hoʻohana i nā ʻano kikoʻī, a i ʻole nā ​​manawa o kekahi mau papa (Seq, Map, a me nā mea'ē aʻe).
  3. DSL. He kākoʻo kūpono ʻo Scala no nā mea kākau DSL. Hiki i kekahi ke hoʻohana i kēia mau hiʻohiʻona e hoʻokumu i kahi ʻōlelo hoʻonohonoho i ʻoi aku ka maʻalahi a me ka mea hoʻohana hope, i hiki ke heluhelu ʻia ka hoʻonohonoho hope loa e nā mea hoʻohana domain.
  4. ʻO ka pololei a me ka pilina ma waena o nā nodes. ʻO kekahi o nā pōmaikaʻi o ka hoʻonohonoho ʻana no ka ʻōnaehana puʻupuʻu holoʻokoʻa ma kahi hoʻokahi, ʻo ia ka wehewehe ʻana i nā waiwai āpau i hoʻokahi manawa a laila hoʻohana hou ʻia i nā wahi āpau a mākou e pono ai. E paʻi pū i nā ʻōlelo hoʻolaha awa palekana e ʻōlelo i ka ʻōlelo hoʻokahi ma nā hoʻonohonoho kūpono a pau. Aia nā mea hilinaʻi ma waena o nā nodes e paʻakikī ke poina i ka hāʻawi ʻana i kekahi mau lawelawe.
  5. ʻO ke kūlana kiʻekiʻe o nā loli. ʻO ke ala holoʻokoʻa o ka hoʻololi ʻana i ka hoʻololi ʻana ma o ka hana PR maʻamau e hoʻokumu i nā kūlana kiʻekiʻe o ka maikaʻi ma ka hoʻonohonoho.
  6. Hoʻololi hoʻonohonoho like. I kēlā me kēia manawa a mākou e hoʻololi ai i ka hoʻonohonoho hoʻonohonoho hoʻonohonoho ʻokoʻa e hōʻoia i ka hoʻonui ʻia ʻana o nā node āpau.
  7. Ka maʻalahi o ka noi. ʻAʻole pono ka palapala noi e hoʻopau a hōʻoia i ka hoʻonohonoho ʻana a mālama i nā waiwai hoʻonohonoho hewa. Hoʻomaʻamaʻa kēia i ka noi holoʻokoʻa. (Aia kekahi hoʻonui paʻakikī i ka hoʻonohonoho ponoʻī, akā he mea kūʻai noʻonoʻo i ka palekana.) He mea maʻalahi ke hoʻi i ka hoʻonohonoho maʻamau - hoʻohui wale i nā ʻāpana i nalowale. ʻOi aku ka maʻalahi o ka hoʻomaka ʻana me ka hoʻonohonoho hoʻonohonoho ʻia a hoʻopanee i ka hoʻokō ʻana i nā ʻāpana hou i kekahi mau manawa ma hope.
  8. Hoʻonohonoho hoʻololi. Ma muli o ka hoʻololi ʻana o ka hoʻonohonoho ʻana e hahai i ke kaʻina hana hoʻomohala like, ma muli o ka hopena e loaʻa iā mākou kahi artifact me kahi mana kūʻokoʻa. Hiki iā mākou ke hoʻololi i ka hoʻonohonoho hou inā pono. Hiki iā mākou ke kau i kahi hoʻonohonoho i hoʻohana ʻia i hoʻokahi makahiki i hala a e hana like ia. Hoʻonui ka hoʻonohonoho paʻa i ka wānana a me ka hilinaʻi o ka ʻōnaehana puʻunaue. Hoʻopaʻa ʻia ka hoʻonohonoho ʻana i ka manawa hōʻuluʻulu a ʻaʻole hiki ke hoʻololi maʻalahi i kahi ʻōnaehana hana.
  9. Modularity. ʻO ka hoʻolālā i manaʻo ʻia he modular a hiki ke hoʻohui ʻia nā modula i nā ʻano like ʻole
    kākoʻo i nā hoʻonohonoho like ʻole (hoʻonohonoho / hoʻonohonoho). ʻO ka mea nui, hiki ke loaʻa kahi hoʻonohonoho node hoʻokahi a me kahi hoʻonohonoho node nui. He kūpono ka loaʻa ʻana o nā hoʻolālā hana he nui.
  10. Ke hoao ana. No ka hoʻāʻo ʻana, hiki i kekahi ke hoʻokō i kahi lawelawe hoʻohenehene a hoʻohana iā ia ma ke ʻano he hilinaʻi ma kahi ʻano palekana. Hiki ke mālama ʻia kekahi mau papa hoʻāʻo like ʻole me nā ʻāpana like ʻole i hoʻololi ʻia e nā hoʻohenehene.
  11. Ho'āʻo hoʻohui. I kekahi manawa ma nā ʻōnaehana puʻunaue he paʻakikī ke holo i nā hoʻokolohua hoʻohui. Me ka hoʻohana ʻana i ke ala i wehewehe ʻia e paʻi i ka hoʻonohonoho palekana o ka ʻōnaehana puʻupuʻu piha, hiki iā mākou ke holo i nā ʻāpana māhele a pau ma kahi kikowaena hoʻokahi ma kahi ala hiki ke hoʻopaʻa ʻia. He maʻalahi ke hoʻohālike i ke kūlana
    ke loaʻa ʻole kekahi o nā lawelawe.

keakea

He ʻokoʻa ke ala hoʻonohonoho hoʻonohonoho i hui ʻia mai ka hoʻonohonoho "maʻamau" a ʻaʻole kūpono ia i nā pono āpau. Eia kekahi mau hemahema o ka config i houluuluia:

  1. Hoʻonohonoho paʻa. ʻAʻole kūpono paha ia no nā noi āpau. I kekahi mau hihia, pono e hoʻoponopono koke i ka hoʻonohonoho ʻana i ka hana ʻana me ka pale ʻana i nā hana palekana āpau. ʻOi aku ka paʻakikī o kēia ala. Pono ka hui ʻana a me ka hoʻonohonoho hou ʻana ma hope o ka hoʻololi ʻana i ka hoʻonohonoho. ʻO kēia ka hiʻohiʻona a me ke kaumaha.
  2. Hanana hoʻonohonoho. Ke hoʻokumu ʻia ka config e kekahi mea hana automation e pono ai kēia ala i ka hoʻopili ʻana ma hope (ʻo ia ka mea e hāʻule ai). Pono paha e hoʻoikaika hou e hoʻohui i kēia ʻanuʻu hou i loko o ka ʻōnaehana kūkulu.
  3. Nā mea kani. Nui nā mea hana i hoʻohana ʻia i kēia lā e hilinaʻi nei i nā configs-based text. ʻO kekahi o lākou
    ʻAʻole e pili i ka wā i hui ʻia ai ka hoʻonohonoho.
  4. Pono ka hoʻololi i ka manaʻo. Ua kamaʻāina nā mea hoʻomohala a me nā DevOps i nā faila hoʻonohonoho kikokikona. He ʻano ʻē paha ka manaʻo o ka hoʻonohonoho ʻana iā lākou.
  5. Ma mua o ka hoʻokomo ʻana i ka hoʻonohonoho compilable, pono ke kaʻina hana hoʻomohala polokalamu kiʻekiʻe.

Aia kekahi mau palena o ka laʻana i hoʻokō ʻia:

  1. Inā hāʻawi mākou i kahi hoʻonohonoho hou i koi ʻole ʻia e ka hoʻokō node, ʻaʻole kōkua ka compiler iā mākou e ʻike i ka hoʻokō ʻole. Hiki ke hoʻoponopono ʻia kēia me ka hoʻohana ʻana HList a i ʻole ADT (nā papa hihia) no ka hoʻonohonoho node ma kahi o nā hiʻohiʻona a me ka Cake Pattern.
  2. Pono mākou e hāʻawi i kahi boilerplate i ka faila config: (package, import, object nā ʻōlelo hoʻolaha;
    override def's no nā palena i loa'a nā waiwai pa'amau). Hiki ke hoʻoponopono ʻia kēia me ka hoʻohana ʻana i kahi DSL.
  3. Ma kēia pou ʻaʻole mākou e uhi i ka hoʻonohonoho hou ʻana o nā pūʻulu o nā nodes like.

Panina

Ma kēia pou ua kūkākūkā mākou i ka manaʻo o ka hōʻike ʻana i ka hoʻonohonoho pololei i ka code kumu ma kahi ʻano palekana. Hiki ke hoʻohana ʻia ke ala i nā noi he nui i mea pani i xml- a me nā hoʻonohonoho kikokikona ʻē aʻe. ʻOiai ua hoʻokō ʻia kā mākou hiʻohiʻona ma Scala, hiki ke unuhi ʻia i nā ʻōlelo compilable ʻē aʻe (e like me Kotlin, C#, Swift, etc.). Hiki i kekahi ke ho'āʻo i kēia ala ma kahi papahana hou, a inā ʻaʻole kūpono, e hoʻololi i ke ala kahiko.

ʻOiaʻiʻo, pono ka hoʻonohonoho compilable i ke kaʻina hoʻomohala kiʻekiʻe. I ka hoʻihoʻi ʻana, hoʻohiki ʻo ia e hāʻawi i ka hoʻonohonoho paʻa kiʻekiʻe like.

Hiki ke hoʻonui ʻia kēia ala ma nā ʻano like ʻole:

  1. Hiki i kekahi ke hoʻohana i nā macros e hana i ka hōʻoia hoʻonohonoho ʻana a hāʻule i ka manawa hōʻuluʻulu inā loaʻa ʻole nā ​​​​palena ʻoihana-logic.
  2. Hiki ke hoʻokō ʻia kahi DSL e hōʻike i ka hoʻonohonoho ʻana ma kahi ʻano domain-user-friendly.
  3. Hoʻokele waiwai ikaika me nā hoʻoponopono hoʻonohonoho ʻakomi. No ka laʻana, ke hoʻololi mākou i ka helu o nā pūnana puʻupuʻu e makemake paha mākou (1) e loaʻa i nā nodes ka hoʻonohonoho hoʻololi iki; (2) ka luna hui e loaʻa i ka ʻike nodes hou.

Mahalo

Makemake wau e mahalo iā Andrey Saksonov, Pavel Popov, Anton Nehaev no ka hāʻawi ʻana i nā manaʻo hoʻoikaika i ke kiʻi o kēia pou i kōkua iaʻu e hoʻomaopopo.

Source: www.habr.com