客观
我的任务是编写具有以下目标的API网关和负载平衡器:
- 网关/ LB应将请求重定向到第三方服务实例(无代码更改=客户端服务发现)
- 每个服务实例只能同时处理单个响应,即并发请求=立即错误响应。
- 服务响应延迟为0-5秒。我无法缓存他们的回复,因此据我了解,对于我来说,不能选择使用后备广告。超时也不是一种选择,因为延迟是随机的,并且您不能保证在另一个实例上会得到更好的补偿。
我的解决方案
Spring Boot Cloud Netflix:Zuul-Hystrix-Ribbon。两种方法:
- 重试。色带以固定间隔或指数增长重试。我无法使其正常运行,我获得的最佳结果是
MaxAutoRetriesnextServer: 1000
,其中Ribbon立即启动重试,并向垃圾邮件发送垃圾邮件。 - 断路器。无需在功能区中添加指数等待期,我可以在几次失败后断开电路,然后将请求重定向到其他服务。这也不是最好的方法,原因有两个:a)每个实例只有几个实例,延迟为0-5秒,这意味着非常快地断开所有电路,无法满足请求。 b)我的配置由于某种原因无法正常工作
问题
如何让Ribbon在重试之间等待?还是可以用断路器解决我的问题?
我的配置
完整配置可在GitHub上找到。
ribbon:
eureka:
enabled: false
# Obsolete option (Apache HttpClient by default),but without this Ribbon doesn't retry against another instances
restclient:
enabled: true
hystrix:
command:
my-service:
circuitBreaker:
sleepWindowInmilliseconds: 3000
errorThresholdPercentage: 50
requestVolumeThreshold: 5
execution:
isolation:
thread:
timeoutInmilliseconds: 5500
my-service:
ribbon:
OkToRetryOnAllOperations: false
NFLoadBalancerRuleclassname: com.netflix.loadbalancer.WeightedResponseTimeRule
listOfServers: ${LIST_OF_SERVERS}
ConnectTimeout: 500
ReadTimeout: 4500
MaxAutoRetries: 0
MaxAutoRetriesnextServer: 1000
retryableStatusCodes: 404,502,503,504
测试
为了检查您的假设,您可以使用the test on GitHub来模拟具有不同延迟的单线程服务实例