Nhazi Sistemu Ekesara achịkọtara

Ọ ga-amasị m ịgwa gị otu usoro na-adọrọ mmasị maka ịrụ ọrụ na nhazi nke usoro kesara. A na-anọchi anya nhazi ahụ ozugbo n'asụsụ achịkọtara (Scala) site na iji ụdị nchekwa. Nbipute a na-enye ihe atụ nke nhazi dị otú ahụ ma na-atụle akụkụ dị iche iche nke imejuputa nhazi nhazi n'ime usoro mmepe n'ozuzu ya.

Nhazi Sistemu Ekesara achịkọtara

(bekee)

Okwu Mmalite

Iwulite usoro nkesa nke a pụrụ ịdabere na ya pụtara na ọnụ ọnụ niile na-eji nhazi ziri ezi, mekọrịta ya na ọnụ ndị ọzọ. A na-ejikarị teknụzụ DevOps (terraform, ihe nwere ike ime ma ọ bụ ihe yiri nke ahụ) iji mepụta faịlụ nhazi na-akpaghị aka (nke a kapịrị ọnụ maka ọnụ ọ bụla). Ọ ga-amasịkwa anyị ijide n'aka na ọnụ ụzọ niile na-ekwurịta okwu na-eji ụkpụrụ ndị yiri ya (gụnyere otu ụdị). Ma ọ bụghị ya, a ga-ewulite enweghị nkwekọrịta n'ime usoro nkesa anyị. Na ụwa JVM, otu ihe ga-esi na nke a pụta bụ na a ga-ejirịrị otu ụdị ọba akwụkwọ nwere ozi protocol ebe niile.

Kedu maka ịnwale usoro kesara? N'ezie, anyị na-eche na ihe niile mejupụtara nwere unit ule tupu anyị aga n'ihu na mwekota ule. (Ka anyị wee wepụta rịzọlt ule na oge ojiri gaa, anyị ga-ewetakwa otu ọba akwụkwọ n'oge ule yana n'oge ọsọ.)

Mgbe ị na-arụ ọrụ na ule ntinye, ọ na-adịkarị mfe iji otu ụzọ klaasị ebe niile na ọnụ ụzọ niile. Naanị ihe anyị ga-eme bụ ịhụ na a na-eji otu ụzọ klaasị n'oge ọsọ. (Ọ bụ ezie na ọ ga-ekwe omume kpamkpam ịgba ọsọ dị iche iche na ụzọ klas dị iche iche, nke a na-agbakwụnye mgbagwoju anya na nhazi zuru oke na ihe isi ike na ntinye aka na nyocha nke ntinye.) Maka ebumnuche nke post a, anyị na-eche na ọnụ ọgụgụ niile ga-eji otu klas ahụ.

Nhazi ahụ na-amalite na ngwa ahụ. Anyị na-eji nsụgharị iji chọpụta ọkwa dị iche iche nke evolushọn mmemme. Ọ dị ka ihe ezi uche dị na ya iji chọpụta ụdị nhazi dị iche iche. Ma tinye nhazi ahụ n'onwe ya na sistemụ njikwa ụdị. Ọ bụrụ na e nwere naanị otu nhazi na mmepụta, mgbe ahụ anyị nwere ike iji nọmba mbipute naanị. Ọ bụrụ na anyị na-eji ọtụtụ ihe atụ mmepụta, mgbe ahụ, anyị ga-achọ ọtụtụ
ngalaba nhazi na akara mgbakwunye na mgbakwunye na ụdị (dịka ọmụmaatụ, aha ngalaba). N'ụzọ dị otú a, anyị nwere ike ịmata nke ọma nhazi nhazi. Ihe nchọpụta nhazi ọ bụla dabara na nchikota nke ọnụ ụzọ ekesa, ọdụ ụgbọ mmiri, akụrụngwa mpụga, na ụdị ọba akwụkwọ. Maka ebumnuche nke post a, anyị ga-eche na ọ bụ naanị otu alaka ụlọ ọrụ ma anyị nwere ike ịchọpụta nhazi ahụ n'ụzọ a na-emekarị site na iji nọmba atọ kewara site na ntụpọ (1.2.3).

Na gburugburu ọgbara ọhụrụ, faịlụ nhazi adịkarịghị ejiri aka mepụta. Ọtụtụ mgbe, a na-emepụta ha n'oge mbugharị ma anaghị emetụ ya aka (ya mere agbajila ihe ọ bụla). Ajụjụ sitere n'okike na-ebilite: gịnị kpatara anyị ka ji eji usoro ederede chekwaa nhazi? Nhọrọ ọzọ dị mma dị ka ikike iji koodu oge niile maka nhazi yana rite uru na nyocha oge nchịkọta.

Na nke a post anyị ga-enyocha echiche nke na-anọchi anya a nhazi n'ime a chịkọtara artifact.

Nhazi agbakọtara

Akụkụ a na-enye ihe atụ nke nhazi chịkọtara static. A na-emejuputa ọrụ abụọ dị mfe - ọrụ echo na onye ahịa ọrụ echo. Dabere na ọrụ abụọ a, a na-achịkọta nhọrọ abụọ nke usoro. N'otu nhọrọ, ọrụ abụọ ahụ dị n'otu ọnụ ọnụ, na nhọrọ ọzọ - na ọnụ ụzọ dị iche iche.

Sistemu na-ekesa nwere ọtụtụ ọnụ. Ị nwere ike ịchọpụta ọnụ ọnụ site na iji ụkpụrụ nke ụfọdụ ụdị NodeId:

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

ma ọ bụ

case class NodeId(hostName: String)

ma ọ bụ ọbụna

object Singleton
type NodeId = Singleton.type

Nodes na-arụ ọrụ dị iche iche, ha na-arụ ọrụ na TCP/HTTP njikọ nwere ike guzobe n'etiti ha.

Iji kọwaa njikọ TCP anyị chọrọ opekata mpe nọmba ọdụ ụgbọ mmiri. Ọ ga-amasịkwa anyị ịtụgharị uche na protocol akwadoro n'ọdụ ụgbọ mmiri ahụ iji hụ na ma onye ahịa na ihe nkesa na-eji otu ụkpụrụ. Anyị ga-akọwa njikọ ahụ site na iji klas ndị a:

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

ebe Port - naanị integer Int na-egosi oke nke ụkpụrụ anabatara:

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

Ụdị nụchara anụcha

Lee ụlọ akwụkwọ nụchara и m akụkọ. Na nkenke, ọbá akwụkwọ ahụ na-enye gị ohere itinye ihe mgbochi na ụdị ndị a na-enyocha n'oge nchịkọta. N'okwu a, ọnụọgụ nọmba ọdụ ụgbọ mmiri bara uru bụ ọnụọgụ 16-bit. Maka nhazi agbakọtara, iji ọbá akwụkwọ a nụchara anụcha abụghị iwu, mana ọ na-eme ka onye nchịkọta nwere ike ịlele nhazi ahụ.

Maka protocol HTTP (REST), na mgbakwunye na nọmba ọdụ ụgbọ mmiri, anyị nwekwara ike ịchọ ụzọ ọrụ ahụ:

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

Ụdị egwu

Iji mata protocol n'oge a na-achịkọta, anyị na-eji ụdị paramita anaghị eji n'ime klaasị. Mkpebi a bụ n'ihi na anyị anaghị eji ihe atụ protocol eme ihe n'oge a na-agba ọsọ, mana anyị ga-achọ ka onye nchịkọta ahụ lelee ndakọrịta protocol. Site na ịkọwapụta protocol, anyị agaghị enwe ike ịfefe ọrụ na-ekwesịghị ekwesị dịka ndabere.

Otu n'ime protocol a na-ahụkarị bụ REST API nwere usoro nke Json:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

ebe RequestMessage - ụdị arịrịọ, ResponseMessage - ụdị nzaghachi.
N'ezie, anyị nwere ike iji nkọwa protocol ndị ọzọ na-enye nkọwa ziri ezi nke anyị chọrọ.

Maka ebumnuche nke post a, anyị ga-eji ụdị protocol dị mfe:

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

Ebe a arịrịọ bụ eriri agbakwunyere na url na nzaghachi bụ eriri eweghachiri n'ime ahụ nzaghachi HTTP.

A kọwara nhazi ọrụ site na aha ọrụ, ọdụ ụgbọ mmiri, na ndabere. Enwere ike ịnọchite anya ihe ndị a na Scala n'ọtụtụ ụzọ (dịka ọmụmaatụ, HList-s, ụdị data algebra). Maka ebumnuche nke post a, anyị ga-eji usoro achicha ma na-anọchi anya modul na-eji trait'ov. (The Cake Pattern abụghị ihe achọrọ maka usoro a. Ọ bụ naanị otu mmejuputa ya nwere ike ime.)

Enwere ike ịnọchite anya ndabere n'etiti ọrụ dịka ụzọ na-eweghachi ọdụ ụgbọ mmiri EndPointnke nodes ndị ọzọ:

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

Iji mepụta ọrụ echo, naanị ihe ị chọrọ bụ nọmba ọdụ ụgbọ mmiri yana ihe na-egosi na ọdụ ụgbọ mmiri na-akwado protocol echo. Anyị nwere ike ghara ịkọwapụta otu ọdụ ụgbọ mmiri, n'ihi na... àgwà na-enye gị ohere ikwupụta usoro na-enweghị mmejuputa (ụzọ abstract). N'okwu a, mgbe ị na-emepụta nhazi ihe nhazi, onye nchịkọta ga-achọ ka anyị nye mmejuputa usoro nke abstract ma nye nọmba ọdụ ụgbọ mmiri. Ebe ọ bụ na anyị etinyela usoro ahụ, mgbe ị na-emepụta nhazi nhazi, anyị nwere ike ọ gaghị akọwapụta ọdụ ụgbọ mmiri dị iche. A ga-eji uru ndabara mee ihe.

Na nhazi ndị ahịa anyị na-ekwupụta ndabere na ọrụ echo:

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

Ndabere bụ otu ụdị ọrụ ebupụrụ echoService. Karịsịa, na echo ahịa anyị chọrọ otu protocol. Ya mere, mgbe ị na-ejikọta ọrụ abụọ, anyị nwere ike ijide n'aka na ihe niile ga-arụ ọrụ nke ọma.

Mmejuputa ọrụ

Achọrọ otu ọrụ iji malite na kwụsị ọrụ ahụ. (Ikike ịkwụsị ọrụ ahụ dị oke mkpa maka ịnwale.) Ọzọ, enwere ọtụtụ nhọrọ maka imejuputa ihe dị otú ahụ (dịka ọmụmaatụ, anyị nwere ike iji ụdị klas dabere na ụdị nhazi). Maka ebumnuche nke post a, anyị ga-eji usoro achicha. Anyị ga-anọchi anya ọrụ site na iji klas cats.Resource, n'ihi na Klas a enyelarị ụzọ iji kwe nkwa ntọhapụ akụrụngwa ma ọ bụrụ na enwere nsogbu. Iji nweta akụrụngwa, anyị kwesịrị ịnye nhazi na nhazi oge agbaziri agbaziri. Ọrụ mmalite ọrụ nwere ike ịdị ka nke a:

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

ebe

  • Config - ụdị nhazi maka ọrụ a
  • AddressResolver - ihe na-agba ọsọ na-enye gị ohere ịchọpụta adreesị nke ọnụ ndị ọzọ (lee n'okpuru)

na ụdị ndị ọzọ si n'ọbá akwụkwọ cats:

  • F[_] - ụdị mmetụta (na nke kachasị mfe F[A] nwere ike ịbụ naanị ọrụ () => A. Na nke a post anyị ga-eji cats.IO.)
  • Reader[A,B] - karịa ma ọ bụ karịa na ọrụ A => B
  • cats.Resource - ihe onwunwe nke enwere ike nweta ma hapụ ya
  • Timer - ngụ oge (na-enye gị ohere ịrahụ ụra nwa oge wee tụọ ogologo oge)
  • ContextShift - analog ExecutionContext
  • Applicative - klas ụdị mmetụta na-enye gị ohere ijikọta mmetụta nke onwe (ihe fọrọ nke nta ka ọ bụrụ monad). N'ime ngwa ndị dị mgbagwoju anya ọ dị ka ọ ka mma iji Monad/ConcurrentEffect.

Iji mbinye aka ọrụ a anyị nwere ike mejuputa ọtụtụ ọrụ. Dịka ọmụmaatụ, ọrụ na-adịghị eme ihe ọ bụla:

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

(Lee isi mmalite, nke a na-arụ ọrụ ndị ọzọ - ọrụ mgbakwasa, nkwughachi ahịa
и ndị na-achịkwa ndụ oge niile.)

Ọnụ bụ ihe nwere ike ịmalite ọtụtụ ọrụ (usoro achicha na-eme ka mmalite nke usoro ihe onwunwe sie ike):

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

Biko mara na anyị na-akọwapụta ụdị nhazi nke achọrọ maka ọnụ ọnụ a. Ọ bụrụ na anyị echefuru ịkọwapụta otu n'ime ụdị nhazi nke otu ọrụ chọrọ, a ga-enwe njehie nchịkọta. Ọzọkwa, anyị agaghị enwe ike ịmalite oghere ọ gwụla ma anyị nyere ụfọdụ ihe ụdị kwesịrị ekwesị na data niile dị mkpa.

Mkpebi Aha nnabata

Iji jikọọ na onye ọbịa dịpụrụ adịpụ, anyị chọrọ ezigbo adreesị IP. Ọ ga-ekwe omume na adreesị ahụ ga-amata mgbe e mesịrị karịa nhazi ndị ọzọ. Yabụ na anyị chọrọ ọrụ na-edepụta ID ọnụ na adreesị:

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

Enwere ụzọ dị iche iche isi mejuputa ọrụ a:

  1. Ọ bụrụ na anyị amaara adreesị ndị ahụ tupu ebuga anyị, mgbe ahụ anyị nwere ike iji koodu Scala mepụta
    adreesị wee mee ihe wuo. Nke a ga-achịkọta ma mee ule.
    N'okwu a, a ga-amata ọrụ ahụ nke ọma ma nwee ike ịnọchite anya na koodu dị ka nkewa Map[NodeId, NodeAddress].
  2. N'ọnọdụ ụfọdụ, a na-amata adreesị ahụ n'ezie mgbe ọnụ ụzọ malitechara.
    N'okwu a, anyị nwere ike mejuputa "ọrụ nchọpụta" nke na-aga n'ihu ọnụ ụzọ ndị ọzọ na ọnụ ọgụgụ niile ga-edebanye aha na ọrụ a ma rịọ adreesị nke ọnụ ụzọ ndị ọzọ.
  3. Ọ bụrụ na anyị nwere ike gbanwee /etc/hosts, mgbe ahụ ị nwere ike iji aha nnabata eburu ụzọ kọwaa (dịka my-project-main-node и echo-backend) ma jikọta aha ndị a naanị
    na adreesị IP n'oge ntinye.

Na post a, anyị agaghị atụle ikpe ndị a n'ụzọ zuru ezu karị. Maka anyị
N'ihe atụ egwuregwu ụmụaka, ọnụ ụzọ niile ga-enwe otu adreesị IP - 127.0.0.1.

Ọzọ, anyị na-atụle nhọrọ abụọ maka usoro ekesa:

  1. Ịtụkwasị ọrụ niile n'otu ọnụ.
  2. Na nnabata ọrụ echo na onye ahịa echo na ọnụ dị iche iche.

Nhazi maka otu ọnụ:

Otu nhazi ọnụ ọnụ

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

Ihe na-arụ ọrụ nhazi nke ma onye ahịa na ihe nkesa. A na-ejikwa nhazi oge na-adị ndụ nke mere na mgbe etiti oge gasịrị lifetime kwụsị mmemme. (Ctrl-C na-arụkwa ọrụ ma na-ahapụ akụrụngwa niile nke ọma.)

Enwere ike iji otu nhazi nhazi na njirimara mmejuputa mepụta usoro nke nwere ọnụ ụzọ abụọ dị iche iche:

Nhazi ọnụ abụọ

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

Ihe dị mkpa! Rịba ama ka ejikọrọ ọrụ ndị a. Anyị na-akọwapụta ọrụ nke otu ọnụ mebere dị ka mmejuputa usoro ndabere ọnụ ọzọ. A na-enyocha ụdị ịdabere na onye nchịkọta, n'ihi na nwere ụdị protocol. Mgbe a na-agba ọsọ, ndabere ahụ ga-enwe NJ ọnụ ụzọ ziri ezi. N'ihi atụmatụ a, anyị na-akọwapụta nọmba ọdụ ụgbọ mmiri kpọmkwem otu ugboro ma na-ekwe nkwa mgbe niile na-ezo aka na ọdụ ụgbọ mmiri ziri ezi.

Mmejuputa usoro ọnụ ụzọ abụọ

Maka nhazi a, anyị na-eji otu mmejuputa ọrụ na-enweghị mgbanwe. Naanị ihe dị iche bụ na anyị nwere ihe abụọ na-emejuputa ụdị ọrụ dị iche iche:

  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
  }

Ọnụ ụzọ nke mbụ na-emejuputa ihe nkesa na-achọ naanị nhazi nkesa. Ọnụ ụzọ nke abụọ na-arụ ọrụ onye ahịa ma jiri akụkụ dị iche iche nke nhazi ahụ. Ọzọkwa ọnụ abụọ chọrọ njikwa oge ndụ. Ọnụ ihe nkesa na-agba ọsọ ruo mgbe akwụsịre ya SIGTERM'om, na ọnụ ahịa ndị ahịa kwụsị mgbe oge ụfọdụ gasịrị. Cm. ngwa mmalite.

Usoro mmepe n'ozuzu

Ka anyị hụ ka usoro nhazi a si emetụta usoro mmepe n'ozuzu ya.

A ga-achịkọta nhazi ahụ yana koodu ndị ọzọ ma mepụta artifact (.jar). O yiri ka ọ bụ ihe ezi uche dị na ya itinye nhazi ahụ na arịa dị iche iche. Nke a bụ n'ihi na anyị nwere ike inwe ọtụtụ nhazi dabere na otu koodu ahụ. Ọzọ, ọ ga-ekwe omume ịmepụta ihe ndị kwekọrọ na alaka nhazi dị iche iche. A na-echekwa ndabere na ụdị ọba akwụkwọ akọwapụtara yana nhazi ahụ, a na-echekwa nsụgharị ndị a ruo mgbe ebighị ebi mgbe ọ bụla anyị kpebiri ibuga ụdị nhazi ahụ.

Ngbanwe nhazi ọ bụla na-atụgharị ghọọ mgbanwe koodu. Ya mere, onye ọ bụla
A ga-ekpuchi mgbanwe ahụ site na usoro mmesi obi ike nkịtị:

Tiketi n'ime ihe nchọta ahụhụ -> PR -> nyochaa -> jikọta ya na alaka ndị dị mkpa ->
ntinye -> ntinye

Isi ihe ga-esi n'imejuputa nhazi a chịkọtara bụ:

  1. Nhazi ahụ ga-agbanwe agbanwe n'ofe ọnụ niile nke usoro ekesa. N'ihi na eziokwu na ọnụ niile na-enweta otu nhazi site na otu isi iyi.

  2. Ọ bụ nsogbu ịgbanwe nhazi na naanị otu ọnụ. Ya mere, "nhazi drift" bụ eleghi anya.

  3. Ọ na-esiwanye ike ime obere mgbanwe na nhazi ahụ.

  4. Ọtụtụ mgbanwe nhazi ga-eme dịka akụkụ nke usoro mmepe n'ozuzu ma a ga-enyocha ya.

Achọrọ m ebe nchekwa dị iche iche iji chekwaa nhazi mmepụta? Nhazi a nwere ike ịnwe okwuntughe na ozi ndị ọzọ nwere mmetụta nke anyị ga-achọ igbochi ịnweta. Dabere na nke a, o yiri ka ọ bụ ihe ezi uche dị na ịchekwa nhazi ikpeazụ na ebe nchekwa dị iche. Ị nwere ike kewaa nhazi ahụ ụzọ abụọ-otu nwere ntọala nhazi nke ọha na eze na nke nwere ntọala amachibidoro. Nke a ga-enye ọtụtụ ndị mmepe ohere ịnweta ntọala nkịtị. Nkewa a dị mfe iji nweta njirimara etiti nwere ụkpụrụ ndabara.

Ọdịiche enwere ike

Ka anyị nwaa itule nhazi a chịkọtara na ụfọdụ ụzọ ọzọ a na-ahụkarị:

  1. Faịlụ ederede na igwe ebumnuche.
  2. Ụlọ ahịa igodo ọnụ ahịa etiti (etcd/zookeeper).
  3. Usoro ihe ndị nwere ike ịhazigharị / malitegharịa na-enweghị ịmalitegharị usoro ahụ.
  4. Na-echekwa nhazi na-abụghị nke artifact na njikwa ụdị.

Faịlụ ederede na-enye mgbanwe dị ukwuu n'ihe gbasara obere mgbanwe. Onye nchịkwa sistemụ nwere ike ịbanye n'ime oghere dịpụrụ adịpụ, mee mgbanwe na faịlụ ndị kwesịrị ekwesị wee malitegharịa ọrụ ahụ. Maka nnukwu usoro, Otú ọ dị, mgbanwe dị otú ahụ nwere ike ọ gaghị adị mma. Mgbanwe ndị a na-ahapụ enweghị akara na sistemụ ndị ọzọ. Ọ dịghị onye na-enyocha mgbanwe ndị ahụ. O siri ike ịmata onye mere mgbanwe ahụ kpọmkwem na ihe kpatara ya. A naghị anwale mgbanwe. Ọ bụrụ na ekesa usoro ahụ, mgbe ahụ, onye nchịkwa nwere ike ichefu ime mgbanwe kwekọrọ na ọnụ ndị ọzọ.

(O kwesịkwara ịmara na iji nhazi nhazi anaghị emechi ohere nke iji faịlụ ederede n'ọdịnihu. Ọ ga-ezuru ịgbakwunye parser na validator nke na-emepụta otu ụdị dị ka mmepụta. Config, ma ị nwere ike iji faịlụ ederede. Ọ na-esote ozugbo na mgbagwoju anya nke usoro nwere nhazi nhazi dị ntakịrị karịa mgbagwoju anya nke usoro na-eji faịlụ ederede, n'ihi na faịlụ ederede chọrọ koodu mgbakwunye.)

Ụlọ ahịa igodo ọnụ ahịa etiti bụ ezigbo usoro maka ikesa meta parameters nke ngwa ekesara. Anyị kwesịrị ikpebi ihe nhazi nhazi na ihe bụ naanị data. Ka anyị nwee ọrụ C => A => B, na paramita C adịkarịghị mgbanwe, na data A - ọtụtụ mgbe. N'okwu a, anyị nwere ike ikwu nke ahụ C - paramita nhazi, na A - data. Ọ dị ka nhazi nhazi dị iche na data n'ihi na ha na-agbanwekarị obere ugboro karịa data. Ọzọkwa, data na-abịakarị site n'otu ebe (site na onye ọrụ), na nhazi nhazi site na nke ọzọ (site na onye nchịkwa usoro).

Ọ bụrụ na adịkarịghị na-agbanwe parameters mkpa ka emelitere na-enweghị Malitegharịa ekwentị na mmemme, mgbe nke a nwere ike na-eduga na mgbagwoju anya nke mmemme, n'ihi na anyị ga-mkpa n'ụzọ ụfọdụ nyefee parameters, chekwaa, parse na ịlele, na hazie na-ezighị ezi ụkpụrụ. Ya mere, site n'echiche nke ibelata mgbagwoju anya nke mmemme ahụ, ọ bụ ihe ezi uche dị na ya iji belata ọnụọgụ nke nwere ike ịgbanwe n'oge mmemme mmemme (ma ọ bụ na-akwadoghị parampat ndị dị otú ahụ ma ọlị).

Maka ebumnuche nke post a, anyị ga-amata ọdịiche dị n'etiti paramita static na ike. Ọ bụrụ na mgbagha nke ọrụ na-achọ mgbanwe parampat n'oge ọrụ nke mmemme, mgbe ahụ, anyị ga-akpọ ndị dị otú ahụ parameters ike. Ma ọ bụghị ya, nhọrọ ndị ahụ kwụ ọtọ ma nwee ike ịhazi ya site na iji nhazi chịkọtara. Maka nhazigharị ike dị ike, anyị nwere ike ịchọ usoro iji malitegharịa akụkụ nke mmemme ahụ site na iji paramita ọhụrụ, dịka otu esi malitegharịa usoro sistemụ. (N'echiche anyị, ọ bụ ihe amamihe dị na ya izere nhazigharị oge, ebe ọ bụ na nke a na-abawanye mgbagwoju anya nke usoro ahụ. Ọ bụrụ na ọ ga-ekwe omume, ọ ka mma iji ikike OS ọkọlọtọ maka ịmalitegharị usoro.)

Otu akụkụ dị mkpa nke iji nhazi nhazi nke na-eme ka ndị mmadụ na-atụle nhazigharị ike bụ oge ọ na-ewe maka usoro ahụ ịmaliteghachi mgbe nhazi nhazi (downtime). N'ezie, ọ bụrụ na anyị kwesịrị ime mgbanwe na static nhazi, anyị ga-amalitegharịa usoro maka ọhụrụ ụkpụrụ na-mmetụta. Nsogbu ọdịda oge nwere ike dị iche iche maka usoro dị iche iche. N'ọnọdụ ụfọdụ, ị nwere ike ịhazigharị nrụgharị n'oge mgbe ibu dị ntakịrị. Ọ bụrụ na ịchọrọ ịnye ọrụ na-aga n'ihu, ị nwere ike mejuputa ya Njikọ AWS ELB na-agbaze. N'otu oge ahụ, mgbe anyị kwesịrị ịmalitegharị usoro ahụ, anyị na-amalite usoro ihe atụ nke usoro a, gbanwee ihe nkwụnye ahụ na ya, ma chere ka njikọ ochie mechaa. Mgbe njikọ ochie niile kwụsịrị, anyị na-emechi ihe ochie nke sistemụ.

Ka anyị tụlee ugbu a okwu nke ịchekwa nhazi n'ime ma ọ bụ n'èzí artifact. Ọ bụrụ na anyị na-echekwa nhazi ahụ n'ime ihe eji eme ihe, mgbe ahụ, ọ dịkarịa ala, anyị nwere ohere iji nyochaa nhazi nke nhazi n'oge mgbakọ nke artifact. Ọ bụrụ na nhazi ahụ dị n'èzí ihe a na-achịkwa, ọ na-esiri ike ịchọta onye mere mgbanwe na faịlụ a na ihe kpatara ya. Olee otú o si dị mkpa? N'uche anyị, maka ọtụtụ usoro mmepụta ọ dị mkpa inwe nhazi kwụsiri ike na nke dị elu.

Ụdị ihe eji eme ihe na-enye gị ohere ikpebi mgbe e kere ya, ụkpụrụ ndị dị na ya, olee ọrụ enyere / nkwarụ, na onye na-ahụ maka mgbanwe ọ bụla na nhazi ahụ. N'ezie, ịchekwa nhazi ahụ n'ime ihe eji eme ihe na-achọ mgbalị ụfọdụ, n'ihi ya, ịkwesịrị ịme mkpebi ziri ezi.

Ihe na nkwenye

Ọ ga-amasị m ileba anya na uru na ọghọm nke teknụzụ a chọrọ.

Uru

N'okpuru bụ ndepụta nke njirimara bụ isi nke nhazi sistemu ekesa achịkọtara:

  1. Lelee nhazi nhazi static. Na-enye gị ohere ijide n'aka na
    nhazi ahụ ziri ezi.
  2. Asụsụ nhazi bara ụba. Dịka, ụzọ nhazi ndị ọzọ na-ejedebere na ngbanwe mgbanwe eriri na kacha. Mgbe ị na-eji Scala, ọtụtụ njirimara asụsụ dị iji melite nhazi gị. Dịka ọmụmaatụ anyị nwere ike iji
    àgwà maka ụkpụrụ ndabara, na-eji ihe na otu paramita, anyị nwere ike ịtu aka na vals ekwuputara naanị otu ugboro (DRY) na mpaghara mkpuchi. Ị nwere ike ịmegharị klaasị ọ bụla ozugbo n'ime nhazi ahụ (Seq, Map, klas omenala).
  3. DSL. Scala nwere ọtụtụ njirimara asụsụ na-eme ka ọ dịrị mfe ịmepụta DSL. Ọ ga-ekwe omume iji atụmatụ ndị a mee ihe ma mejuputa asụsụ nhazi nke dị mfe maka ndị ọrụ ndị a na-achọsi ike, nke mere na nhazi ahụ bụ ma ọ dịkarịa ala ndị ọkachamara ngalaba na-agụ ya. Ndị ọkachamara nwere ike, dịka ọmụmaatụ, sonye na usoro nyocha nhazi.
  4. Iguzosi ike n'ezi ihe na mmekọrịta n'etiti ọnụ. Otu n'ime uru dị n'inwe nhazi nke usoro kesara dum echekwara n'otu ebe bụ na a na-ekwupụta ụkpụrụ niile otu ugboro wee jirikwa ya mee ihe n'ebe ọ bụla achọrọ. Iji ụdị phantom ikwuwapụta ọdụ ụgbọ mmiri na-achọpụta na ọnụ na-eji protocol dakọtara na nhazi sistemụ niile ziri ezi. Inwe ihe ndabere amanyere ama ama ama ama ama n'etiti ọnụ na-eme ka a mata na ejikọrọ ọrụ niile.
  5. Mgbanwe dị elu. Ime mgbanwe na nhazi site na iji usoro mmepe nkịtị na-eme ka o kwe omume iji nweta ụkpụrụ dị elu maka nhazi ahụ.
  6. Mmelite nhazi otu oge. Nkwanye sistemu akpaaka ka mgbanwe nhazi gachara hụ na emelitere ọnụ niile.
  7. Na-eme ka ngwa ahụ dị mfe. Ngwa ahụ achọghị nyocha, nyocha nhazi, ma ọ bụ ijikwa ụkpụrụ ezighi ezi. Nke a na-ebelata mgbagwoju anya nke ngwa ahụ. (Ụfọdụ n'ime mgbagwoju mgbagwoju anya nke a na-ahụ na ihe atụ anyị abụghị àgwà nke nhazi a chịkọtara, ma ọ bụ naanị mkpebi siri ike nke ọchịchọ nke ịnye ụdị nchekwa dị ukwuu.) Ọ dị mfe ịlaghachi na nhazi nke mbụ - dị nnọọ mejuputa ihe na-efu. akụkụ. Ya mere, ị nwere ike, dịka ọmụmaatụ, malite na nhazi nhazi, na-atụgharị mmejuputa akụkụ ndị na-adịghị mkpa ruo mgbe ọ dị mkpa n'ezie.
  8. Nhazi egosipụtara. Ebe ọ bụ na mgbanwe nhazi na-agbaso akara aka nke mgbanwe ọ bụla ọzọ, mmepụta anyị na-enweta bụ arịa nwere ụdị pụrụ iche. Nke a na-enye anyị ohere, dịka ọmụmaatụ, ịlaghachi na ụdị nhazi gara aga ma ọ bụrụ na ọ dị mkpa. Anyị nwere ike ọbụna iji nhazi site na otu afọ gara aga na usoro ahụ ga-arụ ọrụ kpọmkwem otu ihe ahụ. Nhazi kwụsiri ike na-eme ka amụma amụma na ntụkwasị obi nke sistemụ kesara. Ebe ọ bụ na a na-edozi nhazi ahụ na nchịkọta nchịkọta, ọ na-esiri ike ịme ya na mmepụta ya.
  9. Modulity. Usoro a na-atụ aro bụ modular na modul nwere ike jikọta n'ụzọ dị iche iche iji mepụta usoro dị iche iche. Karịsịa, ị nwere ike ịhazi usoro ahụ ka ọ na-agba ọsọ n'otu ọnụ ọnụ n'otu akụkụ, yana n'ọtụtụ ọnụ na nke ọzọ. Ị nwere ike ịmepụta ọtụtụ nhazi maka mmepụta ihe atụ nke usoro.
  10. Nnwale. Site na iji ihe mkparị dochie ọrụ onye ọ bụla, ị nwere ike nweta ọtụtụ ụdị nke sistemụ dabara adaba maka nnwale.
  11. Nnwale njikọta. Inwe otu nhazi maka usoro nkesa niile na-eme ka o kwe omume ịme ihe niile na mpaghara a na-achịkwa dịka akụkụ nke nyocha ntinye. Ọ dị mfe iṅomi, dịka ọmụmaatụ, ọnọdụ ebe oghere ụfọdụ na-enweta.

Ọdịmma na njedebe

Nhazi achịkọtara dị iche na usoro nhazi ndị ọzọ ma nwee ike ọ gaghị adabara maka ngwa ụfọdụ. N'okpuru bụ ụfọdụ ọghọm:

  1. Nhazi static. Mgbe ụfọdụ, ịkwesịrị ịmezi nhazi ngwa ngwa na mmepụta, na-agafe usoro nchebe niile. Site na usoro a, ọ nwere ike isi ike karị. Opekempe, nchịkọta na ntinye akpaaka ka ga-achọrọ. Nke a bụ ma akụkụ bara uru nke ụzọ na ọghọm n'ọnọdụ ụfọdụ.
  2. Ọgbọ nhazi. Ọ bụrụ na ejiri ngwa akpaaka mepụta faịlụ nhazi ahụ, enwere ike ịchọ mgbalị ndị ọzọ iji jikọta edemede ihe nrụpụta.
  3. Ngwa. Ugbu a, akụrụngwa na usoro emebere iji rụọ ọrụ na nhazi dabere na faịlụ ederede. Ọ bụghị ngwa ọrụ/ọrụ niile dị otú ahụ ga-adị na nhazi agbakọtara.
  4. A chọrọ mgbanwe n'omume. Faịlụ ederede amarala ndị nrụpụta na DevOps. Echiche nke ịchịkọta nhazi nwere ike ịbụ ihe a na-atụghị anya ya na nke pụrụ iche ma kpatara ịjụ.
  5. A chọrọ usoro mmepe dị elu. Iji nwee ntụsara ahụ iji nhazi chịkọtara, nhazi zuru oke nke usoro iwu na itinye ngwa (CI/CD) dị mkpa. Ma ọ bụghị ya, ọ ga-adị nnọọ mfe.

Ka anyị leba anya n'ọtụtụ njedebe nke ihe atụ a tụlere na-emetụtaghị echiche nke nhazi achịkọtara:

  1. Ọ bụrụ na anyị na-enye ozi nhazi na-enweghị isi na-adịghị eji ọnụ, mgbe ahụ, onye nchịkọta agaghị enyere anyị aka ịchọpụta mmejuputa na-efu. Enwere ike idozi nsogbu a site na ịhapụ usoro achicha na iji ụdị ndị siri ike karị, dịka ọmụmaatụ, HList ma ọ bụ ụdị data algebra (klaasị ikpe) iji nọchite anya nhazi.
  2. Enwere ahịrị na faịlụ nhazi na-enweghị njikọ na nhazi n'onwe ya: (package, import, nkwupụta ihe; override def's maka parameters ndị nwere ụkpụrụ ndabara). Enwere ike izere nke a ma ọ bụrụ na i mejuputa DSL nke gị. Na mgbakwunye, ụdị nhazi ndị ọzọ (dịka ọmụmaatụ, XML) na-etinyekwa ihe mgbochi ụfọdụ na nhazi faịlụ.
  3. Maka ebumnuche nke post a, anyị anaghị atụle nhazigharị ike nke ụyọkọ ọnụ ọnụ.

nkwubi

Na post a, anyị nyochara echiche nke na-anọchite anya nhazi na koodu isi site na iji ike dị elu nke ụdị Scala. Enwere ike iji usoro a na ngwa dị iche iche dị ka nnọchi maka usoro nhazi omenala dabere na xml ma ọ bụ faịlụ ederede. N'agbanyeghị na etinyere ihe atụ anyị na Scala, enwere ike ibufe otu echiche ahụ na asụsụ ndị ọzọ achịkọtara (dịka Kotlin, C #, Swift, ...). Ị nwere ike ịnwale ụzọ a n'otu n'ime ọrụ ndị a, ma, ọ bụrụ na ọ naghị arụ ọrụ, gaa na faịlụ ederede, na-agbakwụnye akụkụ ndị na-efu.

Dị ka o kwesịrị ịdị, nhazi chịkọtara chọrọ usoro mmepe dị elu. Na nloghachi, a na-ahụta ọkwa dị elu na ntụkwasị obi nke nhazi.

Enwere ike ịgbasa usoro a tụlere:

  1. Ị nwere ike iji macros mee nlele oge mkpokọta.
  2. Ị nwere ike mejuputa DSL iji gosipụta nhazi ahụ n'ụzọ nwere ike ịnweta ndị ọrụ njedebe.
  3. Ị nwere ike mejuputa njikwa akụrụngwa dị ike na nhazi nhazi akpaaka. Dịka ọmụmaatụ, ịgbanwe ọnụọgụ ọnụ na ụyọkọ chọrọ ka (1) ọnụ nke ọ bụla nweta nhazi dịtụ iche; (2) onye njikwa ụyọkọ natara ozi gbasara ọnụ ọnụ ọhụrụ.

Nkwenye

Ọ ga-amasị m ikele Andrei Saksonov, Pavel Popov na Anton Nekhaev maka nkatọ ha na-ewuli elu nke isiokwu a.

isi: www.habr.com

Tinye a comment