Haɗaɗɗen Tsarin Tsarin Rarraba

Ina so in gaya muku wata hanya mai ban sha'awa don aiki tare da daidaitawar tsarin rarraba. Tsarin yana wakilta kai tsaye a cikin yaren da aka haɗa (Scala) ta amfani da nau'ikan aminci. Wannan sakon yana ba da misali na irin wannan tsari kuma yana tattauna bangarori daban-daban na aiwatar da tsarin da aka haɗa a cikin tsarin ci gaba gaba ɗaya.

Haɗaɗɗen Tsarin Tsarin Rarraba

(english)

Gabatarwar

Gina ingantaccen tsarin rarrabawa yana nufin cewa duk nodes suna amfani da daidaitaccen tsari, aiki tare da sauran nodes. Ana amfani da fasahar DevOps (terraform, mai yiwuwa ko wani abu makamancin haka) don samar da fayilolin daidaitawa ta atomatik (sau da yawa musamman ga kowane kumburi). Hakanan muna son tabbatar da cewa duk nodes ɗin sadarwa suna amfani da ƙa'idodi iri ɗaya (ciki har da sigar iri ɗaya). In ba haka ba, rashin jituwa za a gina a cikin tsarin rarraba mu. A cikin duniyar JVM, sakamako ɗaya na wannan buƙatun shine cewa dole ne a yi amfani da sigar ɗakin karatu iri ɗaya da ke ɗauke da saƙon yarjejeniya a ko'ina.

Me game da gwada tsarin rarrabawa? Tabbas, muna ɗauka cewa duk abubuwan da aka gyara suna da gwaje-gwajen raka'a kafin mu ci gaba zuwa gwajin haɗin kai. (Domin mu fitar da sakamakon gwaji zuwa lokacin aiki, dole ne mu samar da saitin ɗakunan karatu iri ɗaya a matakin gwaji da lokacin aiki.)

Lokacin aiki tare da gwaje-gwajen haɗin kai, sau da yawa yana da sauƙi a yi amfani da hanya iri ɗaya a ko'ina akan duk nodes. Duk abin da za mu yi shi ne tabbatar da cewa an yi amfani da hanyar aji iri ɗaya a lokacin aiki. (Duk da yake yana yiwuwa gaba ɗaya don gudanar da nodes daban-daban tare da hanyoyi daban-daban, wannan yana ƙara rikitarwa ga tsarin gabaɗaya da matsaloli tare da ƙaddamarwa da gwaje-gwajen haɗin kai.) Don dalilan wannan post, muna ɗauka cewa duk nodes za su yi amfani da hanyar aji ɗaya.

Tsarin yana tasowa tare da aikace-aikacen. Muna amfani da juzu'i don gano matakai daban-daban na juyin halittar shirin. Yana da ma'ana don kuma gano nau'ikan daidaitawa daban-daban. Kuma sanya sanyi kanta a cikin tsarin sarrafa sigar. Idan akwai tsari ɗaya kawai a samarwa, to zamu iya amfani da lambar sigar kawai. Idan muka yi amfani da yawancin abubuwan samarwa, to za mu buƙaci da yawa
rassan sanyi da ƙarin lakabin ban da sigar (misali, sunan reshe). Ta wannan hanyar za mu iya gano ainihin daidaitaccen tsari a fili. Kowane mai gano na'urar daidaitawa ta musamman yayi daidai da takamaiman haɗakar nodes da aka rarraba, tashoshin jiragen ruwa, albarkatun waje, da nau'ikan laburare. Don dalilan wannan sakon za mu ɗauka cewa reshe ɗaya ne kawai kuma za mu iya gano tsarin da aka saba amfani da shi ta hanyar amfani da lambobi uku da aka raba da digo (1.2.3).

A cikin mahallin zamani, fayilolin sanyi ba safai ake ƙirƙira su da hannu ba. Mafi sau da yawa ana haifar da su yayin turawa kuma ba a taɓa su ba (don haka kar a karya komai). Tambayar dabi'a ta taso: me yasa har yanzu muke amfani da tsarin rubutu don adana sanyi? Madaidaicin madaidaicin da alama shine ikon yin amfani da lambar yau da kullun don daidaitawa da fa'ida daga ƙididdigar lokaci-lokaci.

A cikin wannan sakon za mu bincika ra'ayin wakiltar wani tsari a cikin kayan tarihi da aka haɗa.

Haɗaɗɗen tsari

Wannan sashe yana ba da misalin tsayayyen tsari wanda aka haɗa. Ana aiwatar da ayyuka masu sauƙi guda biyu - sabis na echo da abokin ciniki sabis na echo. Dangane da waɗannan ayyuka guda biyu, zaɓuɓɓukan tsarin guda biyu suna haɗuwa. A cikin zaɓi ɗaya, duka sabis ɗin suna kan kulli ɗaya, a cikin wani zaɓi - akan nodes daban-daban.

Yawanci tsarin rarraba ya ƙunshi nodes da yawa. Kuna iya gano nodes ta amfani da ƙimar wasu nau'ikan NodeId:

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

ko

case class NodeId(hostName: String)

ko ma

object Singleton
type NodeId = Singleton.type

Nodes suna yin ayyuka daban-daban, suna gudanar da ayyuka kuma ana iya kafa haɗin TCP/HTTP tsakanin su.

Don kwatanta haɗin TCP muna buƙatar aƙalla lambar tashar jiragen ruwa. Hakanan muna so mu yi la'akari da ƙa'idar da ke goyan bayan wannan tashar jiragen ruwa don tabbatar da cewa duka abokin ciniki da uwar garken suna amfani da yarjejeniya iri ɗaya. Za mu bayyana haɗin kai ta amfani da aji mai zuwa:

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

inda Port - lamba kawai Int yana nuna kewayon ƙimar karɓuwa:

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

Nau'u masu ladabi

Duba ɗakin karatu tsabtace и nawa rahoto. A takaice, ɗakin karatu yana ba ku damar ƙara ƙuntatawa ga nau'ikan da aka bincika a lokacin haɗawa. A wannan yanayin, ingantattun ƙimar lambar tashar jiragen ruwa sune 16-bit lamba. Don daidaitawar da aka haɗa, yin amfani da ingantaccen ɗakin karatu ba dole ba ne, amma yana haɓaka ikon mai tarawa don duba tsarin.

Don ka'idojin HTTP (REST), ban da lambar tashar jiragen ruwa, muna iya buƙatar hanyar zuwa sabis:

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

Nau'in fatalwa

Don gano ƙa'idar a lokacin tattarawa, muna amfani da nau'in siga wanda ba a amfani da shi a cikin aji. Wannan shawarar ta kasance saboda gaskiyar cewa ba ma amfani da misalin yarjejeniya a lokacin aiki, amma muna son mai tarawa ya duba dacewar yarjejeniya. Ta hanyar ƙididdige ƙa'idar, ba za mu iya ƙaddamar da sabis ɗin da bai dace ba a matsayin abin dogaro.

Ɗaya daga cikin ƙa'idodin gama gari shine API na REST tare da serialization Json:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

inda RequestMessage - request type, ResponseMessage - nau'in amsawa.
Tabbas, zamu iya amfani da wasu kwatancen yarjejeniya waɗanda ke ba da daidaiton bayanin da muke buƙata.

Don dalilai na wannan sakon, za mu yi amfani da ƙayyadaddun ƙa'idar:

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

Anan buƙatun shine kirtani da aka rataye a url kuma amsa ita ce kirtan da aka dawo a jikin martanin HTTP.

An kwatanta tsarin sabis ɗin ta sunan sabis, tashar jiragen ruwa, da abubuwan dogaro. Ana iya wakilta waɗannan abubuwan a cikin Scala ta hanyoyi da yawa (misali, HList-s, nau'in bayanan algebra). Don dalilan wannan post, za mu yi amfani da Tsarin Kek kuma mu wakilci kayayyaki ta amfani da trait'ov. (Tsarin Cake ba shine abin da ake buƙata na wannan tsarin ba. Aiwatar aiwatarwa ɗaya ce kawai.)

Ana iya wakilta abubuwan dogaro tsakanin sabis azaman hanyoyin dawo da tashar jiragen ruwa EndPointna sauran nodes:

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

Don ƙirƙirar sabis na echo, duk abin da kuke buƙata shine lambar tashar jiragen ruwa da nunin cewa tashar jiragen ruwa tana goyan bayan ka'idar echo. Wataƙila ba za mu bayyana takamaiman tashar jiragen ruwa ba, saboda... dabi'u suna ba ku damar bayyana hanyoyin ba tare da aiwatarwa ba (hanyoyin abstract). A wannan yanayin, lokacin ƙirƙirar ƙayyadaddun ƙayyadaddun ƙayyadaddun bayanai, mai tarawa zai buƙaci mu samar da aiwatar da hanyar abstract da samar da lambar tashar jiragen ruwa. Tun da mun aiwatar da hanyar, lokacin ƙirƙirar ƙayyadaddun ƙayyadaddun ƙayyadaddun tsari, ƙila ba za mu ƙididdige tashar jiragen ruwa daban ba. Za a yi amfani da tsohuwar ƙima.

A cikin tsarin abokin ciniki muna ayyana dogaro akan sabis na echo:

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

Dogaro iri ɗaya ne da sabis ɗin da aka fitar echoService. Musamman, a cikin echo abokin ciniki muna buƙatar yarjejeniya iri ɗaya. Don haka, lokacin haɗa sabis biyu, zamu iya tabbata cewa komai zai yi aiki daidai.

Aiwatar da ayyuka

Ana buƙatar aiki don farawa da dakatar da sabis ɗin. (Ikon dakatar da sabis yana da mahimmanci don gwaji.) Hakanan, akwai zaɓuɓɓuka da yawa don aiwatar da irin wannan fasalin (misali, zamu iya amfani da nau'ikan nau'ikan dangane da nau'in sanyi). Don dalilan wannan post za mu yi amfani da Tsarin Kek. Za mu wakilci sabis ta amfani da aji cats.Resource, saboda Wannan ajin ya riga ya samar da hanyoyin da za a tabbatar da amincin sakin albarkatu idan akwai matsaloli. Don samun albarkatu, muna buƙatar samar da tsari da mahallin lokacin aiki da aka shirya. Ayyukan farawa na sabis na iya kama da haka:

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

inda

  • Config - nau'in sanyi don wannan sabis ɗin
  • AddressResolver - wani abu na lokaci-lokaci wanda ke ba ku damar gano adiresoshin sauran nodes (duba ƙasa)

da sauran nau'ikan daga ɗakin karatu cats:

  • F[_] - nau'in sakamako (a cikin mafi sauki yanayin F[A] zai iya zama aiki kawai () => A. A cikin wannan post za mu yi amfani cats.IO.)
  • Reader[A,B] - ƙari ko žasa mai ma'ana tare da aiki A => B
  • cats.Resource - albarkatun da za a iya samu kuma a sake su
  • Timer - mai ƙidayar lokaci (yana ba ku damar yin barci na ɗan lokaci kuma ku auna tazarar lokaci)
  • ContextShift - analogues ExecutionContext
  • Applicative - nau'in nau'in tasiri wanda ke ba ku damar haɗa tasirin kowane mutum (kusan monad). A cikin ƙarin hadaddun aikace-aikace yana da kyau a yi amfani da shi Monad/ConcurrentEffect.

Amfani da wannan sa hannun aikin za mu iya aiwatar da ayyuka da yawa. Misali, sabis ɗin da ba ya yin komai:

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

(Cm. tushe, wanda ake aiwatar da wasu ayyuka - echo sabis, echo abokin ciniki
и masu kula da rayuwa.)

Kumburi wani abu ne wanda zai iya ƙaddamar da ayyuka da yawa (ƙaddamar da jerin albarkatu yana tabbatar da tsarin Cake):

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

Lura cewa muna ƙayyade ainihin nau'in daidaitawa da ake buƙata don wannan kumburi. Idan muka manta da saka ɗaya daga cikin nau'ikan sanyi da wani sabis ɗin ke buƙata, za a sami kuskuren haɗawa. Hakanan, ba za mu iya fara kumburi ba sai dai idan mun samar da wani abu na nau'in da ya dace tare da duk bayanan da ake bukata.

Ƙwararrun Sunan Mai watsa shiri

Don haɗi zuwa mai watsa shiri mai nisa, muna buƙatar adireshin IP na ainihi. Yana yiwuwa adireshin zai zama sananne daga baya fiye da sauran tsarin. Don haka muna buƙatar aikin da ke tsara ID ɗin node zuwa adireshin:

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

Akwai hanyoyi da yawa don aiwatar da wannan aikin:

  1. Idan adiresoshin sun zama sananne gare mu kafin turawa, to za mu iya samar da lambar Scala tare da
    adireshi sannan ku gudanar da ginin. Wannan zai tattara da gudanar da gwaje-gwaje.
    A wannan yanayin, aikin za a san shi a tsaye kuma ana iya wakilta shi a lamba azaman taswira Map[NodeId, NodeAddress].
  2. A wasu lokuta, ainihin adireshin ana saninsa ne kawai bayan an fara kumburi.
    A wannan yanayin, zamu iya aiwatar da "sabis na ganowa" wanda ke gudana a gaban sauran nodes kuma duk nodes za su yi rajista tare da wannan sabis ɗin kuma suna buƙatar adiresoshin sauran nodes.
  3. Idan za mu iya gyara /etc/hosts, to, zaku iya amfani da sunayen da aka riga aka ƙayyade (kamar my-project-main-node и echo-backend) kuma kawai haɗa waɗannan sunaye
    tare da adiresoshin IP yayin turawa.

A cikin wannan sakon ba za mu yi la'akari da waɗannan lokuta dalla-dalla ba. Domin mu
a cikin misalin abin wasan yara, duk nodes zasu sami adireshin IP iri ɗaya - 127.0.0.1.

Na gaba, muna la'akari da zaɓuɓɓuka biyu don tsarin rarrabawa:

  1. Ajiye duk sabis akan kumburi ɗaya.
  2. Da kuma ɗaukar sabis ɗin echo da echo abokin ciniki akan nodes daban-daban.

Kanfigareshan don kumburi daya:

Tsarin kumburi guda ɗaya

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

Abun yana aiwatar da daidaitawar abokin ciniki da uwar garken. Hakanan ana amfani da daidaitawar lokaci zuwa rayuwa ta yadda bayan tazara lifetime dakatar da shirin. (Ctrl-C kuma yana aiki kuma yana 'yantar da duk albarkatun daidai.)

Za'a iya amfani da saitin tsari guda ɗaya da halayen aiwatarwa don ƙirƙirar tsarin da ya ƙunshi biyu daban-daban nodes:

Tsarin kumburi guda biyu

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

Muhimmanci! Lura yadda ake haɗa ayyukan. Mun ƙididdige sabis ɗin da kumburi ɗaya ke aiwatarwa azaman aiwatar da hanyar dogaro da wani kumburi. Ana duba nau'in dogaro da mai tarawa, saboda ya ƙunshi nau'in yarjejeniya. Lokacin gudu, abin dogara zai ƙunshi madaidaicin ID ɗin kumburin manufa. Godiya ga wannan makirci, mun ƙididdige lambar tashar jiragen ruwa daidai sau ɗaya kuma koyaushe muna da garantin komawa zuwa tashar tashar daidai.

Aiwatar da nodes tsarin guda biyu

Don wannan saitin, muna amfani da aiwatar da sabis iri ɗaya ba tare da canje-canje ba. Bambancin kawai shine cewa yanzu muna da abubuwa guda biyu waɗanda ke aiwatar da tsarin ayyuka daban-daban:

  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
  }

Kumburi na farko yana aiwatar da uwar garken kuma yana buƙatar saitin uwar garken. Kumburi na biyu yana aiwatar da abokin ciniki kuma yana amfani da wani ɓangare na daidaitawa. Hakanan duka nodes suna buƙatar sarrafa rayuwa. Kullin uwar garken yana gudana har sai an tsaya SIGTERM'om, kuma kullin abokin ciniki ya ƙare bayan ɗan lokaci. Cm. kaddamar da app.

Tsarin ci gaba na gaba ɗaya

Bari mu ga yadda wannan tsarin daidaitawa ke shafar tsarin ci gaba gaba ɗaya.

Za a haɗa tsarin tare da sauran lambar kuma za a samar da kayan tarihi (.jar). Da alama yana da ma'ana don sanya saitin a cikin wani kayan tarihi daban. Wannan saboda muna iya samun saitunan da yawa bisa lambobi iri ɗaya. Bugu da ƙari, yana yiwuwa a samar da kayan tarihi masu dacewa da rassan sanyi daban-daban. Dogaro akan takamaiman nau'ikan ɗakunan karatu ana adana su tare da daidaitawa, kuma ana adana waɗannan sifofin har abada a duk lokacin da muka yanke shawarar tura wannan sigar ɗin.

Duk wani canjin sanyi yana juya zuwa canjin lamba. Sabili da haka, kowane
canjin zai kasance ta hanyar tsarin tabbatar da inganci na yau da kullun:

Tikiti a cikin bug tracker -> PR -> bita -> haɗe tare da rassan da suka dace ->
hadewa -> turawa

Babban sakamakon aiwatar da tsarin da aka haɗa sune:

  1. Ƙimar za ta kasance daidai a cikin duk nodes na tsarin da aka rarraba. Saboda gaskiyar cewa duk nodes suna karɓar tsari ɗaya daga tushe guda.

  2. Yana da matsala don canza saitin a ɗaya kawai daga cikin nodes. Saboda haka, "daidaitawa drift" ba shi yiwuwa.

  3. Ya zama mafi wahala don yin ƙananan canje-canje ga daidaitawa.

  4. Yawancin canje-canjen daidaitawa za su faru a matsayin wani ɓangare na tsarin haɓaka gabaɗayan kuma za a yi bitarsu.

Ina bukatan wurin ajiya daban don adana tsarin samarwa? Wannan tsarin yana iya ƙunsar kalmomin sirri da wasu mahimman bayanai waɗanda muke son taƙaita isa ga su. Dangane da wannan, yana da alama yana da ma'ana don adana saitin ƙarshe a cikin ma'ajin daban. Kuna iya raba sanyi zuwa sassa biyu-ɗaya mai ɗauke da saitunan sanyi mai isa ga jama'a da ɗaya mai ɗauke da ƙuntataccen saituna. Wannan zai ba da damar yawancin masu haɓakawa su sami damar yin amfani da saitunan gama gari. Wannan rabuwa yana da sauƙin cimma ta amfani da tsaka-tsakin halaye masu ƙunshe da dabi'u na asali.

Bambance-bambance masu yiwuwa

Bari mu gwada kwatanta tsarin da aka haɗa tare da wasu hanyoyin gama gari:

  1. Fayil ɗin rubutu akan na'urar da aka yi niyya.
  2. Babban kantin sayar da ƙima mai mahimmanci (etcd/zookeeper).
  3. Tsarin abubuwan da za'a iya sake saitawa/sake farawa ba tare da sake farawa ba.
  4. Ajiye sanyi a wajen kayan tarihi da sarrafa sigar.

Fayilolin rubutu suna ba da sassauci mai mahimmanci dangane da ƙananan canje-canje. Mai gudanar da tsarin zai iya shiga cikin kullin nesa, yin canje-canje ga fayilolin da suka dace kuma sake kunna sabis ɗin. Don manyan tsarin, duk da haka, irin wannan sassauci bazai zama abin kyawawa ba. Canje-canjen da aka yi basu bar wata alama a cikin wasu tsarin ba. Babu wanda ya duba canje-canje. Yana da wuya a tantance wanda ya yi daidai da canje-canje kuma ga wane dalili. Ba a gwada canje-canje. Idan an rarraba tsarin, to, mai gudanarwa na iya mantawa don yin canjin da ya dace akan wasu nodes.

(Har ila yau, ya kamata a lura cewa yin amfani da tsarin da aka haɗa ba zai rufe yiwuwar yin amfani da fayilolin rubutu ba a nan gaba. Zai isa ya ƙara parser da mai tabbatarwa wanda ke samar da nau'i ɗaya da fitarwa. Config, kuma zaka iya amfani da fayilolin rubutu. Nan da nan ya biyo bayan sarkar da ke tattare da tsarin da aka harhada shi ya dan yi kasa da sarkakiyar tsarin amfani da fayilolin rubutu, domin fayilolin rubutu suna buƙatar ƙarin lamba.)

Kantin sayar da maɓalli mai mahimmanci shine kyakkyawan tsari don rarraba sigogin meta na aikace-aikacen da aka rarraba. Muna buƙatar yanke shawarar menene sigogin saiti kuma menene kawai bayanai. Bari mu sami aiki C => A => B, da sigogi C da wuya canje-canje, da bayanai A - sau da yawa. A wannan yanayin za mu iya cewa C - sigogi na daidaitawa, da A - data. Ya bayyana cewa sigogin daidaitawa sun bambanta da bayanai domin galibi suna canzawa ƙasa da kai fiye da bayanai. Hakanan, bayanai yawanci suna fitowa daga tushe ɗaya (daga mai amfani), da sigogin daidaitawa daga wani (daga mai kula da tsarin).

Idan da wuya canza sigogi suna buƙatar sabunta ba tare da sake kunna shirin ba, to wannan na iya haifar da rikicewar shirin, saboda muna buƙatar ko ta yaya isar da sigogi, adanawa, tantancewa da dubawa, da aiwatar da ƙimar da ba daidai ba. Saboda haka, daga ra'ayi na rage hadaddun shirin, yana da ma'ana don rage yawan sigogi da za su iya canzawa yayin aikin shirin (ko kuma baya goyan bayan irin waɗannan sigogi kwata-kwata).

Don dalilan wannan post, za mu bambanta tsakanin sigogi masu tsauri da tsauri. Idan ma'anar sabis ɗin yana buƙatar canza sigogi yayin aikin shirin, to za mu kira irin waɗannan sigogi masu ƙarfi. In ba haka ba zaɓukan sun tsaya tsayin daka kuma ana iya daidaita su ta amfani da tsarin da aka haɗa. Don sake daidaitawa mai ƙarfi, ƙila mu buƙaci tsarin sake kunna sassan shirin tare da sabbin sigogi, kama da yadda ake sake kunna tsarin aiki. (A cikin ra'ayinmu, yana da kyau a guje wa sake daidaitawa na lokaci-lokaci, tun da yake wannan yana ƙaruwa da rikitarwa na tsarin. Idan zai yiwu, yana da kyau a yi amfani da daidaitattun damar OS don sake farawa matakai.)

Wani muhimmin al'amari na yin amfani da tsayayyen tsari wanda ke sa mutane suyi la'akari da sake daidaitawa mai ƙarfi shine lokacin da ake ɗaukar tsarin don sake kunnawa bayan sabuntawar daidaitawa (lokacin raguwa). A gaskiya ma, idan muna buƙatar yin canje-canje ga daidaitaccen tsari, dole ne mu sake kunna tsarin don sababbin dabi'u su yi tasiri. Matsalar raguwar lokaci ta bambanta da tsanani ga tsarin daban-daban. A wasu lokuta, zaku iya tsara tsarin sake yi a lokacin da kaya yayi kadan. Idan kuna buƙatar samar da sabis na ci gaba, kuna iya aiwatarwa AWS ELB haɗin magudanar ruwa. A lokaci guda, lokacin da muke buƙatar sake kunna tsarin, muna ƙaddamar da misalin daidaitaccen tsarin wannan tsarin, canza ma'auni zuwa gare shi, kuma jira tsoffin haɗin gwiwa don kammala. Bayan duk tsoffin haɗin gwiwa sun ƙare, mun rufe tsohuwar misalin tsarin.

Yanzu bari mu yi la'akari da batun adana sanyi a ciki ko wajen kayan tarihi. Idan muka adana saitin a cikin kayan tarihi, to aƙalla mun sami damar tabbatar da daidaiton tsarin a yayin taron kayan tarihi. Idan saitin yana wajen kayan aikin da aka sarrafa, yana da wahala a gano wanda ya yi canje-canje ga wannan fayil kuma me yasa. Yaya mahimmanci yake da shi? A cikin ra'ayinmu, don yawancin tsarin samarwa yana da mahimmanci don samun kwanciyar hankali da ingantaccen tsari.

Siffar kayan tarihi tana ba ku damar sanin lokacin da aka ƙirƙira shi, menene ƙimar ta ƙunsa, waɗanne ayyuka ke kunna / nakasa, kuma wanene ke da alhakin kowane canji a cikin tsarin. Tabbas, adana saitin a cikin kayan tarihi yana buƙatar ɗan ƙoƙari, don haka kuna buƙatar yanke shawara mai ilimi.

A ribobi da fursunoni

Ina so in yi tsokaci kan fa'ida da rashin amfani da fasahar da aka tsara.

Amfanin

A ƙasa akwai jerin manyan fasalulluka na daidaitawar tsarin da aka rarraba:

  1. Duban sanyi a tsaye. Yana ba ku damar tabbatar da hakan
    daidaitawar daidai ne.
  2. Yaren daidaitawa mai wadatarwa. Yawanci, sauran hanyoyin daidaitawa suna iyakance ga musanya madaidaicin kirtani a mafi yawa. Lokacin amfani da Scala, akwai faffadan fasalulluka na harshe don inganta tsarin ku. Misali za mu iya amfani
    Halaye don tsoffin ƙima, ta amfani da abubuwa zuwa sigogin rukuni, za mu iya komawa ga vals da aka ayyana sau ɗaya kawai (DRY) a cikin iyakokin rufewa. Kuna iya aiwatar da kowane nau'i kai tsaye a cikin tsarin daidaitawa (Seq, Map, azuzuwan al'ada).
  3. DSL. Scala yana da yawan fasalulluka na harshe waɗanda ke sauƙaƙa ƙirƙirar DSL. Yana yiwuwa a yi amfani da waɗannan fasalulluka da aiwatar da harshen daidaitawa wanda ya fi dacewa ga ƙungiyar masu amfani da manufa, don haka saitin ya kasance aƙalla karantawa ta hanyar masana yanki. Kwararru za su iya, alal misali, shiga cikin tsarin bita na daidaitawa.
  4. Mutunci da aiki tare tsakanin nodes. Ɗaya daga cikin fa'idodin samun daidaitawar tsarin da aka rarraba gabaɗaya a wuri guda shine cewa ana bayyana duk ƙimar daidai sau ɗaya sannan a sake amfani da su a duk inda ake buƙata. Yin amfani da nau'ikan fatalwa don ayyana tashoshin jiragen ruwa yana tabbatar da cewa nodes suna amfani da ka'idoji masu jituwa a duk daidaitattun tsarin tsarin. Samun takamaiman abin dogaro na wajibi tsakanin nodes yana tabbatar da cewa an haɗa duk sabis ɗin.
  5. Canje-canje masu inganci. Yin canje-canje ga daidaitawa ta amfani da tsarin ci gaba na yau da kullum yana ba da damar cimma matsayi mai kyau don daidaitawa kuma.
  6. Sabunta tsari na lokaci guda. Aiwatar da tsarin ta atomatik bayan canje-canjen sanyi yana tabbatar da cewa an sabunta duk nodes.
  7. Sauƙaƙe aikace-aikacen. Aikace-aikacen baya buƙatar tantancewa, duban tsari, ko sarrafa ƙimar da ba daidai ba. Wannan yana rage rikitarwa na aikace-aikacen. (Wasu ƙayyadaddun ƙayyadaddun ƙayyadaddun yanayin da aka lura a cikin misalinmu ba sifa ce ta tsarin da aka haɗa ba, amma yanke shawara ne kawai ta hanyar sha'awar samar da mafi girman nau'in aminci.) Yana da sauƙin dawowa zuwa tsarin da aka saba - kawai aiwatar da bacewar. sassa. Sabili da haka, zaku iya, alal misali, farawa tare da daidaitawar da aka haɗa, jinkirta aiwatar da sassan da ba dole ba har zuwa lokacin da ake buƙatar gaske.
  8. Ingantattun tsari. Tunda canje-canjen na'urori suna bin kaddarar kowane canje-canje na yau da kullun, abin da muke samu kayan aiki ne tare da sigar musamman. Wannan yana ba mu damar, alal misali, komawa zuwa sigar da ta gabata ta saitin idan ya cancanta. Har ila yau za mu iya amfani da tsarin daga shekara guda da ta wuce kuma tsarin zai yi aiki daidai. Daidaitaccen daidaitawa yana inganta tsinkaya da amincin tsarin da aka rarraba. Tun lokacin da aka saita saitin a matakin tattarawa, yana da matukar wahala a karya shi a samarwa.
  9. Modularity. Tsarin da aka tsara na zamani ne kuma ana iya haɗa nau'ikan ta hanyoyi daban-daban don ƙirƙirar tsarin daban-daban. Musamman, zaku iya saita tsarin don gudana akan kulli ɗaya a cikin tsari ɗaya, kuma akan nodes masu yawa a cikin wani. Kuna iya ƙirƙira saituna da yawa don samar da misalin tsarin.
  10. Gwaji. Ta hanyar maye gurbin sabis na mutum ɗaya tare da abubuwan izgili, zaku iya samun nau'ikan tsarin da yawa waɗanda suka dace don gwaji.
  11. Gwajin haɗin kai. Samun tsari guda ɗaya don dukan tsarin da aka rarraba ya sa ya yiwu a gudanar da duk abubuwan da aka gyara a cikin yanayi mai sarrafawa a matsayin wani ɓangare na gwajin haɗin kai. Yana da sauƙi a yi koyi, alal misali, halin da ake ciki inda wasu nodes suka zama m.

Hasara da iyakoki

Ƙimar da aka haɗa ta bambanta da sauran hanyoyin daidaitawa kuma ƙila ba ta dace da wasu aikace-aikace ba. A ƙasa akwai wasu rashin amfani:

  1. Tsayayyen tsari. Wani lokaci kuna buƙatar gyara da sauri a cikin samarwa, ketare duk hanyoyin kariya. Da wannan tsarin zai iya zama da wahala. Aƙalla, har yanzu ana buƙatar haɗawa da turawa ta atomatik. Wannan duka fasali ne mai amfani na tsarin da kuma rashin amfani a wasu lokuta.
  2. Ƙirƙirar tsari. Idan fayil ɗin daidaitawa ya samo asali ta kayan aiki ta atomatik, ana iya buƙatar ƙarin ƙoƙari don haɗa rubutun ginin.
  3. Kayan aiki. A halin yanzu, kayan aiki da dabarun da aka tsara don aiki tare da daidaitawa sun dogara ne akan fayilolin rubutu. Ba duk irin waɗannan kayan aiki/dabaru ba ne za su kasance a cikin tsarin da aka haɗa.
  4. Ana buƙatar canjin halaye. Masu haɓakawa da DevOps sun saba da fayilolin rubutu. Mahimmin ra'ayin tattara tsari na iya zama ɗan ba tsammani da sabon abu kuma yana haifar da ƙin yarda.
  5. Ana buƙatar tsarin haɓaka mai inganci. Domin samun kwanciyar hankali amfani da tsarin da aka haɗa, cikakken aiki da kai na tsarin gini da tura aikace-aikacen (CI/CD) ya zama dole. In ba haka ba zai zama da wuya.

Bari kuma mu dakata kan iyakoki da dama na misalin da aka yi la’akari da su ba su da alaƙa da ra’ayin tsarin daidaitawa:

  1. Idan muka samar da bayanan sanyi mara amfani waɗanda kumburin ba ya amfani da su, to mai tarawa ba zai taimaka mana gano aikin da ya ɓace ba. Ana iya magance wannan matsalar ta hanyar watsi da Tsarin Kek da kuma amfani da nau'i mai tsauri, misali, HList ko nau'in bayanan algebra (azuzuwan shari'a) don wakiltar daidaitawa.
  2. Akwai layuka a cikin fayil ɗin daidaitawa waɗanda basu da alaƙa da daidaitawar kanta: (package, import,Bayanan abu; override def's don sigogi waɗanda ke da ƙimar tsoho). Ana iya guje wa wannan ɗan lokaci idan kun aiwatar da DSL ɗin ku. Bugu da kari, wasu nau'ikan daidaitawa (misali, XML) kuma suna sanya wasu ƙuntatawa akan tsarin fayil.
  3. Don dalilan wannan sakon, ba ma yin la'akari da sake daidaitawa ta gungu na nodes iri ɗaya ba.

ƙarshe

A cikin wannan sakon, mun bincika ra'ayin wakilcin daidaitawa a cikin lambar tushe ta amfani da damar ci gaba na tsarin nau'in Scala. Ana iya amfani da wannan hanyar a aikace-aikace daban-daban azaman maye gurbin hanyoyin daidaitawa na gargajiya bisa xml ko fayilolin rubutu. Ko da yake ana aiwatar da misalinmu a cikin Scala, ana iya canza ra'ayoyin iri ɗaya zuwa wasu harsunan da aka haɗa (kamar Kotlin, C #, Swift, ...). Kuna iya gwada wannan hanyar a cikin ɗayan ayyukan masu zuwa, kuma, idan bai yi aiki ba, matsa zuwa fayil ɗin rubutu, ƙara sassan da suka ɓace.

A zahiri, ƙayyadaddun ƙayyadaddun tsari yana buƙatar ingantaccen tsari na haɓakawa. A sakamakon haka, an tabbatar da ingancin inganci da amincin daidaitawa.

Hanyar da aka yi la'akari za a iya fadada:

  1. Kuna iya amfani da macros don yin cak na lokaci-lokaci.
  2. Kuna iya aiwatar da DSL don gabatar da saitin a hanyar da ta isa ga masu amfani da ƙarshen.
  3. Kuna iya aiwatar da sarrafa albarkatun albarkatu mai ƙarfi tare da daidaitawa ta atomatik. Misali, canza adadin nodes a cikin gungu yana buƙatar cewa (1) kowane kulli ya karɓi tsari daban-daban; (2) manajan cluster ya karɓi bayani game da sabbin nodes.

Godiya

Ina so in gode wa Andrei Saksonov, Pavel Popov da Anton Nekhaev saboda sukar da suka yi na daftarin labarin.

source: www.habr.com

Add a comment