Mu positi iyi tikufuna kugawana njira yosangalatsa yothanirana ndi kasinthidwe kadongosolo logawidwa.
Kukonzekera kumayimiridwa mwachindunji muchilankhulo cha Scala mwanjira yotetezeka. Chitsanzo kukhazikitsa chikufotokozedwa mwatsatanetsatane. Mbali zosiyanasiyana za ndondomekoyi zikukambidwa, kuphatikizapo chikoka pa chitukuko chonse.
Introduction
Kupanga machitidwe ogawa olimba kumafuna kugwiritsa ntchito koyenera komanso kogwirizana pamanode onse. Njira yothetsera vutoli ndikugwiritsa ntchito kufotokozera kwa malemba (terraform, ansible kapena chinachake chofanana) ndi mafayilo osinthidwa okha (nthawi zambiri - operekedwa pa node / gawo lililonse). Tikufunanso kugwiritsa ntchito ma protocol omwewo pamagawo aliwonse olumikizirana (kupanda kutero tingakumane ndi zosagwirizana). M'dziko la JVM izi zikutanthauza kuti laibulale yotumizira mauthenga iyenera kukhala yofanana pamitundu yonse yolumikizirana.
Nanga bwanji kuyesa dongosolo? Zachidziwikire, tiyenera kukhala ndi mayeso a mayunitsi pazinthu zonse tisanabwere ku mayeso ophatikiza. Kuti tithe kutulutsa zotsatira za mayeso pa nthawi yothamanga, tiyenera kuwonetsetsa kuti zomasulira za malaibulale onse zikusungidwa mofanana m'malo oyeserera komanso nthawi yoyeserera.
Mukayesa kuyesa kuphatikiza, nthawi zambiri zimakhala zosavuta kukhala ndi njira yofanana pamanode onse. Tiyenera kuwonetsetsa kuti kalasi yomweyi ikugwiritsidwa ntchito potumiza. (N'zotheka kugwiritsa ntchito njira zosiyanasiyana zamakalasi pamanode osiyanasiyana, koma ndizovuta kwambiri kuyimira kasinthidwe uku ndikuyika moyenera.) Kotero kuti zinthu zikhale zosavuta tidzangoganizira zamagulu ofanana pamagulu onse.
Kukonzekera kumakonda kusinthika pamodzi ndi mapulogalamu. Nthawi zambiri timagwiritsa ntchito matembenuzidwe kuzindikira zosiyanasiyana
magawo a kusintha kwa mapulogalamu. Zikuwoneka zomveka kubisa masinthidwe pansi pa kasamalidwe ka mtunduwo ndikuzindikira masinthidwe osiyanasiyana ndi zilembo zina. Ngati pali masinthidwe amodzi okha, titha kugwiritsa ntchito mtundu umodzi ngati chizindikiritso. Nthawi zina titha kukhala ndi malo angapo opanga. Ndipo pa chilengedwe chilichonse tingafunike nthambi yosinthira. Chifukwa chake masinthidwe amatha kulembedwa ndi nthambi ndi mtundu kuti azindikire masinthidwe osiyanasiyana. Chilembo chilichonse chanthambi ndi mtundu zimafanana ndi kuphatikiza kumodzi kwa ma node, madoko, zida zakunja, mitundu ya library ya classpath pa node iliyonse. Apa tingoyang'ana nthambi imodzi ndikuzindikira masanjidwe ndi magawo atatu a decimal (1.2.3), mofanana ndi zinthu zina zakale.
M'malo amakono mafayilo amasinthidwe sasinthidwanso pamanja. Nthawi zambiri timapanga
config pa nthawi yotumiza ndi
Mu positi iyi tiwona lingaliro lakusunga kasinthidwe muzopangidwazo.
Kukonzekera kogwirizana
M'chigawo chino tikambirana chitsanzo cha static kasinthidwe. Ntchito ziwiri zosavuta - echo service ndi kasitomala wa echo service ikukonzedwa ndikukhazikitsidwa. Ndiye machitidwe awiri osiyana omwe amagawidwa omwe ali ndi mautumiki onsewa amakhazikitsidwa. Imodzi ndi ya kasinthidwe ka node imodzi ndi inanso ya ma node awiri.
Dongosolo logawanitsa lili ndi mfundo zingapo. Ma node amatha kudziwika pogwiritsa ntchito mitundu ina:
sealed trait NodeId
case object Backend extends NodeId
case object Frontend extends NodeId
kapena basi
case class NodeId(hostName: String)
kapena ngakhale
object Singleton
type NodeId = Singleton.type
Ma nodewa amagwira ntchito zosiyanasiyana, amayendetsa ntchito zina ndipo amayenera kulumikizana ndi ma node ena pogwiritsa ntchito ma TCP/HTTP.
Pa kulumikizana kwa TCP osachepera nambala ya doko ndiyofunika. Tikufunanso kuwonetsetsa kuti kasitomala ndi seva akulankhula njira yomweyo. Kuti tichite chitsanzo cha mgwirizano pakati pa nodes tiyeni tilengeze gulu ili:
case class TcpEndPoint[Protocol](node: NodeId, port: Port[Protocol])
kumene Port
ndi a Int
mkati mwa mtunda wololedwa:
type PortNumber = Refined[Int, Closed[_0, W.`65535`.T]]
Mitundu yoyengedwa
Onani Int
zimangololedwa kukhala ndi ma 16-bit omwe angayimire nambala ya doko. Palibe chifukwa chogwiritsa ntchito laibulale iyi pakukonzekera njira iyi. Zikungowoneka kuti zikugwirizana bwino kwambiri.
Kwa HTTP (REST) tingafunikenso njira yautumiki:
type UrlPathPrefix = Refined[String, MatchesRegex[W.`"[a-zA-Z_0-9/]*"`.T]]
case class PortWithPrefix[Protocol](portNumber: PortNumber, pathPrefix: UrlPathPrefix)
Mtundu wa Phantom
Kuti tidziwe protocol pakuphatikiza tikugwiritsa ntchito mawonekedwe a Scala polengeza mkangano wamtundu Protocol
zomwe sizimagwiritsidwa ntchito m'kalasi. Ndi zomwe zimatchedwa mtundu wa phantom. Pa nthawi yothamanga sitifuna kawirikawiri chizindikiro cha protocol, ndichifukwa chake sitimachisunga. Pakuphatikiza mtundu wa phantom umapereka chitetezo chamtundu wina. Sitingadutse doko ndi protocol yolakwika.
Imodzi mwama protocol omwe amagwiritsidwa ntchito kwambiri ndi REST API yokhala ndi Json serialization:
sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]
kumene RequestMessage
ndiye mtundu woyambira wa mauthenga omwe kasitomala angatumize ku seva ndi ResponseMessage
ndi meseji yoyankha kuchokera ku seva. Zachidziwikire, titha kupanga mafotokozedwe ena a protocol omwe amafotokozera njira yolumikizirana yomwe tikufuna.
Pazolinga za positi iyi tigwiritsa ntchito njira yosavuta ya protocol:
sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]
Mu uthenga wopempha wa protocol uwu umawonjezeredwa ku url ndipo uthenga wamayankho umabwezedwa ngati chingwe chosavuta.
Kukonzekera kwa ntchito kumatha kufotokozedwa ndi dzina lautumiki, gulu la madoko ndi zodalira zina. Pali njira zingapo zotheka zoyimira zinthu zonsezi ku Scala (mwachitsanzo, HList
, mitundu ya data ya algebraic). Pazifukwa za positi iyi tigwiritsa ntchito Keke Pattern ndikuyimira zidutswa zophatikiza (ma module) ngati mawonekedwe. (Pangani Keke sichofunikira panjira yophatikizika iyi. Ndi njira imodzi yokha yokwaniritsira lingalirolo.)
Kudalira kutha kuyimiridwa pogwiritsa ntchito Keke Pattern monga mapeto a mfundo zina:
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)
}
Ntchito ya Echo imangofunika doko lokhazikitsidwa. Ndipo tikulengeza kuti dokoli limathandizira echo protocol. Zindikirani kuti sitiyenera kutchula doko linalake pakadali pano, chifukwa chikhalidwechi chimalola kulengeza kwa njira zosadziwika. Ngati tigwiritsa ntchito njira zosawerengeka, compiler idzafuna kukhazikitsa muzochitika zosintha. Apa tapereka kukhazikitsidwa (8081
) ndipo idzagwiritsidwa ntchito ngati mtengo wokhazikika ngati tidumpha mu kasinthidwe konkire.
Titha kulengeza kudalira pakusintha kwa kasitomala wa echo:
trait EchoClientConfig[A] {
def testMessage: String = "test"
def pollInterval: FiniteDuration
def echoServiceDependency: HttpSimpleGetEndPoint[_, EchoProtocol[A]]
}
Kudalira kuli ndi mtundu wofanana ndi wa echoService
. Makamaka, imafuna protocol yomweyo. Chifukwa chake, titha kukhala otsimikiza kuti ngati tilumikiza zida ziwirizi zigwira ntchito moyenera.
Kukhazikitsa ntchito
Sevisi ikufunika kugwira ntchito kuti iyambike ndikuyimitsa mwaulemu. (Kutha kuyimitsa ntchito ndikofunikira pakuyezetsa.) Palinso njira zingapo zotchulira ntchito yotere pamakonzedwe operekedwa (mwachitsanzo, titha kugwiritsa ntchito makalasi amtundu). Pa positi iyi tigwiritsanso ntchito Keke Pattern. Tikhoza kuyimira ntchito pogwiritsa ntchito cats.Resource
zomwe zimapereka kale mabatani ndi kumasulidwa kwazinthu. Kuti tipeze gwero tiyenera kupereka kasinthidwe ndi nthawi yothamanga. Chifukwa chake ntchito yoyambira ntchito ikhoza kuwoneka ngati:
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]
}
kumene
Config
- mtundu wamasinthidwe omwe amafunikira ndi woyambitsa ntchitoyuAddressResolver
- chinthu chothamanga chomwe chimatha kupeza maadiresi enieni a node zina (pitirizani kuwerenga zambiri).
mitundu ina imachokera cats
:
F[_]
- mtundu wa zotsatira (M'njira yosavutaF[A]
zikhoza kukhala zolungama() => A
. Mu positi iyi tigwiritsa ntchitocats.IO
.)Reader[A,B]
- ndi mawu ofanana ndi ntchitoA => B
cats.Resource
- ali ndi njira zopezera ndi kumasulaTimer
- amalola kugona / kuyeza nthawiContextShift
-analogue yaExecutionContext
Applicative
- chopukutira ntchito (pafupifupi monad) (titha kusintha ndi china chake)
Pogwiritsa ntchito mawonekedwewa tikhoza kukhazikitsa mautumiki angapo. Mwachitsanzo, ntchito yomwe sichita chilichonse:
trait ZeroServiceImpl[F[_]] extends ServiceImpl[F] {
type Config <: Any
def resource(...): ResourceReader[F, Config, Unit] =
Reader(_ => Resource.pure[F, Unit](()))
}
(Onani
Node ndi chinthu chimodzi chomwe chimagwira ntchito zingapo (kuyambitsa zinthu zambiri kumathandizidwa ndi Cake Pattern):
object SingleNodeImpl extends ZeroServiceImpl[IO]
with EchoServiceService
with EchoClientService
with FiniteDurationLifecycleServiceImpl
{
type Config = EchoConfig[String] with EchoClientConfig[String] with FiniteDurationLifecycleConfig
}
Dziwani kuti mu node timafotokozera mtundu weniweni wa kasinthidwe komwe kumafunika ndi node iyi. Wopanga sangatilole kuti timange chinthucho (Keke) ndi mtundu wosakwanira, chifukwa mawonekedwe aliwonse amawonetsa cholepheretsa Config
mtundu. Komanso sitingathe kuyambitsa node popanda kupereka masinthidwe athunthu.
Kusintha kwa adilesi ya node
Kuti tikhazikitse kugwirizana timafunikira adiresi yeniyeni yeniyeni pa node iliyonse. Itha kudziwika mochedwa kuposa magawo ena a kasinthidwe. Chifukwa chake, tikufuna njira yoperekera mapu pakati pa node id ndi adilesi yake. Mapu awa ndi ntchito:
case class NodeAddress[NodeId](host: Uri.Host)
trait AddressResolver[F[_]] {
def resolve[NodeId](nodeId: NodeId): F[NodeAddress[NodeId]]
}
Pali njira zingapo zogwiritsira ntchito ntchitoyi.
- Ngati tidziwa maadiresi enieni tisanatumizidwe, panthawi yogwiritsira ntchito ma node, ndiye kuti tikhoza kupanga code ya Scala ndi maadiresi enieni ndikuyendetsa zomanga pambuyo pake (zomwe zimapanga kufufuza nthawi ndikuyendetsa mayeso ophatikizana). Pamenepa ntchito yathu yojambula mapu imadziwika mokhazikika ndipo imatha kusinthidwa kukhala chinthu chonga a
Map[NodeId, NodeAddress]
. - Nthawi zina timapeza maadiresi enieni pakapita nthawi pamene mfundo zayambika, kapena tilibe ma adilesi omwe sanayambitsidwebe. Apa titha kukhala ndi ntchito yotulukira yomwe imayambika ma node ena onse asanakhalepo ndipo node iliyonse imatha kulengeza ma adilesi ake muutumikiwo ndikulembetsa ku zodalira.
- Ngati tingathe kusintha
/etc/hosts
, titha kugwiritsa ntchito mayina omwe adafotokozedwa kale (mongamy-project-main-node
ndiecho-backend
) ndikuphatikiza dzinali ndi adilesi ya ip panthawi yotumiza.
Mu positi iyi sitikufotokoza zambiri za milanduyi. M'malo mwake muzoseweretsa wathu ma node onse adzakhala ndi adilesi yomweyo ya IP - 127.0.0.1
.
Mu positi iyi tiwona magawo awiri a dongosolo logawidwa:
- Mapangidwe a node amodzi, pomwe mautumiki onse amayikidwa pa node imodzi.
- Mapangidwe awiri a node, komwe ntchito ndi kasitomala zili pamagulu osiyanasiyana.
Kukonzekera kwa a
Kukonzekera kwa node imodzi
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.
}
Apa tikupanga kasinthidwe kamodzi komwe kumakulitsa kasinthidwe ka seva ndi kasitomala. Komanso timakonza chowongolera chamoyo chomwe chimathetsa kasitomala ndi seva pambuyo pake lifetime
pakapita nthawi.
Mipangidwe yofanana ya ntchito ndi masinthidwe angagwiritsidwe ntchito kupanga masanjidwe adongosolo ndi ma node awiri osiyana. Timangofunika kulenga
Awiri nodes kasinthidwe
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"
}
Onani momwe timafotokozera kudalira. Timatchula ntchito zina zoperekedwa ndi node ngati kudalira komwe kulipo. Mtundu wodalira umafufuzidwa chifukwa uli ndi mtundu wa phantom womwe umalongosola protocol. Ndipo panthawi yothamanga tidzakhala ndi id yolondola ya node. Ichi ndi chimodzi mwazinthu zofunika kwambiri pakukonza koyenera. Zimatipatsa kuthekera kokhazikitsa doko kamodzi kokha ndikuwonetsetsa kuti tikulozera doko lolondola.
Kukhazikitsa node ziwiri
Kukonzekera uku timagwiritsa ntchito machitidwe omwewo. Palibe zosintha. Komabe, timapanga mitundu iwiri yosiyana ya node yomwe imakhala ndi mautumiki osiyanasiyana:
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
}
Node yoyamba imagwiritsa ntchito seva ndipo imangofunika kasinthidwe ka seva. Node yachiwiri imagwiritsa ntchito kasitomala ndipo ikufunika gawo lina la config. Ma node onsewa amafunikira tsatanetsatane wa moyo wonse. Pazolinga za positi iyi node idzakhala ndi moyo wopanda malire womwe utha kuthetsedwa pogwiritsa ntchito SIGTERM
, pomwe kasitomala wa echo adzayimitsa pakatha nthawi yokhazikika. Onani
Njira yachitukuko chonse
Tiyeni tiwone momwe njirayi imasinthira momwe timagwirira ntchito ndi kasinthidwe.
Kukonzekera ngati code kudzapangidwa ndikupanga chojambula. Zikuoneka kuti n'zomveka kulekanitsa zokhazikitsidwa ndi ma code ena. Nthawi zambiri timatha kukhala ndi masinthidwe ambiri pama code omwewo. Ndipo zowonadi, titha kukhala ndi mitundu ingapo ya nthambi zosinthira zosiyanasiyana. Mu kasinthidwe titha kusankha mitundu ina ya malaibulale ndipo izi zikhalabe nthawi zonse tikamayika kasinthidwe.
Kusintha kwa kasinthidwe kumakhala kusintha kwa code. Chifukwa chake, ziyenera kutsatiridwa ndi njira yotsimikizika yofananira:
Tikiti -> PR -> ndemanga -> kuphatikiza -> kuphatikiza mosalekeza -> kutumizidwa mosalekeza
Pali zotsatira zotsatirazi za njira:
- Kukonzekera kumayenderana ndi zochitika zamakina ena. Zikuwoneka kuti palibe njira yolumikizirana yolakwika pakati pa node.
- Sikophweka kusintha kasinthidwe mu mfundo imodzi yokha. Zikuwoneka kuti sizomveka kulowa ndikusintha mafayilo amawu. Kotero kasinthidwe kachitidwe kumakhala kocheperako.
- Zosintha zazing'ono zosintha sizovuta kupanga.
- Zosintha zambiri zamasinthidwe zidzatsata njira yofananira yachitukuko, ndipo zidzapereka ndemanga.
Kodi tikufuna malo osiyana kuti tikonze zopanga? Zokonda kupanga zitha kukhala ndi zidziwitso zodziwikiratu zomwe tikufuna kuti anthu ambiri asakumane nazo. Chifukwa chake kungakhale koyenera kusunga malo osiyana omwe ali ndi malire omwe angakhale ndi kasinthidwe kapangidwe. Titha kugawa kasinthidwe m'magawo awiri - imodzi yomwe ili ndi magawo otseguka kwambiri opangira komanso yomwe ili ndi gawo lachinsinsi la kasinthidwe. Izi zipangitsa mwayi wofikira kwa omanga ambiri ku magawo ambiri kwinaku akuletsa mwayi wopeza zinthu zovuta kwambiri. Ndikosavuta kuchita izi pogwiritsa ntchito zikhalidwe zapakatikati zokhala ndi magawo osasinthika.
Kusiyanasiyana
Tiyeni tiwone zabwino ndi zoyipa za njira yomwe ikufunsidwa poyerekeza ndi njira zina zoyendetsera kasinthidwe.
Choyamba, tilemba njira zingapo kuzinthu zosiyanasiyana za njira yomwe ikufunsidwa yochitira ndi kasinthidwe:
- Lembani fayilo pamakina omwe mukufuna.
- Centralized key-value yosungirako (monga
etcd
/zookeeper
). - Zigawo za subprocess zomwe zitha kukonzedwanso / kuyambiranso popanda kuyambiranso.
- Kukonzekera kunja kwa zinthu zakale ndi kuwongolera mtundu.
Fayilo yamalemba imapereka kusinthika kwina malinga ndi zosintha za ad-hoc. Woyang'anira dongosolo atha kulowa mu node yomwe mukufuna, kusintha ndikungoyambitsanso ntchitoyo. Izi sizingakhale zabwino kwa machitidwe akuluakulu. Palibe zotsalira zomwe zasiyidwa pambuyo pakusintha. Kusintha sikuwunikiridwanso ndi maso ena. Zingakhale zovuta kudziwa chomwe chapangitsa kusinthaku. Sizinayesedwe. Kuchokera pamawonekedwe a dongosolo logawidwa, woyang'anira akhoza kungoiwala kusintha kasinthidwe mu imodzi mwa mfundo zina.
(Btw, ngati pamapeto pake padzakhala kufunika koyamba kugwiritsa ntchito mafayilo osinthira malemba, tidzangowonjezera parser + validator yomwe ingathe kupanga zomwezo. Config
type ndipo zingakhale zokwanira kuyamba kugwiritsa ntchito ma configs. Izi zikuwonetsanso kuti zovuta zamasinthidwe a nthawi yophatikizira ndizocheperako pang'ono kuti zovuta za ma configs ozikidwa palemba, chifukwa pamawu omasulira timafunikira ma code ena.)
Kusungidwa kwamtengo wapatali wapakati ndi njira yabwino yogawa magawo a meta. Apa tikuyenera kuganizira zomwe timaziona ngati zosintha komanso zomwe ndi data chabe. Kupatsidwa ntchito C => A => B
nthawi zambiri timatcha zikhalidwe zomwe sizisintha kawirikawiri C
"kusintha", pomwe data imasinthidwa pafupipafupi A
- ingolowetsani deta. Kukonzekera kuyenera kuperekedwa ku ntchitoyi kale kuposa deta A
. Chifukwa cha lingaliro ili titha kunena kuti zimayembekezereka kusintha komwe kungagwiritsidwe ntchito kusiyanitsa zosintha ndi data yokha. Komanso deta nthawi zambiri imachokera ku gwero limodzi (wosuta) ndipo kasinthidwe amachokera ku gwero lina (admin). Kuchita ndi magawo omwe angasinthidwe pambuyo poyambitsa kumayambitsa kuwonjezereka kwa zovuta zogwiritsira ntchito. Pazigawo zotere tidzayenera kuthana ndi njira yawo yobweretsera, kugawa ndi kutsimikizira, kuthana ndi zolakwika. Chifukwa chake, kuti tichepetse zovuta zamapulogalamu, kuli bwino tichepetse kuchuluka kwa magawo omwe angasinthe panthawi yothamanga (kapena kuwachotseratu).
Kuchokera pamalingaliro a positi iyi tiyenera kupanga kusiyana pakati pa magawo osasunthika ndi osinthika. Ngati ndondomeko ya utumiki ikufuna kusintha kosowa kwa magawo ena panthawi yothamanga, tikhoza kuwatcha ma parameters osinthika. Kupanda kutero amakhala osasunthika ndipo amatha kukhazikitsidwa pogwiritsa ntchito njira yomwe akufunira. Pakukonzanso kosinthika njira zina zitha kufunikira. Mwachitsanzo, magawo a dongosololi akhoza kuyambiranso ndi magawo atsopano a kasinthidwe mofananamo kuti ayambitsenso njira zosiyana za dongosolo logawidwa.
(Lingaliro langa lodzichepetsa ndikupewa kukonzanso nthawi yothamanga chifukwa kumawonjezera zovuta zamakina.
Zitha kukhala zowongoka kwambiri kungodalira chithandizo cha OS pakuyambiranso njira. Komabe, sizingakhale zotheka nthawi zonse.)
Mbali imodzi yofunikira pakugwiritsa ntchito kasinthidwe kokhazikika komwe nthawi zina kumapangitsa anthu kuganiza zosintha (popanda zifukwa zina) ndi kutha kwa ntchito panthawi yosinthira. Zowonadi, ngati tikuyenera kusintha masinthidwe okhazikika, tiyenera kuyambitsanso dongosolo kuti zikhalidwe zatsopano zikhale zogwira mtima. Zofunikira pakuchepetsa nthawi zimasiyanasiyana pamakina osiyanasiyana, chifukwa chake sizingakhale zovuta. Ngati ndizovuta, ndiye kuti tiyenera kukonzekera pasadakhale kuti tiyambitsenso dongosolo lililonse. Mwachitsanzo, tikhoza kukhazikitsa
Nanga bwanji kusunga kasinthidwe mkati mwazojambula zosinthidwa kapena zakunja? Kusunga kasinthidwe mkati mwa chinthu chopangidwa kumatanthauza nthawi zambiri kuti kasinthidwe kameneka kamadutsa njira yotsimikizira zamtundu wofanana ndi zina. Chifukwa chake wina akhoza kukhala wotsimikiza kuti kasinthidwe ndi kabwino komanso kodalirika. M'malo mwake kasinthidwe mu fayilo yosiyana kumatanthauza kuti palibe zowonetsa za ndani komanso chifukwa chiyani adasintha fayiloyo. Kodi izi ndizofunikira? Timakhulupilira kuti pamakina ambiri opanga ndi bwino kukhala okhazikika komanso apamwamba kwambiri.
Mtundu wa chinthucho umalola kudziwa nthawi yomwe idapangidwa, zomwe zili ndi mfundo zake, ndi zinthu ziti zomwe zimayatsidwa / kuzimitsa, yemwe anali ndi udindo wopanga kusintha kulikonse. Zingafunike kuyesetsa kuti musunge zosinthika mkati mwazojambula ndipo ndi kusankha koyenera kupanga.
Ubwino & kuipa
Apa tikufuna tiwunikire zabwino zina ndikukambirana zovuta zina za njira yomwe akufunsidwa.
ubwino
Mawonekedwe a kasinthidwe kophatikizana kwa dongosolo lonse logawidwa:
- Kuwunika kokhazikika kwa kasinthidwe. Izi zimapereka chidaliro chachikulu, kuti kasinthidwe ndi kolondola kupatsidwa zovuta zamtundu.
- Chilankhulo chochulukira cha kasinthidwe. Nthawi zambiri masinthidwe njira zina zimangokhala pazosintha zambiri.
Kugwiritsa ntchito Scala munthu amatha kugwiritsa ntchito zilankhulo zingapo kuti masinthidwe ake akhale abwino. Mwachitsanzo, titha kugwiritsa ntchito mikhalidwe kuti tipereke zikhalidwe zosasinthika, zinthu zomwe zingakhazikike mosiyanasiyana, zomwe tingatchuleval
s amatanthauzidwa kamodzi kokha mu mawonekedwe akunja (DRY). Ndikotheka kugwiritsa ntchito kutsata kwenikweni, kapena zochitika zamagulu ena (Seq
,Map
, Ndi zina zotero). - DSL. Scala ili ndi chithandizo chabwino kwa olemba a DSL. Mmodzi angagwiritse ntchito zinthuzi kuti akhazikitse chinenero chokonzekera chomwe chiri chosavuta komanso chosavuta kugwiritsa ntchito, kotero kuti kasinthidwe komaliza ndi kowerengeka ndi ogwiritsa ntchito.
- Umphumphu ndi kugwirizana pa mfundo zonse. Ubwino umodzi wokhala ndi kasinthidwe kadongosolo lonse logawidwa pamalo amodzi ndikuti zikhalidwe zonse zimafotokozedwa kamodzi ndiyeno zimagwiritsidwanso ntchito m'malo onse omwe timazifuna. Komanso lembani zidziwitso zotetezeka zamadoko ziwonetsetse kuti pamasinthidwe onse olondola ma node amalankhula chilankhulo chimodzi. Pali kudalira pakati pa ma node zomwe zimapangitsa kuti zikhale zovuta kuiwala kupereka ntchito zina.
- Kusintha kwapamwamba kwambiri. Njira yonse yosinthira masinthidwe kudzera munjira yanthawi zonse ya PR imakhazikitsa miyezo yapamwamba komanso pamasinthidwe.
- Zosintha nthawi imodzi. Nthawi zonse tikasintha kusintha kokhazikika kumatsimikizira kuti ma node onse akusinthidwa.
- Kugwiritsa ntchito mosavuta. Pulogalamuyi sikufunika kusanthula ndikutsimikizira masinthidwe ndikusintha masinthidwe olakwika. Izi zimathandizira ntchito yonse. (Kuwonjezeka kwina kwazovuta kuli mu kasinthidwe komweko, koma ndikugulitsa mozindikira kuchitetezo.) Ndizowongoka bwino kubwerera ku kasinthidwe wamba - ingowonjezerani zidutswa zomwe zikusowa. Ndikosavuta kuti muyambe ndi masinthidwe ophatikizidwa ndikuchedwetsa kukhazikitsidwa kwa zidutswa zina mpaka nthawi zina zamtsogolo.
- Kusintha kosinthidwa. Chifukwa chosintha masinthidwe amatsata njira yofananira yachitukuko, chifukwa chake timapeza chopangidwa ndi mtundu wapadera. Zimatilola kusinthanso kasinthidwe ngati pakufunika. Titha kuyikanso masinthidwe omwe adagwiritsidwa ntchito chaka chapitacho ndipo agwira ntchito chimodzimodzi. Kukonzekera kokhazikika kumawongolera kulosera komanso kudalirika kwa dongosolo logawidwa. Kukonzekera kumakhazikitsidwa pa nthawi yosonkhanitsa ndipo sikungasokonezedwe mosavuta pa dongosolo lopangira.
- Modularity. Ma module omwe akufunsidwawo ndi a modular ndipo ma module amatha kuphatikizidwa m'njira zosiyanasiyana
kuthandizira masanjidwe osiyanasiyana (makhazikitsidwe / masanjidwe). Makamaka, ndizotheka kukhala ndi masinthidwe ang'onoang'ono a node imodzi komanso makonzedwe akulu amitundu yambiri. Ndizomveka kukhala ndi masanjidwe angapo opanga. - Kuyesa. Pazifukwa zoyesera munthu atha kugwiritsa ntchito ntchito yachipongwe ndikuigwiritsa ntchito ngati kudalira m'njira yotetezeka. Mapangidwe angapo oyesera okhala ndi magawo osiyanasiyana osinthidwa ndi zoseketsa akhoza kusungidwa nthawi imodzi.
- Kuyesa kwa kuphatikiza. Nthawi zina m'makina ogawidwa ndizovuta kuyendetsa mayeso ophatikiza. Pogwiritsa ntchito njira yomwe tafotokozayi kuti tiyike kasinthidwe kotetezeka kwa dongosolo lonse logawidwa, tikhoza kuyendetsa magawo onse ogawidwa pa seva imodzi m'njira yowongoka. N’zosavuta kutengera mmene zinthu zilili
pamene imodzi mwa mautumikiwa sakupezeka.
kuipa
Kukonzekera kophatikizidwa ndi kosiyana ndi kasinthidwe "kwanthawi zonse" ndipo sikungagwirizane ndi zosowa zonse. Nazi zina mwazovuta za config yophatikizidwa:
- Kusintha kokhazikika. Itha kukhala yosayenera pamapulogalamu onse. Nthawi zina pamafunika kukonza mwachangu kasinthidwe mukupanga ndikudutsa njira zonse zotetezera. Njirayi imapangitsa kuti zikhale zovuta. Kuphatikizika ndi kutumizidwanso kumafunika pambuyo popanga kusintha kulikonse. Izi ndi mbali zonse ndi katundu.
- Kupanga kasinthidwe. Zosintha zikapangidwa ndi chida china chodzipangira njira iyi imafunikira kuphatikiza kotsatira (komwe kungalephereke). Zingafunike kuyesetsa kowonjezera kuti muphatikize gawo lowonjezerali mu dongosolo lomanga.
- Zida. Pali zida zambiri zomwe zikugwiritsidwa ntchito masiku ano zomwe zimadalira ma configs-based configs. Ena a iwo
sichidzagwiritsidwa ntchito pamene kasinthidwe apangidwa. - Kusintha kwa malingaliro ndikofunikira. Madivelopa ndi DevOps amadziwa bwino mafayilo amawu. Lingaliro lakupanga kasinthidwe limatha kuwoneka lachilendo kwa iwo.
- Musanakhazikitse kasinthidwe kophatikizana, ndikofunikira kupanga pulogalamu yapamwamba kwambiri.
Pali zoletsa zina zachitsanzo chomwe chakhazikitsidwa:
- Ngati tipereka masinthidwe owonjezera omwe sakufunidwa ndi kukhazikitsa ma node, compiler sidzatithandiza kuzindikira kukhazikitsidwa komwe kulibe. Izi zitha kuthetsedwa pogwiritsa ntchito
HList
kapena ma ADT (makasitomala) akusintha ma node m'malo mwa mawonekedwe ndi Keke Pattern. - Tiyenera kupereka boilerplate mu fayilo ya config: (
package
,import
,object
zolengeza;
override def
's za magawo omwe ali ndi makonda osasintha). Izi zitha kuthetsedwa pang'ono pogwiritsa ntchito DSL. - Mu positi iyi sitikuphimba kukonzanso kwamagulu amagulu ofanana.
Kutsiliza
Mu positi iyi takambirana za lingaliro lakuyimira kasinthidwe mwachindunji mu code source munjira yotetezeka. Njirayi itha kugwiritsidwa ntchito m'mapulogalamu ambiri ngati choloweza m'malo mwa xml- ndi masinthidwe ena otengera malemba. Ngakhale kuti chitsanzo chathu chakhazikitsidwa ku Scala, chitha kumasuliridwanso kuzilankhulo zina zomwe zingaphatikizidwe (monga Kotlin, C #, Swift, etc.). Wina atha kuyesa njirayi mu pulojekiti yatsopano ndipo, ngati siyikugwirizana bwino, sinthani ku njira yakale.
Zachidziwikire, kasinthidwe kophatikizana kumafuna njira yachitukuko chapamwamba. M'malo mwake, imalonjeza kuti ipereka kasinthidwe kolimba kwambiri.
Njira iyi ikhoza kuwonjezeredwa m'njira zosiyanasiyana:
- Wina atha kugwiritsa ntchito ma macros kuti atsimikizire kasinthidwe ndikulephera panthawi yophatikiza ngati vuto lililonse lazamalonda litalephera.
- DSL ikhoza kukhazikitsidwa kuyimira kasinthidwe m'njira yosavuta kugwiritsa ntchito domain.
- Dynamic resource management yokhala ndi zosintha zokha. Mwachitsanzo, tikasintha kuchuluka kwa ma cluster node omwe tingafune (1) ma node kuti tipeze masinthidwe osinthidwa pang'ono; (2) Cluster manejala kuti alandire zatsopano za node.
zikomo
Ndikufuna kunena zikomo kwa Andrey Saksonov, Pavel Popov, Anton Nehaev popereka ndemanga zolimbikitsa pazolemba za positiyi zomwe zandithandiza kuti zimveke bwino.
Source: www.habr.com