当其中一个微服务停机时,如何处理微服务交互

时间:2018-05-28 08:52:46

标签: spring-boot microservices

我是微服务架构的新手。目前我正在为我的微服务使用spring boot,如果其中一个微服务出现问题,那么故障转移机制应该如何工作呢?

对于Ex。如果我们有3个微服务M1,M2,M3。 M1与M2相互作用,M2与M3相互作用。如果M2微服务集群出现故障,我们应该如何处理这种情况?

2 个答案:

答案 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

    因此,当其中一个微服务发生故障时,处理微服务交互时需要考虑这些因素。