我是微服务架构的新手。目前我正在为我的微服务使用spring boot,如果其中一个微服务出现问题,那么故障转移机制应该如何工作呢?
对于Ex。如果我们有3个微服务M1,M2,M3。 M1与M2相互作用,M2与M3相互作用。如果M2微服务集群出现故障,我们应该如何处理这种情况?
答案 0 :(得分:1)
正如评论中所提到的,有很多方法可以解决这个问题,
案例1:所有都是独立服务,无关紧要,无需做任何事情,以阻塞或非阻塞的方式调用所有服务,调用服务2将导致超时案例2:服务依赖M2取决于M1而M3取决于M2
选项a)如果M2启动,M1可以等待服务M2重新启动,定期ping或从注册表或命名服务器获取详细信息
选项b)使用hystrix作为断路器实现并在M3或您的协调器(正在调用这些服务,即按顺序调整M1,M2,M3)中正常处理后退。
答案 1 :(得分:1)
当任何一个微服务关闭时,服务之间的交互变得非常关键,因为隔离故障,弹性和容错是任何基于微服务架构的关键特性。
完全同意@jayant的回答,在您的情况下实现正确的回退机制更有意义,您可以根据用例和M1,M2和M3之间的依赖关系实现您想要编写的所需逻辑。 如果需要,您还可以在后备中提升事件。
由于您正在使用新的微服务,因此您需要了解常用技术和架构模式,以了解您在问题中提出的情况的弹性和容错能力。在这里你使用Spring-Boot,使用可以轻松地在你的微服务中添加Netflix-OSS。
Netflix发布了Hystrix,这是一个用于控制远程系统,服务和第三方库访问点的库,可以更好地容忍延迟和失败。
它包括以下重要特征:
断路器和后备机制的重要性:
实现circuit breaker pattern的Hystrix,当a时很有用
服务故障可能导致级联故障一直到用户。
当对特定服务的呼叫超过时
circuitBreaker.requestVolumeThreshold
(默认:20个请求)和
失败百分比大于
滚动时circuitBreaker.errorThresholdPercentage
(默认值:> 50%)
由metrics.rollingStats.timeInMilliseconds
定义的窗口(默认值:10
秒),电路打开,没有拨打电话。
如果出现错误和开路,可以提供回退 开发商。可以链接后备,以便第一个后备 其他一些商务电话。查看Fallback Implementation of Hystrix
<强>重试强>
当请求失败时,您可能希望重试请求 自动。 Ribbon为我们完成这项工作。 在分布式系统中,微服务系统重试可以触发多个 其他请求或重试并启动级联效果
以下是Ribbon的一些属性
sample-client.ribbon.MaxAutoRetries=1
sample-client.ribbon.MaxAutoRetriesNextServer=1
sample-client.ribbon.OkToRetryOnAllOperations=true
sample-client.ribbon.ServerListRefreshInterval=2000
更多详情: - ribbon properties
隔板模式:
通常,舱壁模式的目标是避免一个故障 整个系统的一部分系统。 bulkhead pattern
Hystrix中的隔板实现限制了并发数 调用组件。这样,资源的数量(通常 正在等待来自组件的回复的线程是有限的。
假设您有一个基于请求的多线程应用程序(例如 一个典型的Web应用程序),使用三个不同的组件,M1,M2, 和M3。如果对组件M3的请求开始挂起,最终全部停止 请求处理线程将等待来自M3的答案。
这会使应用程序完全无响应。如果要求 M3处理缓慢如果负载很高,我们会遇到类似的问题 足够。 可以找到实施详细信息here
因此,当其中一个微服务发生故障时,处理微服务交互时需要考虑这些因素。