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

Vastaa

Sähköpostiosoitettasi ei julkaista.