如何管理微服务故障?

时间:2017-05-24 21:49:57

标签: microservices

让我们说,我有几个微服务(REST API),问题是,如果一个服务无法访问(让我们调用服务" A")数据这是发送到服务" A"将保存在临时数据库中。服务完成后,数据将再次发送。 题: 1.我是否应该创建为服务而服务的服务" A"在每10秒钟内知道服务是否有效?或者是否可以通过任务队列来完成?有什么建议?

4 个答案:

答案 0 :(得分:0)

轮询是浪费带宽。您想使用事务性队列。

将所有出站邮件丢弃在队列中,并使用其他进程处理邮件。

这将如何工作 - 在您的进程从队列中读取并尝试发送到REST服务之后:

  • 如果可行,则提交事务(对于队列)
  • 如果它不起作用,就不要提交。开始延迟(分钟,秒 - 你知道最好),直到你再次从队列中读取。

答案 1 :(得分:0)

您的问题有多个方面。首先,您要考虑使用提供弹性的基础架构self healing。这意味着您要部署一个容器集群,所有容器都包含您的服务A.现在,您可以在服务前使用负载均衡器或API网关来分配呼叫/负载。它还会定期检查您服务的健康状况。当它检测到容器没有正确响应时,它可以杀死容器并启动另一个容器。这可以通过容器基础设施提供,例如kubernetes / docker swarm等。

现在这并不能保护您免于丢失任何请求。如果容器发生故障,则在故障和下一次健康检查之间仍然会有短时间,可能无法提供请求。在许多应用程序中,这是可以接受的,客户端将只重新请求并击中另一个(健康容器)。如果您的应用程序要求绝对不会丢失请求,则必须将请求缓存在例如API网关中,并确保将其保留到服务已完成(也称为Circuit Breaker)。一个示例技术是Netflix Zuul和Hystrix。使用具有内置容错功能的Gatekeeper可以进一步提高弹性。作为旁注 - 使用API​​网关还可以解决集中身份验证/授权,路由和监控等问题。

添加弹性/解耦的另一种方法是使用快速流/消息队列(例如Apache Kafka)来记录所有传入消息,并让消息处理器在准备好时处理它们。然后,诀窍是仅在完全提供请求时将消息标记为已处理。这也有助于在服务(Asynchronous Decoupling with Cache)无法实时处理的大量请求导致故障发生的情况下。

答案 2 :(得分:0)

您可以使用断路器模式,例如来自netflix的hystrix断路器。

可以在超时或服务呼叫失败或无法访问时打开断路器。

答案 3 :(得分:0)

服务“A”应该在可用时触发“就绪”事件。只需听取并重新发送您的请求。