Daidaitaccen tsari na tsarin rarrabawa

A cikin wannan sakon muna so mu raba hanya mai ban sha'awa ta mu'amala da daidaita tsarin da aka rarraba.
Tsarin yana wakilta kai tsaye a cikin yaren Scala a cikin nau'in aminci. An kwatanta aiwatar da misali a cikin cikakkun bayanai. An tattauna bangarori daban-daban na shawarwarin, gami da tasiri kan tsarin ci gaba gaba daya.

Daidaitaccen tsari na tsarin rarrabawa

(in Rashanci)

Gabatarwa

Gina ingantattun tsarin rarrabawa yana buƙatar amfani da daidaitaccen tsari mai daidaituwa akan duk nodes. Magani na yau da kullun shine a yi amfani da bayanin tura rubutu (terraform, mai yiwuwa ko wani abu iri ɗaya) kuma ana haifar da fayilolin sanyi ta atomatik (sau da yawa - sadaukarwa ga kowane kumburi / rawar). Za mu kuma so mu yi amfani da ka'idoji iri ɗaya na nau'ikan nau'ikan iri ɗaya akan kowane nodes ɗin sadarwa (in ba haka ba za mu fuskanci matsalolin rashin jituwa). A cikin duniyar JVM wannan yana nufin cewa aƙalla ɗakin karatun saƙo ya kamata ya zama nau'i ɗaya akan duk nodes ɗin sadarwa.

Me game da gwada tsarin? Tabbas, yakamata mu sami gwaje-gwajen naúrar don duk abubuwan haɗin gwiwa kafin zuwan gwajin haɗin kai. Don samun damar fitar da sakamakon gwaji a lokacin aiki, ya kamata mu tabbatar da cewa nau'ikan duk ɗakunan karatu an kiyaye su iri ɗaya a duka lokacin aiki da wuraren gwaji.

Lokacin gudanar da gwaje-gwajen haɗin kai, galibi yana da sauƙin samun hanyar aji iri ɗaya akan duk nodes. Muna buƙatar tabbatar da cewa an yi amfani da hanyar aji iri ɗaya akan turawa. (Yana yiwuwa a yi amfani da hanyoyi daban-daban akan nodes daban-daban, amma yana da wahala a wakilci wannan tsarin da kuma tura shi daidai.) Don haka don sauƙaƙe abubuwa kawai za mu yi la'akari da hanyoyi iri ɗaya akan duk nodes.

Kanfigareshan yana ƙoƙarin haɓakawa tare da software. Mu yawanci muna amfani da juzu'i don gano iri-iri
matakan juyin halittar software. Yana da ma'ana don rufe sanyi a ƙarƙashin sarrafa sigar kuma gano saiti daban-daban tare da wasu alamun. Idan akwai tsari ɗaya kawai a samarwa, ƙila mu yi amfani da siga ɗaya azaman mai ganowa. Wani lokaci muna iya samun yanayin samarwa da yawa. Kuma ga kowane yanayi muna iya buƙatar reshe na daidaitawa daban. Don haka ƙila a yi wa ƙayyadaddun lakabi tare da reshe da siga don gano saiti daban-daban na musamman. Kowane lakabin reshe da sigar ya dace da haɗuwa guda ɗaya na nodes da aka rarraba, tashoshin jiragen ruwa, albarkatun waje, nau'ikan ɗakin karatu na aji akan kowane kumburi. Anan za mu rufe reshe ɗaya ne kawai kuma za mu gano ƙayyadaddun ƙayyadaddun tsari ta nau'in ƙima na sassa uku (1.2.3), daidai da sauran kayan tarihi.

A cikin mahalli na zamani ba a sake gyara fayilolin sanyi da hannu ba. Yawanci muna samarwa
saita fayiloli a lokacin turawa da taba su daga baya. Don haka mutum zai iya tambaya me yasa har yanzu muke amfani da tsarin rubutu don fayilolin daidaitawa? Zaɓin da ya dace shine sanya sanyi a cikin naúrar haɗawa da fa'ida daga ingantaccen daidaitawar lokaci.

A cikin wannan sakon za mu bincika ra'ayin kiyaye daidaitawa a cikin kayan tarihi da aka haɗa.

Daidaitaccen tsari

A cikin wannan sashe za mu tattauna misali na daidaitawa a tsaye. Sabis guda biyu masu sauƙi - sabis na echo da abokin ciniki na sabis na echo ana tsarawa da aiwatar da su. Sa'an nan kuma tsarin rarraba daban-daban guda biyu tare da ayyukan biyu suna nan take. Ɗayan don daidaitawar kumburi ɗaya ne kuma ɗayan don daidaitawar nodes guda biyu.

Tsarin rarraba na yau da kullun ya ƙunshi ƴan nodes. Ana iya gano nodes ta amfani da wasu nau'ikan:

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

ko kawai

case class NodeId(hostName: String)

ko ma

object Singleton
type NodeId = Singleton.type

Waɗannan nodes suna yin ayyuka daban-daban, suna gudanar da wasu ayyuka kuma yakamata su iya sadarwa tare da sauran nodes ta hanyoyin haɗin TCP/HTTP.

Don haɗin TCP aƙalla ana buƙatar lambar tashar jiragen ruwa. Muna kuma son tabbatar da cewa abokin ciniki da uwar garken suna magana ɗaya yarjejeniya. Domin yin ƙirar haɗin kai tsakanin nodes bari mu ayyana aji mai zuwa:

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

inda Port shine kawai Int cikin kewayon da aka yarda:

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

Nau'i masu ladabi

Dubi tsabtace ɗakin karatu. A takaice, yana ba da damar ƙara ƙuntataccen lokaci zuwa wasu nau'ikan. A wannan yanayin Int kawai an yarda ya sami ƙimar 16-bit waɗanda zasu iya wakiltar lambar tashar jiragen ruwa. Babu buƙatar amfani da wannan ɗakin karatu don wannan tsarin daidaitawa. Da alama ya dace sosai.

Don HTTP (REST) ​​muna iya buƙatar hanyar sabis ɗin:

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

Nau'in fatalwa

Domin gano ƙa'idar yayin haɗawa muna amfani da fasalin Scala na ayyana irin gardama Protocol wanda ba a amfani da shi a cikin aji. Yana da ake kira nau'in fatalwa. A lokacin aiki da wuya muna buƙatar misalin mai gano yarjejeniya, shi ya sa ba ma adana shi. Yayin haɗa wannan nau'in fatalwa yana ba da ƙarin aminci. Ba za mu iya wuce tashar jiragen ruwa tare da ka'idar da ba daidai ba.

Ɗaya daga cikin ka'idojin da aka fi amfani da su shine REST API tare da jeri na Json:

sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]

inda RequestMessage shine tushen saƙon da abokin ciniki zai iya aikawa zuwa uwar garken kuma ResponseMessage shine saƙon amsawa daga uwar garken. Tabbas, ƙila mu ƙirƙiri wasu bayanan ƙa'idar da ke ƙayyadad da ka'idar sadarwa tare da daidaitattun da ake so.

Don dalilan wannan sakon za mu yi amfani da mafi sauƙi sigar yarjejeniya:

sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]

A cikin wannan yarjejeniya ana haɗa saƙon buƙatar buƙatar zuwa url kuma ana mayar da saƙon amsa azaman zaren fili.

Ana iya siffanta saitin sabis ta sunan sabis, tarin tashoshin jiragen ruwa da wasu abubuwan dogaro. Akwai 'yan hanyoyi masu yiwuwa na yadda ake wakiltar duk waɗannan abubuwan a cikin Scala (misali, HList, nau'ikan bayanan algebra). Don dalilan wannan post ɗin za mu yi amfani da Tsarin Kek kuma mu wakilci guntu masu haɗawa (modules) azaman halaye. (Tsarin Cake ba buƙatu ba ne don wannan tsarin tsarin daidaitawa. Yana da yuwuwar aiwatar da ra'ayin ɗaya kawai.)

Ana iya wakilta abubuwan dogaro ta amfani da Tsarin Cake azaman ƙarshen 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)
  }

Sabis na echo yana buƙatar saita tashar jiragen ruwa kawai. Kuma muna ayyana cewa wannan tashar jiragen ruwa tana goyan bayan ka'idar echo. Lura cewa ba ma buƙatar ƙayyade takamaiman tashar jiragen ruwa a halin yanzu, saboda yanayin yana ba da damar bayyana hanyoyin da ba a iya gani ba. Idan muka yi amfani da hanyoyin da ba za a iya amfani da su ba, mai tarawa zai buƙaci aiwatarwa a cikin misalin tsari. Anan mun samar da aiwatarwa (8081) kuma za a yi amfani da shi azaman ƙimar da aka saba da ita idan muka tsallake shi a cikin ƙayyadaddun tsari.

Za mu iya ayyana dogaro a cikin tsarin abokin ciniki na echo sabis:

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

Dogaro yana da nau'in iri ɗaya da echoService. Musamman, yana buƙatar ƙa'ida ɗaya. Don haka, za mu iya tabbata cewa idan muka haɗa waɗannan dogara guda biyu za su yi aiki daidai.

Aiwatar da ayyuka

Sabis yana buƙatar aiki don farawa da rufewa cikin alheri. (Ikon rufe sabis yana da mahimmanci don gwaji.) Har ila yau akwai ƴan zaɓuɓɓukan tantance irin wannan aikin don tsarin da aka bayar (misali, zamu iya amfani da nau'ikan nau'ikan). Don wannan post ɗin za mu sake amfani da Tsarin Cake. Za mu iya wakiltar sabis ta amfani da cats.Resource wanda ya riga ya ba da bracketing da sakin kayan aiki. Domin samun albarkatu ya kamata mu samar da tsari da wasu mahallin lokacin aiki. Don haka aikin fara sabis na iya zama kamar:

  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 daidaitawa wanda wannan mafarin sabis ɗin ke buƙata
  • AddressResolver - wani abu na lokaci-lokaci wanda ke da ikon samun ainihin adireshi na sauran nodes (ci gaba da karantawa don cikakkun bayanai).

sauran nau'ikan sun fito daga cats:

  • F[_] - nau'in sakamako (A cikin mafi sauƙi F[A] zai iya zama adalci () => A. A cikin wannan post za mu yi amfani cats.IO.)
  • Reader[A,B] - shi ne fiye ko žasa ma'anar ma'anar aiki A => B
  • cats.Resource - yana da hanyoyin siye da saki
  • Timer - damar yin barci / auna lokacin
  • ContextShift - analog na ExecutionContext
  • Applicative - wrapper na ayyuka a cikin tasiri (kusan mond) (zamu iya maye gurbin shi da wani abu dabam)

Yin amfani da wannan keɓancewar za mu iya aiwatar da ƴan ayyuka. 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](()))
  }

(Duba Lambar tushen don sauran ayyukan aiwatarwa - echo sabis,
echo abokin ciniki da kuma masu kula da rayuwa.)

Kumburi abu ne guda ɗaya wanda ke gudanar da ƴan ayyuka (farawa da jerin abubuwan da ake amfani da su ta hanyar Cake Pattern):

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

Lura cewa a cikin kumburi mun ƙayyade ainihin nau'in daidaitawar da ake buƙata ta wannan kumburi. Mai tarawa ba zai ƙyale mu mu gina abu (Cake) tare da ƙarancin nau'in ba, saboda kowane yanayin sabis yana bayyana takura akan Config nau'in. Hakanan ba za mu iya fara kumburi ba tare da samar da cikakken tsari ba.

Ƙaddamar adireshin node

Domin kafa haɗi muna buƙatar ainihin adireshin mai masaukin baki don kowane kumburi. Ana iya saninsa daga baya fiye da sauran sassan tsarin. Don haka, muna buƙatar hanyar samar da taswira tsakanin node id da ainihin adireshinsa. Wannan taswira aiki ne:

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

Akwai 'yan hanyoyin da za a iya aiwatar da irin wannan aikin.

  1. Idan mun san ainihin adireshi kafin turawa, yayin ƙaddamarwar runduna ta node, to, zamu iya samar da lambar Scala tare da ainihin adireshi kuma mu gudanar da ginin daga baya (wanda ke tattara bayanan lokaci sannan kuma yana gudanar da gwajin haɗakarwa). A wannan yanayin aikin taswirar mu sananne ne a tsaye kuma ana iya sauƙaƙe shi zuwa wani abu kamar a Map[NodeId, NodeAddress].
  2. Wani lokaci muna samun ainihin adireshi ne kawai a wani wuri lokacin da aka fara kumburin, ko kuma ba mu da adireshi na nodes waɗanda ba a fara ba tukuna. A wannan yanayin za mu iya samun sabis na ganowa wanda aka fara kafin duk sauran nodes kuma kowane kumburi zai iya tallata adreshin sa a cikin wannan sabis ɗin kuma ya shiga cikin abubuwan dogaro.
  3. Idan za mu iya gyara /etc/hosts, za mu iya amfani da predefined sunayen rundunar (kamar my-project-main-node da kuma echo-backend) kuma kawai haɗa wannan sunan tare da adireshin ip a lokacin ƙaddamarwa.

A cikin wannan post ɗin ba mu rufe waɗannan lamuran da ƙarin cikakkun bayanai ba. A zahiri a cikin misalin wasan wasanmu duk nodes zasu sami adireshin IP iri ɗaya - 127.0.0.1.

A cikin wannan sakon za mu yi la'akari da shimfidar tsarin rarraba guda biyu:

  1. Tsarin kumburi guda ɗaya, inda aka sanya duk sabis akan kulli ɗaya.
  2. Tsarin kumburi guda biyu, inda sabis da abokin ciniki ke kan nodes daban-daban.

Tsarin tsari don a kumburi guda ɗaya layout shine kamar haka:

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

Anan mun ƙirƙiri saiti guda ɗaya wanda ke haɓaka duka uwar garken da saitin abokin ciniki. Hakanan muna saita mai sarrafa rayuwa wanda yawanci zai ƙare abokin ciniki da uwar garken bayan lifetime tazara ta wuce.

Za a iya amfani da saitin aiwatar da sabis iri ɗaya da daidaitawa don ƙirƙirar shimfidar tsarin tare da kuɗaɗe daban-daban guda biyu. Muna buƙatar ƙirƙirar kawai biyu daban-daban node configs tare da ayyuka masu dacewa:

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

Dubi yadda muka ƙayyade abin dogaro. Mun ambaci sabis ɗin da aka bayar da ɗayan kumburin azaman abin dogaro na kumburin yanzu. Ana duba nau'in dogaro saboda yana ɗauke da nau'in fatalwa wanda ke bayyana ƙa'ida. Kuma a lokacin aiki za mu sami madaidaicin node id. Wannan yana ɗaya daga cikin mahimman abubuwan da aka tsara tsarin tsari. Yana ba mu ikon saita tashar jiragen ruwa sau ɗaya kawai kuma tabbatar da cewa muna yin nunin tashar tashar daidai.

aiwatar da nodes biyu

Don wannan saitin muna amfani da aiwatar da ayyuka iri ɗaya daidai. Babu canje-canje kwata-kwata. Koyaya, mun ƙirƙiri aiwatar da kumburi daban-daban guda biyu waɗanda suka ƙunshi saitin 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 gefen uwar garken. Kumburi na biyu yana aiwatar da abokin ciniki kuma yana buƙatar wani ɓangaren saiti. Duk nodes ɗin biyu suna buƙatar takamaiman takamaiman rayuwa. Don dalilan wannan kumburin sabis ɗin gidan zai sami tsawon rayuwa mara iyaka wanda za'a iya ƙare ta amfani da shi SIGTERM, yayin da echo abokin ciniki zai ƙare bayan da aka saita iyakacin lokaci. Duba cikin aikace-aikacen farawa don cikakken bayani.

Gabaɗaya tsarin haɓakawa

Bari mu ga yadda wannan hanyar ta canza yadda muke aiki tare da daidaitawa.

Za a haɗa tsarin daidaitawa azaman lambar kuma ya samar da kayan tarihi. Yana da ma'ana don ware kayan aikin saiti daga sauran kayan tarihi na lamba. Sau da yawa za mu iya samun ɗimbin daidaitawa akan tushe guda ɗaya. Kuma ba shakka, za mu iya samun mahara versions na daban-daban sanyi rassan. A cikin tsari za mu iya zaɓar takamaiman nau'ikan ɗakunan karatu kuma wannan zai ci gaba da kasancewa a duk lokacin da muka tura wannan saitin.

Canjin sanyi ya zama canjin lamba. Don haka yakamata a rufe shi da tsarin tabbatar da inganci iri ɗaya:

Tikitin -> PR -> bita -> hade -> ci gaba da haɗawa -> ci gaba da turawa

Akwai sakamako masu zuwa na hanyar:

  1. Tsarin yana daidaitawa don misalan tsarin musamman. Da alama babu wata hanyar samun haɗin kai marar kuskure tsakanin nodes.
  2. Ba shi da sauƙi a canza tsarin saiti kawai a cikin kulli ɗaya. Yana da alama rashin hankali don shiga da canza wasu fayilolin rubutu. Don haka ɓacin rai ya zama ƙasa da yuwuwa.
  3. Ƙananan canje-canjen daidaitawa ba su da sauƙi a yi.
  4. Yawancin canje-canjen tsarin za su bi tsarin ci gaba iri ɗaya, kuma zai wuce wasu bita.

Shin muna buƙatar wurin ajiya daban don daidaitawar samarwa? Tsarin samarwa yana iya ƙunsar mahimman bayanai waɗanda muke son kiyayewa daga isar mutane da yawa. Don haka yana iya zama darajar adana keɓaɓɓen ma'ajiya tare da ƙuntataccen damar da zai ƙunshi tsarin samarwa. Za mu iya raba sanyi zuwa sassa biyu - ɗaya wanda ya ƙunshi mafi yawan buɗaɗɗen sigogi na samarwa da ɗaya wanda ya ƙunshi ɓangaren sirri na daidaitawa. Wannan zai ba da damar samun dama ga yawancin masu haɓakawa zuwa mafi yawan sigogi yayin da ke hana samun dama ga abubuwa masu mahimmanci. Yana da sauƙi don cim ma wannan ta amfani da sifofi na tsaka-tsaki tare da tsoffin ma'auni.

Bambance-bambance

Bari mu ga ribobi da fursunoni na tsarin da aka tsara idan aka kwatanta da sauran dabarun sarrafa tsari.

Da farko, za mu lissafa wasu hanyoyi zuwa sassa daban-daban na hanyar da aka tsara na mu'amala da daidaitawa:

  1. Fayil ɗin rubutu akan na'urar da aka yi niyya.
  2. Ma'ajiyar ƙima ta tsakiya (kamar etcd/zookeeper).
  3. Ƙarfafa abubuwan da za a iya sake tsarawa/sake farawa ba tare da sake farawa ba.
  4. Kanfigareshan waje kayan tarihi da sarrafa sigar.

Fayil ɗin rubutu yana ba da ɗan sassauci dangane da gyaran ad-hoc. Mai gudanar da tsarin zai iya shiga cikin kumburin manufa, yin canji kuma kawai ta sake kunna sabis ɗin. Wannan bazai yi kyau sosai ga manyan tsarin ba. Babu wata alama da aka bari a bayan canjin. Canjin ba a sake duba shi ta wasu idanu biyu. Zai yi wuya a gano abin da ya haifar da canjin. Ba a gwada shi ba. Daga hangen nesa na tsarin rarraba mai gudanarwa zai iya mantawa kawai don sabunta tsarin a ɗaya daga cikin sauran nodes.

(Btw, idan a ƙarshe za a sami buƙatar fara amfani da fayilolin daidaitawa na rubutu, kawai za mu ƙara ingantawa + mai inganci wanda zai iya samar da iri ɗaya. Config rubuta kuma wannan zai isa ya fara amfani da saitunan rubutu. Wannan kuma yana nuna cewa ƙayyadaddun tsarin daidaitawa-lokaci ya ɗan ƙanƙanta da ƙayyadaddun tsarin tsarin rubutu, domin a cikin sigar tushen rubutu muna buƙatar ƙarin lamba.)

Adana maɓalli-ƙimar maɓalli hanya ce mai kyau don rarraba sigogin meta na aikace-aikace. Anan muna buƙatar yin tunani game da abin da muke la'akari da ƙimar daidaitawa da menene kawai bayanai. An ba da aiki C => A => B mu yawanci kira da wuya canza dabi'u C "Configuration", yayin da akai-akai canza bayanai A - kawai shigar da bayanai. Ya kamata a ba da tsari ga aikin a baya fiye da bayanan A. Ganin wannan ra'ayin za mu iya cewa ana tsammanin yawan canje-canjen abin da za a iya amfani da shi don bambance bayanan sanyi daga bayanai kawai. Hakanan bayanai yawanci suna fitowa daga tushe ɗaya (mai amfani) kuma daidaitawar ta fito daga wani tushe daban (admin). Ma'amala da sigogi waɗanda za'a iya canzawa bayan tsarin farawa yana haifar da haɓaka ƙwarewar aikace-aikacen. Don irin waɗannan sigogi dole ne mu sarrafa tsarin isar da su, tantancewa da tabbatarwa, sarrafa ƙimar da ba daidai ba. Don haka, don rage rikitar shirin, zai fi kyau mu rage adadin sigogin da za su iya canzawa a lokacin aiki (ko ma kawar da su gaba ɗaya).

Daga mahangar wannan matsayi ya kamata mu bambanta tsakanin sigogi masu tsauri da tsauri. Idan dabarar sabis na buƙatar sauƙaƙan canji na wasu sigogi a lokacin aiki, to muna iya kiran su sigogi masu ƙarfi. In ba haka ba sun tsaya tsayin daka kuma ana iya daidaita su ta amfani da tsarin da aka tsara. Don sake daidaitawa mai ƙarfi ana iya buƙatar wasu hanyoyin. Misali, ana iya sake kunna ɓangarorin tsarin tare da sabbin sigogin daidaitawa a cikin irin wannan hanya don sake kunna tsarin da aka rarraba daban-daban.
(Ra'ayi na tawali'u shine don guje wa sake saita lokacin aiki saboda yana ƙara rikitarwa na tsarin.
Yana iya zama mai sauƙi ga kawai dogara ga tallafin OS na matakan sake farawa. Ko da yake, ba koyaushe zai yiwu ba.)

Wani muhimmin al'amari na yin amfani da tsayayyen tsari wanda wani lokaci yana sa mutane suyi la'akari da tsauri mai ƙarfi (ba tare da wasu dalilai ba) shine raguwar lokacin sabis yayin sabunta tsarin. Lallai, idan dole ne mu yi canje-canje ga tsayayyen tsari, dole ne mu sake kunna tsarin ta yadda sabbin dabi'u za su yi tasiri. Abubuwan da ake buƙata don raguwa sun bambanta don tsarin daban-daban, don haka bazai zama mahimmanci ba. Idan yana da mahimmanci, to dole ne mu shirya gaba don kowane tsarin sake farawa. Misali, zamu iya aiwatarwa AWS ELB haɗin magudanar ruwa. A cikin wannan yanayin a duk lokacin da muke buƙatar sake kunna tsarin, za mu fara sabon misalin tsarin a layi daya, sannan mu canza ELB zuwa gare shi, yayin da barin tsohon tsarin ya kammala aikin haɗin yanar gizo.

Me game da adana sanyi a cikin sigar kayan tarihi ko waje? Ajiye sanyi a cikin kayan tarihi yana nufin a mafi yawan lokuta wannan saitin ya wuce tsarin tabbatar da inganci iri ɗaya kamar sauran kayan tarihi. Don haka wanda zai iya tabbatar da cewa tsarin yana da inganci mai kyau kuma amintacce. Sabanin daidaitawa a cikin wani fayil daban yana nufin cewa babu alamun wane da kuma dalilin da yasa aka canza wannan fayil ɗin. Shin wannan yana da mahimmanci? Mun yi imanin cewa don yawancin tsarin samarwa yana da kyau a sami kwanciyar hankali da ingantaccen tsari.

Siffar kayan tarihi tana ba da damar gano lokacin da aka ƙirƙira shi, menene ƙimar ta ƙunsa, waɗanne fasaloli da aka kunna / nakasa, wanda ke da alhakin yin kowane canji a cikin tsarin. Yana iya buƙatar ɗan ƙoƙari don kiyaye tsari a cikin kayan tarihi kuma zaɓi ne na ƙira don yin.

Ribobi & fursunoni

Anan muna so mu haskaka wasu fa'idodi kuma mu tattauna wasu rashin amfanin tsarin da aka tsara.

Abũbuwan amfãni

Siffofin haɗaɗɗiyar tsarin tsarin da aka rarraba cikakke:

  1. Duban daidaitawa a tsaye. Wannan yana ba da babban matakin amincewa, cewa daidaitawa daidai ne da aka ba da nau'in ƙuntatawa.
  2. Yaren daidaitacce. Yawanci sauran hanyoyin daidaitawa suna iyakance ga mafi yawan canji.
    Yin amfani da Scala mutum na iya amfani da faffadan fasalulluka na harshe don inganta daidaitawa. Misali, zamu iya amfani da halaye don samar da dabi'u na asali, abubuwa don saita iyakoki daban-daban, zamu iya komawa zuwa valAn ayyana sau ɗaya kawai a cikin iyakar waje (DRY). Yana yiwuwa a yi amfani da jeri na zahiri, ko misalan wasu azuzuwan (Seq, Map, da dai sauransu).
  3. DSL. Scala yana da ingantaccen goyon baya ga marubutan DSL. Mutum na iya amfani da waɗannan fasalulluka don kafa yaren daidaitawa wanda ya fi dacewa da abokantaka na ƙarshe, ta yadda saitin ƙarshe ya kasance aƙalla ana iya karantawa ta masu amfani da yanki.
  4. Mutunci da daidaituwa a fadin nodes. Ɗaya daga cikin fa'idodin samun daidaitawa ga tsarin da aka rarraba gabaɗaya a wuri ɗaya shine cewa duk ƙimar ana bayyana su sau ɗaya sannan a sake amfani da su a duk wuraren da muke buƙatar su. Hakanan a buga sanarwar tashar jiragen ruwa mai aminci a tabbatar da cewa a cikin duk daidaitattun saitunan tsarin kudurorin tsarin za su yi magana da yare ɗaya. Akwai takamaiman abin dogaro tsakanin nodes wanda ke sa da wuya a manta da samar da wasu ayyuka.
  5. Babban ingancin canje-canje. Gabaɗaya tsarin wucewa na daidaitawa yana canzawa ta hanyar tsarin PR na yau da kullun yana kafa manyan ma'auni na inganci kuma a cikin tsari.
  6. Canje-canje na daidaitawa na lokaci ɗaya. Duk lokacin da muka yi kowane canje-canje a cikin saitin turawa ta atomatik yana tabbatar da cewa ana sabunta duk nodes.
  7. Sauƙaƙe aikace-aikace. Aikace-aikacen baya buƙatar tantancewa da tabbatar da tsari da sarrafa ƙimar sanyi mara daidai. Wannan yana sauƙaƙe aikace-aikacen gabaɗaya. (Wasu ƙara yawan abubuwa masu rikitarwa yana cikin tsari da kanta, amma abin da ke sane da shi ne zuwa aminci.) Yana da kyau madaidaiciya madaidaiciya don komawa zuwa ga sanyi - kawai ƙara abubuwan da suka ɓace. Yana da sauƙin farawa tare da haɗaɗɗen tsari da jinkirta aiwatar da ƙarin guda zuwa wasu lokuta na gaba.
  8. Tsarin tsari. Saboda gaskiyar cewa canje-canjen sanyi suna bin tsarin ci gaba iri ɗaya, sakamakon haka muna samun kayan tarihi tare da sigar musamman. Yana ba mu damar musanya saitin baya idan an buƙata. Har ma za mu iya tura tsarin da aka yi amfani da shi a shekara guda da ta wuce kuma zai yi aiki daidai da wannan hanya. Ƙaƙwalwar kwanciyar hankali yana inganta tsinkaya da amincin tsarin rarraba. An daidaita tsarin a lokacin tattarawa kuma ba za'a iya sauƙaƙewa akan tsarin samarwa ba.
  9. Modularity. Tsarin da aka tsara na zamani ne kuma ana iya haɗa su ta hanyoyi daban-daban don
    goyi bayan jeri daban-daban (saituna / shimfidawa). Musamman ma, yana yiwuwa a sami ƙaramin sikeli guda ɗaya shimfidar kulli da babban saitin kulli mai yawa. Yana da ma'ana don samun shimfidu na samarwa da yawa.
  10. Gwaji. Don dalilai na gwaji, ana iya aiwatar da sabis na izgili da amfani da shi azaman abin dogaro ta wata hanya mai aminci. Ana iya kiyaye ƴan shimfidu na gwaji daban-daban tare da sassa daban-daban waɗanda aka maye gurbinsu da izgili a lokaci guda.
  11. Gwajin haɗin kai. Wani lokaci a cikin tsarin rarraba yana da wahala a gudanar da gwaje-gwajen haɗin kai. Yin amfani da hanyar da aka kwatanta don rubuta amintaccen tsari na cikakken tsarin rarraba, za mu iya gudanar da duk sassan da aka rarraba akan sabar guda ɗaya ta hanyar sarrafawa. Yana da sauƙi a yi koyi da yanayin
    lokacin da ɗaya daga cikin sabis ɗin ya zama babu.

disadvantages

Hanyar daidaitawa da aka haɗa ta bambanta da tsarin "na al'ada" kuma bazai dace da duk buƙatu ba. Anan ga wasu daga cikin rashin lahani na tsarin da aka haɗa:

  1. Tsayayyen tsari. Maiyuwa bazai dace da duk aikace-aikace ba. A wasu lokuta akwai buƙatar gyara da sauri a cikin samarwa ta ƙetare duk matakan tsaro. Wannan hanya ta sa ya fi wahala. Ana buƙatar haɗawa da sake aiki bayan yin kowane canji a cikin tsari. Wannan shi ne duka siffa da nauyi.
  2. Ƙirƙirar tsari. Lokacin da aka samar da saitin ta wasu kayan aikin atomatik wannan tsarin yana buƙatar haɗawa ta gaba (wanda zai iya yin kasawa). Yana iya buƙatar ƙarin ƙoƙari don haɗa wannan ƙarin matakin cikin tsarin ginin.
  3. Kayan aiki. Akwai kayan aikin da yawa da ake amfani da su a yau waɗanda suka dogara da saiti na tushen rubutu. Wasu daga cikinsu
    ba zai yi aiki ba lokacin da aka haɗa saitin.
  4. Ana buƙatar canjin tunani. Masu haɓakawa da DevOps sun saba da fayilolin tsarin rubutu. Tunanin tattara saitin na iya zama baƙon abu a gare su.
  5. Kafin gabatar da haɗe-haɗe, ana buƙatar ingantaccen tsarin haɓaka software.

Akwai wasu iyakoki na misalin da aka aiwatar:

  1. Idan muka samar da ƙarin saitin da ba a buƙatar aiwatar da kumburi ba, mai tarawa ba zai taimaka mana mu gano aiwatar da ba ya nan. Ana iya magance wannan ta hanyar amfani HList ko ADTs (azuzuwan shari'a) don daidaitawar kumburi maimakon halaye da Tsarin Cake.
  2. Dole ne mu samar da wani tukunyar jirgi a cikin fayil ɗin daidaitawa: (package, import, object sanarwa;
    override def's don sigogi waɗanda ke da ƙimar tsoho). Ana iya magance wannan wani ɓangare ta amfani da DSL.
  3. A cikin wannan post ɗin ba mu rufe tsayayyen sake daidaitawa na gungu na nodes iri ɗaya ba.

Kammalawa

A cikin wannan sakon mun tattauna ra'ayin wakiltar daidaitawa kai tsaye a cikin lambar tushe ta hanyar aminci. Za a iya amfani da tsarin a aikace-aikace da yawa azaman maye gurbin xml- da sauran saiti na tushen rubutu. Duk da cewa an aiwatar da misalinmu a cikin Scala, ana iya fassara shi zuwa wasu harsunan da aka haɗa (kamar Kotlin, C #, Swift, da sauransu). Mutum na iya gwada wannan hanyar a cikin sabon aikin kuma, idan bai dace da kyau ba, canza zuwa tsohuwar hanyar da aka kera.

Tabbas, daidaitawar da aka haɗa tana buƙatar ingantaccen tsari na haɓaka. A mayar da shi yayi alƙawarin samar da daidaitaccen tsari mai ƙarfi mai inganci.

Ana iya fadada wannan hanyar ta hanyoyi daban-daban:

  1. Mutum na iya amfani da macros don yin ingantattun daidaitawa da kasawa a lokacin tattarawa idan akwai gazawar dabarun kasuwanci.
  2. Ana iya aiwatar da DSL don wakiltar tsari ta hanyar abokantaka na yanki.
  3. Gudanar da albarkatu mai ƙarfi tare da daidaitawa ta atomatik. Misali, lokacin da muka daidaita adadin nodes ɗin gungu za mu iya so (1) nodes ɗin don samun gyare-gyaren tsari; (2) manajan tari don karɓar sabbin bayanan nodes.

Thanks

Ina so in ce na gode wa Andrey Saksonov, Pavel Popov, Anton Nehaev don ba da ra'ayi mai ban sha'awa game da daftarin wannan sakon da ya taimaka mini in bayyana shi.

source: www.habr.com