kuvio: katkaisija
Konteksti
olet soveltanut Microservice-arkkitehtuuria.Palvelut tekevät joskus yhteistyötä pyyntöjen käsittelyssä.Kun yksi palvelu vetoaa synkronisesti toiseen, on aina mahdollista, että toinen palvelu ei ole käytettävissä tai sillä on niin korkea latenssi, että se on käytännössä käyttökelvoton.Kallisarvoiset resurssit, kuten langat, saattavat kulua soittajaan odottaessa toisen palvelun vastausta.Tämä saattaa johtaa resurssien loppumiseen, jolloin puhelinpalvelu ei pysty käsittelemään muita pyyntöjä.Yhden palvelun epäonnistuminen voi mahdollisesti ryöpsähtää muihin palveluihin koko sovelluksen ajan.
ongelma
Miten estää verkko-tai palveluhäiriön vyöryminen muihin palveluihin?
ratkaisu
palveluasiakkaan tulee käyttää etäpalvelua välityspalvelimen kautta, joka toimii samalla tavalla kuin sähkökatkaisija.Kun peräkkäisten vikojen määrä ylittää kynnyksen, katkaisija laukeaa, ja aikakatkaisun ajan kaikki yritykset vedota etäpalveluun epäonnistuvat välittömästi.Kun aikalisä umpeutuu, katkaisija sallii rajoitetun määrän testipyyntöjä läpäistäväksi.Jos nämä pyynnöt onnistuvat, katkaisija jatkaa normaalia toimintaa.Muussa tapauksessa, jos on vika, aikakatkaisu alkaa uudelleen.
esimerkki
RegistrationServiceProxy
Microservices-esimerkkisovellus on esimerkki Scala-kielellä kirjoitetusta komponentista, joka käyttää katkaisijaa vikojen käsittelyyn etäpalvelua käytettäessä.
@Componentclass RegistrationServiceProxy @Autowired()(restTemplate: RestTemplate) extends RegistrationService { @Value("${user_registration_url}") var userRegistrationUrl: String = _ @HystrixCommand(commandProperties=Array(new HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", value="800"))) override def registerUser(emailAddress: String, password: String): Either = { try { val response = restTemplate.postForEntity(userRegistrationUrl, RegistrationBackendRequest(emailAddress, password), classOf) response.getStatusCode match { case HttpStatus.OK => Right(response.getBody.id) } } catch { case e: HttpClientErrorException if e.getStatusCode == HttpStatus.CONFLICT => Left(DuplicateRegistrationError) } }}
@HystrixCommand
järjestää puhelut registerUser()
: lle suoritettavaksi katkaisijalla.
katkaisijan toiminnallisuus on käytössä @EnableCircuitBreaker
– luokalla UserRegistrationConfiguration
annetulla merkinnällä.
@EnableCircuitBreakerclass UserRegistrationConfiguration {
tuloksena Konteksti
tällä kaavalla on seuraavat edut:
- palvelut käsittelevät niiden palvelujen vikaantumista, joihin ne vetoavat
tällä kaavalla on seuraavat asiat:
- on haastavaa valita aikakatkaisuarvot luomatta vääriä positiivisia tai tuomatta käyttöön liiallista viivettä.
- Microservice-alusta saattaa toteuttaa tämän kaavan
- API-yhdyskäytävä käyttää tätä kaavaa palvelujen kutsumiseen
- palvelinpuolen discovery-reititin saattaa käyttää tätä kaavaa palvelujen kutsumiseen
Katso myös
- Netflix Hystrix on esimerkki kirjastosta, joka toteuttaa tämän kaavan