Iṣeto ni pinpin kaakiri System

Emi yoo fẹ lati so fun o ọkan awon siseto fun ṣiṣẹ pẹlu awọn iṣeto ni ti a pin eto. Iṣeto ni ipoduduro taara ni ede ti o ṣajọ (Scala) ni lilo awọn iru ailewu. Ifiweranṣẹ yii n pese apẹẹrẹ ti iru atunto kan ati jiroro lori ọpọlọpọ awọn aaye ti imuse iṣeto ni akojọpọ sinu ilana idagbasoke gbogbogbo.

Iṣeto ni pinpin kaakiri System

(ede Gẹẹsi)

Ifihan

Ṣiṣe eto pinpin ti o ni igbẹkẹle tumọ si pe gbogbo awọn apa lo iṣeto to pe, muṣiṣẹpọ pẹlu awọn apa miiran. Awọn imọ-ẹrọ DevOps (terraform, ansible tabi nkan bii iyẹn) ni a maa n lo lati ṣe ina awọn faili atunto laifọwọyi (nigbagbogbo ni pato fun ipade kọọkan). A tun fẹ lati ni idaniloju pe gbogbo awọn apa ibaraẹnisọrọ nlo awọn ilana kanna (pẹlu ẹya kanna). Bibẹẹkọ, aiṣedeede yoo kọ sinu eto pinpin wa. Ni agbaye JVM, abajade kan ti ibeere yii ni pe ẹya kanna ti ile-ikawe ti o ni awọn ifiranṣẹ ilana gbọdọ ṣee lo nibi gbogbo.

Kini nipa idanwo eto pinpin kan? Nitoribẹẹ, a ro pe gbogbo awọn paati ni awọn idanwo ẹyọkan ṣaaju ki a lọ si idanwo iṣọpọ. (Ni ibere fun wa lati ṣe afikun awọn abajade idanwo si akoko asiko, a tun gbọdọ pese akojọpọ awọn ile-ikawe kanna ni ipele idanwo ati ni akoko asiko.)

Nigbati o ba n ṣiṣẹ pẹlu awọn idanwo isọpọ, o rọrun nigbagbogbo lati lo ọna kilasi kanna nibi gbogbo lori gbogbo awọn apa. Gbogbo ohun ti a ni lati ṣe ni rii daju pe ọna kilasi kanna ni a lo ni akoko asiko. (Lakoko ti o ṣee ṣe patapata lati ṣiṣe awọn apa oriṣiriṣi pẹlu awọn ọna ikasi oriṣiriṣi, eyi ṣe afikun idiju si iṣeto gbogbogbo ati awọn iṣoro pẹlu imuṣiṣẹ ati awọn idanwo isọpọ.) Fun awọn idi ti ifiweranṣẹ yii, a ro pe gbogbo awọn apa yoo lo ọna kilasi kanna.

Iṣeto ni idagbasoke pẹlu ohun elo. A lo awọn ẹya lati ṣe idanimọ awọn ipele oriṣiriṣi ti itankalẹ eto. O dabi mogbonwa lati tun da o yatọ si awọn ẹya ti awọn atunto. Ati ki o gbe iṣeto ni ara rẹ ni eto iṣakoso ẹya. Ti iṣeto kan ba wa ni iṣelọpọ, lẹhinna a le lo nọmba ẹya nirọrun. Ti a ba lo ọpọlọpọ awọn iṣẹlẹ iṣelọpọ, lẹhinna a yoo nilo pupọ
awọn ẹka iṣeto ati aami afikun ni afikun si ẹya (fun apẹẹrẹ, orukọ ẹka). Ni ọna yi a le kedere da awọn gangan iṣeto ni. Idanimọ atunto kọọkan ni iyasọtọ ni ibamu si apapo kan pato ti awọn apa ti a pin, awọn ebute oko oju omi, awọn orisun ita, ati awọn ẹya ikawe. Fun awọn idi ti ifiweranṣẹ yii a yoo ro pe ẹka kan nikan wa ati pe a le ṣe idanimọ iṣeto ni ọna deede nipa lilo awọn nọmba mẹta ti a yapa nipasẹ aami kan (1.2.3).

Ni awọn agbegbe ode oni, awọn faili iṣeto ni a ko ṣẹda pẹlu ọwọ. Ni ọpọlọpọ igba wọn jẹ ipilẹṣẹ lakoko imuṣiṣẹ ati pe wọn ko fọwọkan (nibẹẹ maṣe fọ ohunkohun). Ibeere adayeba kan waye: kilode ti a tun lo ọna kika ọrọ lati tọju iṣeto ni? Iyatọ ti o le yanju dabi pe o jẹ agbara lati lo koodu deede fun iṣeto ni ati anfani lati awọn sọwedowo akoko-akojọ.

Ninu ifiweranṣẹ yii a yoo ṣawari imọran ti aṣoju iṣeto ni inu ohun-ọṣọ ti a ṣajọpọ.

Iṣeto ni akojọpọ

Abala yii n pese apẹẹrẹ ti iṣeto akojọpọ aimi. Awọn iṣẹ ti o rọrun meji ni imuse - iṣẹ iwoyi ati alabara iṣẹ iwoyi. Da lori awọn iṣẹ meji wọnyi, awọn aṣayan eto meji ti ṣajọpọ. Ni aṣayan kan, awọn iṣẹ mejeeji wa lori ipade kanna, ni aṣayan miiran - lori awọn apa oriṣiriṣi.

Ni deede eto ti a pin kaakiri ni ọpọlọpọ awọn apa. O le ṣe idanimọ awọn apa nipa lilo awọn iye ti iru kan NodeId:

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

tabi

case class NodeId(hostName: String)

tabi koda

object Singleton
type NodeId = Singleton.type

Awọn apa ṣe awọn ipa oriṣiriṣi, wọn ṣiṣẹ awọn iṣẹ ati awọn asopọ TCP/HTTP le ti fi idi mulẹ laarin wọn.

Lati ṣe apejuwe asopọ TCP a nilo o kere ju nọmba ibudo kan. A tun fẹ lati ṣe afihan ilana ti o ṣe atilẹyin lori ibudo yẹn lati rii daju pe alabara ati olupin n lo ilana kanna. A yoo ṣe apejuwe asopọ ni lilo kilasi atẹle:

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

nibi ti Port - o kan odidi Int n ṣe afihan iwọn awọn iye itẹwọgba:

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

Refaini orisi

Wo ile-ikawe ti refaini и temi iroyin. Ni kukuru, ile-ikawe n gba ọ laaye lati ṣafikun awọn ihamọ si awọn oriṣi ti o ṣayẹwo ni akoko akojọpọ. Ni ọran yii, awọn iye nọmba ibudo to wulo jẹ awọn nọmba 16-bit. Fun iṣeto ni akojọpọ, lilo ile-ikawe ti a tunṣe ko jẹ dandan, ṣugbọn o mu agbara alakojo lati ṣayẹwo iṣeto naa.

Fun awọn ilana HTTP (REST), ni afikun si nọmba ibudo, a tun le nilo ọna si iṣẹ naa:

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

Phantom orisi

Lati ṣe idanimọ ilana ni akoko akopọ, a lo iru paramita kan ti a ko lo laarin kilasi naa. Ipinnu yii jẹ nitori otitọ pe a ko lo apẹẹrẹ ilana ni akoko asiko, ṣugbọn a yoo fẹ ki olupilẹṣẹ lati ṣayẹwo ibamu ilana. Nipa sisọ ilana naa, a kii yoo ni anfani lati kọja iṣẹ ti ko yẹ bi igbẹkẹle kan.

Ọkan ninu awọn ilana ti o wọpọ ni REST API pẹlu serialization Json:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

nibi ti RequestMessage - iru ibeere, ResponseMessage - iru idahun.
Nitoribẹẹ, a le lo awọn apejuwe ilana miiran ti o pese deede ti apejuwe ti a nilo.

Fun awọn idi ti ifiweranṣẹ yii, a yoo lo ẹya ti o rọrun ti ilana naa:

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

Nibi ibeere naa jẹ okun ti a fikun si url ati idahun ni okun ti o pada ninu ara ti idahun HTTP.

Iṣeto iṣẹ naa jẹ apejuwe nipasẹ orukọ iṣẹ, awọn ebute oko oju omi, ati awọn igbẹkẹle. Awọn eroja wọnyi le jẹ aṣoju ni Scala ni awọn ọna pupọ (fun apẹẹrẹ, HList-s, awọn iru data algebra). Fun awọn idi ti ifiweranṣẹ yii, a yoo lo Ilana Akara oyinbo ati aṣoju awọn modulu ni lilo trait'Ov. (The Cake Pattern is not a need element of this approach. O ti wa ni nìkan ọkan ṣee ṣe imuse.)

Awọn igbẹkẹle laarin awọn iṣẹ le jẹ aṣoju bi awọn ọna ti o da awọn ibudo pada EndPointAwọn apa miiran:

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

Lati ṣẹda iṣẹ iwoyi, gbogbo ohun ti o nilo ni nọmba ibudo ati itọkasi pe ibudo naa ṣe atilẹyin ilana iwoyi. A le ma ṣe pato ibudo kan pato, nitori... awọn ami-ara gba ọ laaye lati sọ awọn ọna laisi imuse (awọn ọna afọwọṣe). Ni ọran yii, nigbati o ba ṣẹda atunto nja kan, olupilẹṣẹ yoo nilo ki a pese imuse ti ọna afọwọṣe ati pese nọmba ibudo kan. Niwọn igba ti a ti ṣe imuse ọna naa, nigbati o ba ṣẹda iṣeto kan pato, a le ma ṣe pato ibudo ti o yatọ. Awọn aiyipada iye yoo ṣee lo.

Ninu iṣeto alabara a kede igbẹkẹle kan lori iṣẹ iwoyi:

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

Igbẹkẹle jẹ ti iru kanna bi iṣẹ ti a firanṣẹ si okeere echoService. Ni pataki, ninu alabara iwoyi a nilo ilana kanna. Nitorinaa, nigbati o ba so awọn iṣẹ meji pọ, a le ni idaniloju pe ohun gbogbo yoo ṣiṣẹ ni deede.

Imuse ti awọn iṣẹ

Iṣẹ kan nilo lati bẹrẹ ati da iṣẹ naa duro. (Agbara lati da iṣẹ kan duro jẹ pataki fun idanwo.) Lẹẹkansi, awọn aṣayan pupọ wa fun imuse iru ẹya kan (fun apẹẹrẹ, a le lo awọn kilasi oriṣi ti o da lori iru iṣeto). Fun awọn idi ti ifiweranṣẹ yii a yoo lo Ilana Akara oyinbo. A yoo ṣe aṣoju iṣẹ naa nipa lilo kilasi kan cats.Resource, nitori Kilasi yii ti pese awọn ọna lati ṣe iṣeduro itusilẹ awọn orisun lailewu ni ọran ti awọn iṣoro. Lati gba orisun kan, a nilo lati pese iṣeto ni ati ipo asiko asiko ti o ti ṣetan. Iṣẹ ibẹrẹ iṣẹ le dabi eyi:

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

nibi ti

  • Config - iru iṣeto ni fun iṣẹ yii
  • AddressResolver - ohun akoko asiko ti o fun ọ laaye lati wa awọn adirẹsi ti awọn apa miiran (wo isalẹ)

ati awọn miiran orisi lati ìkàwé cats:

  • F[_] - iru ipa (ninu ọran ti o rọrun julọ F[A] o kan le jẹ iṣẹ kan () => A. Ninu ifiweranṣẹ yii a yoo lo cats.IO.)
  • Reader[A,B] - diẹ ẹ sii tabi kere si bakannaa pẹlu iṣẹ A => B
  • cats.Resource - a oluşewadi ti o le wa ni gba ati ki o tu
  • Timer - aago (gba ọ laaye lati sun fun igba diẹ ati wiwọn awọn aaye arin akoko)
  • ContextShift - afọwọṣe ExecutionContext
  • Applicative - kilasi iru ipa ti o fun ọ laaye lati ṣajọpọ awọn ipa kọọkan (o fẹrẹẹ kan monad). Ni awọn ohun elo eka sii o dabi pe o dara lati lo Monad/ConcurrentEffect.

Lilo ibuwọlu iṣẹ yii a le ṣe awọn iṣẹ lọpọlọpọ. Fun apẹẹrẹ, iṣẹ ti ko ṣe nkankan:

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

(Cm. orisun, ninu eyiti awọn iṣẹ miiran ti wa ni imuse - iwoyi iṣẹ, iwoyi onibara
и awọn oludari igbesi aye.)

Ipade jẹ ohun kan ti o le ṣe ifilọlẹ awọn iṣẹ lọpọlọpọ (ifilọlẹ ti pq awọn orisun jẹ idaniloju nipasẹ Ilana Akara oyinbo):

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

Jọwọ ṣe akiyesi pe a n ṣalaye iru iṣeto gangan ti o nilo fun ipade yii. Ti a ba gbagbe lati pato ọkan ninu awọn iru atunto ti o nilo nipasẹ iṣẹ kan pato, aṣiṣe akopo yoo wa. Pẹlupẹlu, a kii yoo ni anfani lati bẹrẹ ipade kan ayafi ti a ba pese diẹ ninu ohun ti iru ti o yẹ pẹlu gbogbo data pataki.

Ogun Name Ipinnu

Lati sopọ si agbalejo latọna jijin, a nilo adiresi IP gidi kan. O ṣee ṣe pe adirẹsi naa yoo di mimọ nigbamii ju iyokù iṣeto lọ. Nitorinaa a nilo iṣẹ kan ti o ṣe maapu ID node si adirẹsi kan:

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

Awọn ọna pupọ lo wa lati ṣe iṣẹ yii:

  1. Ti awọn adirẹsi ba di mimọ si wa ṣaaju imuṣiṣẹ, lẹhinna a le ṣe agbekalẹ koodu Scala pẹlu
    awọn adirẹsi ati ki o si ṣiṣe awọn Kọ. Eyi yoo ṣajọ ati ṣiṣe awọn idanwo.
    Ni idi eyi, iṣẹ naa yoo jẹ mimọ ni iṣiro ati pe o le ṣe aṣoju ni koodu bi aworan agbaye Map[NodeId, NodeAddress].
  2. Ni awọn igba miiran, adirẹsi gangan ni a mọ nikan lẹhin ipade ti bẹrẹ.
    Ni ọran yii, a le ṣe “iṣẹ wiwa” ti o ṣiṣẹ ṣaaju awọn apa miiran ati gbogbo awọn apa yoo forukọsilẹ pẹlu iṣẹ yii ati beere awọn adirẹsi ti awọn apa miiran.
  3. Ti a ba le yipada /etc/hosts, lẹhinna o le lo awọn orukọ igbalejo ti a ti sọ tẹlẹ (bii my-project-main-node и echo-backend) ati ki o kan so awọn orukọ wọnyi
    pẹlu awọn IP adirẹsi nigba imuṣiṣẹ.

Ninu ifiweranṣẹ yii a kii yoo gbero awọn ọran wọnyi ni awọn alaye diẹ sii. Fun wa
ni apẹẹrẹ ohun isere, gbogbo awọn apa yoo ni adiresi IP kanna - 127.0.0.1.

Nigbamii, a gbero awọn aṣayan meji fun eto pinpin:

  1. Gbigbe gbogbo awọn iṣẹ lori ipade kan.
  2. Ati gbigbalejo iṣẹ iwoyi ati alabara iwoyi lori awọn apa oriṣiriṣi.

Iṣeto ni fun ọkan ipade:

Nikan ipade iṣeto ni

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

Ohun naa ṣe imuse iṣeto ni ti alabara ati olupin mejeeji. Atunto akoko-si-ifiwe jẹ tun lo ki lẹhin aarin lifetime fopin si eto. (Ctrl-C tun ṣiṣẹ ati tu gbogbo awọn orisun laaye ni deede.)

Eto kanna ti iṣeto ati awọn ami imuse le ṣee lo lati ṣẹda eto ti o wa ninu meji lọtọ apa:

Meji ipade iṣeto ni

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

Pataki! Ṣe akiyesi bi awọn iṣẹ naa ṣe sopọ. A pato iṣẹ kan ti a ṣe imuse nipasẹ ipade kan bi imuse ti ọna igbẹkẹle ipade miiran. Awọn gbára iru ti wa ni ẹnikeji nipasẹ awọn alakojo, nitori ni awọn bèèrè iru. Nigbati o ba ṣiṣẹ, igbẹkẹle yoo ni ID oju ipade ibi-afẹde to pe. Ṣeun si ero yii, a pato nọmba ibudo ni ẹẹkan ati pe a ni iṣeduro nigbagbogbo lati tọka si ibudo to pe.

Imuse ti meji eto apa

Fun iṣeto ni yii, a lo awọn imuse iṣẹ kanna laisi awọn ayipada. Iyatọ kan ṣoṣo ni pe a ni awọn nkan meji ti o ṣe awọn eto iṣẹ oriṣiriṣi:

  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
  }

Ipin akọkọ n ṣe imuse olupin ati pe o nilo iṣeto olupin nikan. Ipin keji ṣe imuse alabara ati lo apakan ti o yatọ ti iṣeto. Paapaa awọn apa mejeeji nilo iṣakoso igbesi aye. Awọn ipade olupin nṣiṣẹ titilai titi ti o fi duro SIGTERM'om, ati awọn ose ipade terminates lẹhin ti awọn akoko. Cm. ifilọlẹ app.

Ilana idagbasoke gbogbogbo

Jẹ ki a wo bii ọna iṣeto yii ṣe ni ipa lori ilana idagbasoke gbogbogbo.

Iṣeto ni yoo ṣe akopọ pẹlu iyokù koodu ati pe ohun-ọṣọ (.jar) yoo ṣe ipilẹṣẹ. O dabi pe o ni oye lati fi iṣeto ni nkan-ara ọtọtọ. Eyi jẹ nitori a le ni awọn atunto pupọ ti o da lori koodu kanna. Lẹẹkansi, o ṣee ṣe lati ṣe ina awọn ohun-ọṣọ ti o baamu si awọn ẹka iṣeto oriṣiriṣi. Awọn igbẹkẹle lori awọn ẹya kan pato ti awọn ile-ikawe ti wa ni fipamọ pẹlu iṣeto ni, ati pe awọn ẹya wọnyi wa ni fipamọ lailai nigbakugba ti a pinnu lati mu ẹya ti iṣeto naa ṣiṣẹ.

Eyikeyi iyipada iṣeto ni yipada si iyipada koodu. Ati nitorinaa, kọọkan
iyipada naa yoo bo nipasẹ ilana idaniloju didara deede:

Tiketi ninu olutọpa kokoro -> PR -> atunyẹwo -> dapọ pẹlu awọn ẹka ti o yẹ ->
Integration -> imuṣiṣẹ

Awọn abajade akọkọ ti imuse iṣeto ni akojọpọ jẹ:

  1. Iṣeto ni yoo wa ni ibamu kọja gbogbo awọn apa ti eto pinpin. Nitori otitọ pe gbogbo awọn apa gba iṣeto kanna lati orisun kan.

  2. O jẹ iṣoro lati yi iṣeto ni ọkan ninu awọn apa. Nitorinaa, “fiseete atunto” ko ṣeeṣe.

  3. O di diẹ sii soro lati ṣe awọn ayipada kekere si iṣeto ni.

  4. Pupọ awọn iyipada iṣeto ni yoo waye gẹgẹbi apakan ti ilana idagbasoke gbogbogbo ati pe yoo jẹ koko ọrọ si atunyẹwo.

Ṣe Mo nilo ibi ipamọ lọtọ lati tọju iṣeto iṣelọpọ bi? Iṣeto ni yii le ni awọn ọrọ igbaniwọle ati alaye ifura miiran si eyiti a yoo fẹ lati ni ihamọ iwọle si. Da lori eyi, o dabi pe o ni oye lati tọju iṣeto ikẹhin ni ibi ipamọ ọtọtọ. O le pin iṣeto ni awọn ẹya meji-ọkan ti o ni awọn eto iṣeto ni wiwọle si gbangba ati ọkan ninu awọn eto ihamọ. Eyi yoo gba ọpọlọpọ awọn olupilẹṣẹ laaye lati ni iwọle si awọn eto ti o wọpọ. Iyapa yii rọrun lati ṣaṣeyọri ni lilo awọn abuda agbedemeji ti o ni awọn iye aiyipada ninu.

Awọn iyatọ ti o ṣeeṣe

Jẹ ki a gbiyanju lati ṣe afiwe iṣeto ni akojọpọ pẹlu awọn omiiran ti o wọpọ:

  1. Faili ọrọ lori ẹrọ ibi-afẹde.
  2. Ile-itaja iye bọtini aarin (etcd/zookeeper).
  3. Awọn paati ilana ti o le tunto / tun bẹrẹ laisi tun ilana naa bẹrẹ.
  4. Titoju iṣeto ni ita ti artifact ati iṣakoso ẹya.

Awọn faili ọrọ n pese irọrun pataki ni awọn ofin ti awọn iyipada kekere. Alakoso eto le wọle si oju-ọna jijin, ṣe awọn ayipada si awọn faili ti o yẹ ki o tun bẹrẹ iṣẹ naa. Fun awọn ọna ṣiṣe nla, sibẹsibẹ, iru irọrun le ma jẹ wuni. Awọn ayipada ti a ṣe ko fi awọn itọpa silẹ ni awọn eto miiran. Ko si ọkan agbeyewo awọn ayipada. O nira lati pinnu ẹniti o ṣe awọn ayipada gangan ati fun idi wo. Awọn iyipada ko ni idanwo. Ti eto naa ba pin, lẹhinna oluṣakoso le gbagbe lati ṣe iyipada ti o baamu lori awọn apa miiran.

(O yẹ ki o tun ṣe akiyesi pe lilo atunto akojọpọ ko ni pipade iṣeeṣe ti lilo awọn faili ọrọ ni ọjọ iwaju. Yoo to lati ṣafikun parser ati afọwọsi ti o ṣe iru iru bi iṣelọpọ Config, ati pe o le lo awọn faili ọrọ. Lẹsẹkẹsẹ tẹle pe idiju ti eto kan pẹlu iṣeto ti o ṣajọ jẹ diẹ kere ju idiju ti eto kan nipa lilo awọn faili ọrọ, nitori awọn faili ọrọ nilo koodu afikun.)

Ile-itaja iye bọtini aarin jẹ ẹrọ to dara fun pinpin awọn aye meta ti ohun elo ti o pin. A nilo lati pinnu kini awọn paramita atunto ati kini data nikan. Jẹ ki a ni iṣẹ kan C => A => B, ati awọn paramita C ṣọwọn ayipada, ati data A - igba. Ni idi eyi a le sọ bẹ C - iṣeto ni sile, ati A - data. O han pe awọn paramita atunto yatọ si data ni pe wọn yipada ni gbogbogbo kere si nigbagbogbo ju data lọ. Paapaa, data nigbagbogbo wa lati orisun kan (lati ọdọ olumulo), ati awọn paramita atunto lati omiiran (lati ọdọ oluṣakoso eto).

Ti o ba jẹ pe awọn aye iyipada ṣọwọn nilo lati ni imudojuiwọn laisi tun bẹrẹ eto naa, lẹhinna eyi le nigbagbogbo ja si ilolu ti eto naa, nitori a yoo nilo lati fi awọn ayebalẹ jiṣẹ, tọju, itupalẹ ati ṣayẹwo, ati ilana awọn iye ti ko tọ. Nitorinaa, lati oju-ọna ti idinku idiju ti eto naa, o jẹ oye lati dinku nọmba awọn aye ti o le yipada lakoko iṣẹ ṣiṣe eto (tabi ko ṣe atilẹyin iru awọn paramita rara).

Fun awọn idi ti ifiweranṣẹ yii, a yoo ṣe iyatọ laarin aimi ati awọn aye ti o ni agbara. Ti oye ti iṣẹ naa ba nilo awọn aye iyipada lakoko iṣẹ ti eto naa, lẹhinna a yoo pe iru awọn paramita ni agbara. Bibẹẹkọ awọn aṣayan jẹ aimi ati pe o le tunto nipa lilo iṣeto ti a ṣajọ. Fun atunto ti o ni agbara, a le nilo ẹrọ kan lati tun bẹrẹ awọn apakan ti eto naa pẹlu awọn ayeraye tuntun, iru si bii awọn ilana ṣiṣe eto ṣe tun bẹrẹ. (Ninu ero wa, o ni imọran lati yago fun atunto akoko gidi, nitori eyi mu ki eka eto naa pọ si. Ti o ba ṣeeṣe, o dara lati lo awọn agbara OS boṣewa fun awọn ilana tun bẹrẹ.)

Apa pataki kan ti lilo atunto aimi ti o jẹ ki eniyan gbero atunto atunto agbara ni akoko ti o gba fun eto lati tun bẹrẹ lẹhin imudojuiwọn iṣeto kan (akoko downtime). Ni otitọ, ti a ba nilo lati ṣe awọn ayipada si iṣeto aimi, a yoo ni lati tun eto naa bẹrẹ fun awọn iye tuntun lati ni ipa. Iṣoro downtime yatọ ni idibajẹ fun awọn ọna ṣiṣe oriṣiriṣi. Ni awọn igba miiran, o le seto atunbere ni akoko kan nigbati fifuye jẹ iwonba. Ti o ba nilo lati pese iṣẹ lemọlemọfún, o le ṣe AWS ELB asopọ sisan. Ni akoko kanna, nigba ti a ba nilo lati tun atunbere eto naa, a ṣe ifilọlẹ apẹẹrẹ ti o jọra ti eto yii, yi iwọntunwọnsi si, ati duro fun awọn asopọ atijọ lati pari. Lẹhin ti gbogbo awọn asopọ atijọ ti pari, a ku si isalẹ apẹẹrẹ atijọ ti eto naa.

Jẹ ki a ni bayi ṣe akiyesi ọran ti fifipamọ iṣeto ni inu tabi ita ohun-ọṣọ naa. Ti a ba tọju iṣeto ni inu ohun-ọṣọ, lẹhinna o kere ju a ni aye lati rii daju pe o tọ ti iṣeto ni akoko apejọ ti artifact. Ti iṣeto ba wa ni ita ohun-ini iṣakoso, o ṣoro lati tọpinpin ẹniti o ṣe awọn ayipada si faili yii ati idi. Báwo ló ṣe ṣe pàtàkì tó? Ninu ero wa, fun ọpọlọpọ awọn ọna ṣiṣe iṣelọpọ o ṣe pataki lati ni iduroṣinṣin ati iṣeto didara giga.

Ẹya ti artifact gba ọ laaye lati pinnu nigbati o ṣẹda, kini awọn iye ti o ni, awọn iṣẹ wo ni o ṣiṣẹ / alaabo, ati tani o ṣe iduro fun eyikeyi iyipada ninu iṣeto naa. Nitoribẹẹ, titoju iṣeto ni inu ohun artifact nilo igbiyanju diẹ, nitorinaa o nilo lati ṣe ipinnu alaye.

Awọn Aleebu ati awọn konsi

Emi yoo fẹ lati gbe lori awọn anfani ati awọn alailanfani ti imọ-ẹrọ ti a dabaa.

Anfani

Ni isalẹ ni atokọ ti awọn ẹya akọkọ ti atunto eto pinpin kaakiri:

  1. Ayẹwo iṣeto ni aimi. Gba ọ laaye lati rii daju pe
    iṣeto ni ti o tọ.
  2. Ọrọ iṣeto ni ede. Ni deede, awọn ọna atunto miiran ni opin si aropo oniyipada okun ni pupọ julọ. Nigba lilo Scala, ọpọlọpọ awọn ẹya ede wa lati mu iṣeto rẹ dara si. Fun apẹẹrẹ a le lo
    awọn ami-ara fun awọn iye aiyipada, ni lilo awọn nkan si awọn paramita ẹgbẹ, a le tọka si awọn vals ti a sọ ni ẹẹkan (DRY) ni aaye pipade. O le ese eyikeyi awọn kilasi taara inu iṣeto ni (Seq, Map, aṣa kilasi).
  3. DSL. Scala ni nọmba awọn ẹya ede ti o jẹ ki o rọrun lati ṣẹda DSL kan. O ṣee ṣe lati lo awọn ẹya wọnyi ki o ṣe ede iṣeto ni irọrun diẹ sii fun ẹgbẹ ibi-afẹde ti awọn olumulo, ki iṣeto ni o kere ju kika nipasẹ awọn amoye agbegbe. Awọn alamọja le, fun apẹẹrẹ, kopa ninu ilana atunyẹwo iṣeto.
  4. Iduroṣinṣin ati amuṣiṣẹpọ laarin awọn apa. Ọkan ninu awọn anfani ti nini iṣeto ni gbogbo eto pinpin ti o fipamọ ni aaye kan ni pe gbogbo awọn iye ni a kede ni ẹẹkan ati lẹhinna tun lo nibikibi ti wọn nilo. Lilo awọn oriṣi Phantom lati sọ awọn ebute oko oju omi ṣe idaniloju pe awọn apa ti nlo awọn ilana ibaramu ni gbogbo awọn atunto eto to pe. Nini awọn igbẹkẹle dandan ti o fojuhan laarin awọn apa ṣe idaniloju pe gbogbo awọn iṣẹ ti sopọ.
  5. Ga didara ayipada. Ṣiṣe awọn ayipada si iṣeto ni lilo ilana idagbasoke ti o wọpọ jẹ ki o ṣee ṣe lati ṣaṣeyọri awọn iṣedede didara giga fun iṣeto naa daradara.
  6. Igbakana iṣeto ni imudojuiwọn. Imuṣiṣẹ eto aifọwọyi lẹhin awọn ayipada iṣeto ni idaniloju pe gbogbo awọn apa ti ni imudojuiwọn.
  7. Irọrun ohun elo. Ohun elo naa ko nilo itupalẹ, iṣayẹwo iṣeto ni, tabi mimu awọn iye ti ko tọ mu. Eyi dinku idiju ohun elo naa. (Diẹ ninu awọn eka iṣeto ni ti a ṣe akiyesi ninu apẹẹrẹ wa kii ṣe ẹya ti iṣeto ti a ṣajọpọ, ṣugbọn ipinnu mimọ nikan ti o ni idari nipasẹ ifẹ lati pese aabo iru nla.) O rọrun pupọ lati pada si iṣeto deede - kan ṣe awọn ti o padanu. awọn ẹya ara. Nitorinaa, o le, fun apẹẹrẹ, bẹrẹ pẹlu iṣeto akojọpọ, daduro imuse ti awọn ẹya ti ko wulo titi di akoko ti o nilo gaan.
  8. Wadi iṣeto ni. Niwọn bi awọn ayipada atunto ṣe tẹle ayanmọ deede ti eyikeyi awọn ayipada miiran, iṣelọpọ ti a gba jẹ ohun-ọṣọ pẹlu ẹya alailẹgbẹ kan. Eyi n gba wa laaye, fun apẹẹrẹ, lati pada si ẹya iṣaaju ti iṣeto ti o ba jẹ dandan. A le paapaa lo iṣeto ni lati ọdun kan sẹhin ati pe eto naa yoo ṣiṣẹ deede kanna. Iṣeto iduroṣinṣin ṣe ilọsiwaju asọtẹlẹ ati igbẹkẹle ti eto pinpin. Niwọn igba ti iṣeto naa ti wa titi ni ipele akopọ, o nira pupọ lati ṣe iro ni iṣelọpọ.
  9. Modularity. Ilana ti a dabaa jẹ apọjuwọn ati awọn modulu le ni idapo ni awọn ọna oriṣiriṣi lati ṣẹda awọn ọna ṣiṣe oriṣiriṣi. Ni pataki, o le tunto eto naa lati ṣiṣẹ lori ipade kan ni irisi kan, ati lori awọn apa pupọ ni omiiran. O le ṣẹda awọn atunto pupọ fun awọn iṣẹlẹ iṣelọpọ ti eto naa.
  10. Idanwo. Nipa rirọpo awọn iṣẹ kọọkan pẹlu awọn ohun ẹlẹgàn, o le gba ọpọlọpọ awọn ẹya ti eto ti o rọrun fun idanwo.
  11. Idanwo Integration. Nini iṣeto kan fun gbogbo eto pinpin jẹ ki o ṣee ṣe lati ṣiṣe gbogbo awọn paati ni agbegbe iṣakoso bi apakan ti idanwo iṣọpọ. O rọrun lati farawe, fun apẹẹrẹ, ipo kan nibiti diẹ ninu awọn apa di wiwọle.

Awọn alailanfani ati awọn idiwọn

Iṣeto ni akojọpọ yatọ si awọn isunmọ atunto miiran ati pe o le ma dara fun diẹ ninu awọn ohun elo. Ni isalẹ wa diẹ ninu awọn alailanfani:

  1. Aimi iṣeto ni. Nigba miiran o nilo lati ṣe atunṣe iṣeto ni iyara ni iṣelọpọ, ni ikọja gbogbo awọn ọna aabo. Pẹlu ọna yii o le nira sii. Ni o kere ju, akopọ ati imuṣiṣẹ laifọwọyi yoo tun nilo. Eyi jẹ ẹya ti o wulo ti ọna ati ailagbara ni awọn igba miiran.
  2. iran iṣeto ni. Ni ọran ti faili iṣeto ni ipilẹṣẹ nipasẹ ohun elo adaṣe, awọn igbiyanju afikun le nilo lati ṣepọ iwe afọwọkọ kikọ.
  3. Awọn irinṣẹ. Lọwọlọwọ, awọn ohun elo ati awọn imuposi ti a ṣe lati ṣiṣẹ pẹlu iṣeto ni da lori awọn faili ọrọ. Kii ṣe gbogbo iru awọn ohun elo / awọn imọ-ẹrọ yoo wa ni iṣeto ti a ṣajọ.
  4. A nilo iyipada ninu awọn iwa. Awọn olupilẹṣẹ ati DevOps ti mọ awọn faili ọrọ. Ero pupọ ti iṣakojọpọ iṣeto le jẹ airotẹlẹ diẹ ati dani ati fa ijusile.
  5. Ilana idagbasoke ti o ga julọ ni a nilo. Lati le ni itunu lo iṣeto ti a ṣakojọ, adaṣe kikun ti ilana ti kikọ ati gbigbe ohun elo (CI/CD) jẹ pataki. Bibẹkọkọ o yoo jẹ ohun airọrun.

Jẹ ki a tun gbe lori nọmba awọn idiwọn ti apẹẹrẹ ti a gbero ti ko ni ibatan si imọran ti iṣeto ni akojọpọ:

  1. Ti a ba pese alaye iṣeto ti ko wulo ti ko lo nipasẹ ipade, lẹhinna alakojọ kii yoo ṣe iranlọwọ fun wa lati rii imuse ti o padanu. A le yanju iṣoro yii nipa kikọ silẹ Ilana akara oyinbo ati lilo awọn iru lile diẹ sii, fun apẹẹrẹ, HList tabi awọn iru data algebra (awọn kilasi ọran) lati ṣe aṣoju iṣeto.
  2. Awọn laini wa ninu faili atunto ti ko ni ibatan si atunto funrararẹ: (package, import,awọn ikede ohun; override def's fun awọn paramita ti o ni awọn iye aiyipada). Eyi le yago fun apakan ti o ba ṣe imuse DSL tirẹ. Ni afikun, awọn iru iṣeto ni miiran (fun apẹẹrẹ, XML) tun fa awọn ihamọ kan lori eto faili naa.
  3. Fun awọn idi ti ifiweranṣẹ yii, a ko gbero atunto agbara ti iṣupọ ti awọn apa ti o jọra.

ipari

Ninu ifiweranṣẹ yii, a ṣawari imọran ti n ṣe afihan iṣeto ni koodu orisun nipa lilo awọn agbara ilọsiwaju ti eto iru Scala. Ọna yii le ṣee lo ni awọn ohun elo lọpọlọpọ bi rirọpo fun awọn ọna atunto ibile ti o da lori xml tabi awọn faili ọrọ. Paapaa botilẹjẹpe apẹẹrẹ wa ni imuse ni Scala, awọn imọran kanna ni a le gbe lọ si awọn ede miiran ti a ṣajọ (bii Kotlin, C #, Swift, ...). O le gbiyanju ọna yii ni ọkan ninu awọn iṣẹ akanṣe atẹle, ati, ti ko ba ṣiṣẹ, lọ si faili ọrọ, fifi awọn ẹya ti o padanu.

Nipa ti, iṣeto ti o ṣajọpọ nilo ilana idagbasoke ti o ga julọ. Ni ipadabọ, didara giga ati igbẹkẹle ti awọn atunto jẹ idaniloju.

Ọna ti a gbero le gbooro sii:

  1. O le lo awọn macros lati ṣe awọn sọwedowo akoko-akojọ.
  2. O le ṣe imuse DSL kan lati ṣafihan iṣeto ni ọna ti o wa si awọn olumulo ipari.
  3. O le ṣe iṣakoso awọn orisun ti o ni agbara pẹlu atunṣe iṣeto ni adaṣe. Fun apẹẹrẹ, iyipada nọmba awọn apa inu iṣupọ nbeere pe (1) ipade kọọkan gba iṣeto ti o yatọ diẹ; (2) oluṣakoso iṣupọ gba alaye nipa awọn apa titun.

Awọn ijẹwọ

Emi yoo fẹ lati dúpẹ lọwọ Andrei Saksonov, Pavel Popov ati Anton Nekhaev fun won todara lodi ti awọn osere article.

orisun: www.habr.com

Fi ọrọìwòye kun