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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.