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.
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
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
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 EndPoint
nā 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 lawelaweAddressResolver
- 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ʻalahiF[A]
hiki ke lilo i hana() => A
. Ma kēia pou e hoʻohana mākoucats.IO
.)Reader[A,B]
- ʻoi aku a liʻiliʻi paha me ka hanaA => B
cats.Resource
- he kumuwaiwai hiki ke loaʻa a hoʻokuʻuTimer
- ka manawa (ʻae iā ʻoe e hiamoe no kekahi manawa a ana i nā manawa manawa)ContextShift
- analogExecutionContext
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 ʻanaMonad
/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.
и
ʻ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:
- 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 ʻāinaMap[NodeId, NodeAddress]
. - 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. - 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 (likemy-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:
- Ke kau nei i nā lawelawe a pau ma kahi node.
- 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
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 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.
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:
-
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.
-
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".
-
ʻOi aku ka paʻakikī e hana i nā hoʻololi liʻiliʻi i ka hoʻonohonoho.
-
ʻ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:
- Waihona kikokikona ma ka mīkini ʻimi.
- Hale kūʻai waiwai kī waena (
etcd
/zookeeper
). - Kaʻina hana i hiki ke hoʻonohonoho hou / hoʻomaka hou me ka hoʻomaka ʻole i ke kaʻina hana.
- 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ō
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:
- Nānā hoʻonohonoho paʻa. ʻAe iā ʻoe e hōʻoia i kēlā
pololei ka hoʻonohonoho. - ʻŌ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). - 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.
- ʻ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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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:
- 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.
- 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.
- 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.
- 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.
- 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:
- 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. - 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. - 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:
- Hiki iā ʻoe ke hoʻohana i nā macros e hana i nā hōʻoia manawa hoʻonohonoho.
- 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.
- 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