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