patroon: stroomonderbreker

Context

u hebt de microservice-architectuur toegepast.Services werken soms samen bij het verwerken van aanvragen.Wanneer een dienst synchroon een andere aanroept is er altijd de mogelijkheid dat de andere dienst niet beschikbaar is of een dergelijke hoge latency vertoont die in wezen onbruikbaar is.Kostbare bronnen zoals threads kunnen worden verbruikt in de beller tijdens het wachten op de andere dienst om te reageren.Dit kan leiden tot uitputting van middelen, waardoor de oproepende dienst niet in staat zou zijn om andere verzoeken te behandelen.Het falen van een dienst kan mogelijk cascade naar andere diensten gedurende de toepassing.

probleem

hoe te voorkomen dat een netwerk-of servicefout naar andere services trapsgewijs verloopt?

oplossing

een serviceclient dient een service op afstand aan te roepen via een proxy die op soortgelijke wijze functioneert als een stroomonderbreker.Wanneer het aantal opeenvolgende storingen een drempel overschrijdt, schakelt de stroomonderbreker en gedurende de duur van een time-outperiode zullen alle pogingen om de remote service aan te roepen onmiddellijk mislukken.Nadat de time-out is verlopen, laat de stroomonderbreker een beperkt aantal testaanvragen door.Als die Verzoeken slagen, hervat de stroomonderbreker de normale werking.Anders, als er een fout is de time-out periode begint opnieuw.

voorbeeld

RegistrationServiceProxy van de Microservices-voorbeeldtoepassing is een voorbeeld van een component, geschreven in Scala, die een stroomonderbreker gebruikt om storingen te verwerken bij het aanroepen van een service op afstand.

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

de @HystrixCommand regelt dat oproepen tot registerUser() worden uitgevoerd met behulp van een stroomonderbreker.

de stroomonderbrekerfunctie is ingeschakeld met behulp van de annotatie @EnableCircuitBreaker op Klasse UserRegistrationConfiguration.

@EnableCircuitBreakerclass UserRegistrationConfiguration {

resulterende Context

dit patroon heeft de volgende voordelen:

  • diensten verwerken het falen van de diensten die zij aanroepen

dit patroon heeft de volgende problemen:

  • het is een uitdaging om timeout-waarden te kiezen zonder valse positieven te creëren of overmatige latentie te introduceren.
  • het Microservice-Chassis kan dit patroon implementeren
  • een API-Gateway zal dit patroon gebruiken om services
  • aan te roepen een server-side discovery router kan dit patroon gebruiken om services

aan te roepen zie ook

  • Netflix hystrix is een voorbeeld van een bibliotheek die dit patroon implementeert

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.