Minta: megszakító

kontextus

a mikroszolgáltatási architektúrát alkalmazta.A szolgáltatások néha együttműködnek a kérések kezelésekor.Amikor az egyik szolgáltatás szinkron módon meghívja a másikat, mindig fennáll annak a lehetősége, hogy a másik szolgáltatás nem érhető el, vagy olyan magas késleltetést mutat, hogy lényegében használhatatlan.Értékes erőforrások, például szálak fogyaszthatók a hívóban, miközben várják a másik szolgáltatás válaszát.Ez erőforrás-kimerüléshez vezethet, ami miatt a hívó szolgáltatás nem képes kezelni más kéréseket.A hiba egy szolgáltatás potenciálisan lépcsőzetesen más szolgáltatások az egész alkalmazás.

probléma

hogyan lehet megakadályozni, hogy a hálózat vagy a szolgáltatás meghibásodása más szolgáltatásokra LÉPJEN?

megoldás

a szervizügyfélnek olyan proxyn keresztül kell meghívnia egy távoli szolgáltatást, amely hasonló módon működik, mint egy elektromos megszakító.Amikor az egymást követő hibák száma átlépi a küszöböt, a megszakító kiold, és egy időtúllépési időszak alatt a távoli szolgáltatás meghívására tett összes kísérlet azonnal meghiúsul.Az időkorlát lejárta után a megszakító korlátozott számú tesztkérelmet enged át.Ha ezek a kérések sikeresek, a megszakító visszatér a normál működéshez.Ellenkező esetben, ha hiba történik, az időtúllépési időszak újra kezdődik.

példa

RegistrationServiceProxy a Microservices Example alkalmazásból egy példa egy Scala-ban írt összetevőre, amely megszakítót használ a hibák kezelésére távoli szolgáltatás meghívásakor.

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

a @HystrixCommand gondoskodik a registerUser() – re irányuló hívások megszakító használatával történő végrehajtásáról.

a megszakító funkció engedélyezve van a @EnableCircuitBreaker megjegyzés használatával a UserRegistrationConfiguration osztályban.

@EnableCircuitBreakerclass UserRegistrationConfiguration {

kapott kontextus

ennek a mintának a következő előnyei vannak:

  • A szolgáltatások kezelik az általuk hivatkozott szolgáltatások hibáját

ennek a mintának a következő problémái vannak:

  • kihívást jelent az időtúllépési értékek kiválasztása hamis pozitív eredmények létrehozása vagy túlzott késleltetés bevezetése nélkül.
  • a Microservice alváz megvalósíthatja ezt a mintát
  • egy API átjáró ezt a mintát használja a szolgáltatások meghívására
  • egy szerveroldali felderítő útválasztó ezt a mintát használhatja a szolgáltatások meghívására

Lásd még:

  • A Netflix Hystrix egy példa egy könyvtárra, amely megvalósítja ezt a mintát

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.