vzor: jistič
kontext
použili jste architekturu mikroslužeb.Služby někdy spolupracují při vyřizování požadavků.Když jedna služba synchronně vyvolá jinou, existuje vždy možnost, že druhá služba není k dispozici nebo vykazuje tak vysokou latenci, že je v podstatě nepoužitelná.Vzácné zdroje, jako jsou vlákna, mohou být spotřebovány v volajícím při čekání na odpověď druhé služby.To by mohlo vést k vyčerpání zdrojů, což by způsobilo, že volající služba nebude schopna zpracovat další požadavky.Selhání jedné služby může potenciálně kaskádovat na jiné služby v celé aplikaci.
problém
jak zabránit selhání sítě nebo služby v kaskádování na jiné služby?
řešení
klient služby by měl vyvolat vzdálenou službu prostřednictvím serveru proxy, který funguje podobným způsobem jako elektrický jistič.Pokud počet po sobě jdoucích selhání překročí práh, jistič výlety, a po dobu trvání časového limitu všechny pokusy o vyvolání vzdálené služby se nezdaří ihned.Po uplynutí časového limitu umožňuje jistič projít omezeným počtem požadavků na zkoušky.Pokud tyto požadavky uspějí, jistič obnoví normální provoz.V opačném případě, pokud dojde k poruše, doba časového limitu začíná znovu.
Příklad
RegistrationServiceProxy
z Microservices Příklad aplikace je příklad součásti, který je napsán v Scala, který používá jistič zvládnout selhání při vyvolání vzdálené služby.
@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
zajišťuje volání na registerUser()
, které mají být provedeny pomocí jističe.
funkce jističe je povolena pomocí anotace @EnableCircuitBreaker
na třídě UserRegistrationConfiguration
.
@EnableCircuitBreakerclass UserRegistrationConfiguration {
Výsledný Kontextu
Tento vzor má následující výhody:
- Služby zvládnout selhání služby, které uplatňují
Tento vzor má následující problémy:
- je To náročné vybrat hodnoty časového limitu bez vytváření falešných poplachů nebo zavádění nadměrné latence.
- V Microservice Podvozku může realizovat tento vzor
- API Brána bude používat tento vzor k vyvolání služby
- Server-side objev router může použít tento model k vyvolání služby
Viz také
- Netflix Hystrix je příklad knihovny, která implementuje tento vzor