mönster: brytare

sammanhang

du har tillämpat mikroservicearkitekturen.Tjänster samarbetar ibland vid hantering av förfrågningar.När en tjänst synkront åberopar en annan finns det alltid möjligheten att den andra tjänsten inte är tillgänglig eller uppvisar så hög latens att den i huvudsak är oanvändbar.Värdefulla resurser som trådar kan förbrukas i den som ringer medan du väntar på att den andra tjänsten ska svara.Detta kan leda till resursutmattning, vilket skulle göra att den uppringande tjänsten inte kan hantera andra förfrågningar.Misslyckandet av en tjänst kan potentiellt kaskad till andra tjänster i hela programmet.

Problem

Hur förhindrar du att ett nätverks-eller tjänstefel går över till andra tjänster?

lösning

en serviceklient bör åberopa en fjärrtjänst via en proxy som fungerar på ett liknande sätt som en elektrisk brytare.När antalet på varandra följande fel passerar en tröskel, går brytaren ut och under en tidsgräns kommer alla försök att åberopa fjärrtjänsten att misslyckas omedelbart.Efter att timeout löper ut tillåter strömbrytaren ett begränsat antal testförfrågningar att passera igenom.Om dessa förfrågningar lyckas strömbrytaren återupptar normal drift.Annars, om det finns ett fel börjar timeout-perioden igen.

exempel

RegistrationServiceProxy Från Microservices exempelprogrammet är ett exempel på en komponent, som är skriven i Scala, som använder en brytare för att hantera fel när man anropar en fjärrtjänst.

@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 ordnar för samtal till registerUser() som ska utföras med hjälp av en brytare.

strömbrytarfunktionen är aktiverad med anteckningen @EnableCircuitBreaker på klassen UserRegistrationConfiguration.

@EnableCircuitBreakerclass UserRegistrationConfiguration {

resulterande sammanhang

detta mönster har följande fördelar:

  • tjänster hanterar misslyckandet av de tjänster som de åberopar

detta mönster har följande problem:

  • det är utmanande att välja timeout-värden utan att skapa falska positiva eller införa överdriven latens.
  • MicroService-chassit kan implementera detta mönster
  • en API-Gateway använder detta mönster för att anropa tjänster
  • en router på serversidan kan använda detta mönster för att anropa tjänster

Se även

  • Netflix Hystrix är ett exempel på ett bibliotek som implementerar detta mönster

Lämna ett svar

Din e-postadress kommer inte publiceras.