我是否可以使用设计模式或实践来帮助出现故障或停机的服务,而其他服务却保持稳定?
如果我有三个微服务,其中两个很好,又在POST中间死了怎么办?有两个将获得POST,而一个则不会。我认为我无法进行交易,因为我正在将请求发送给服务。
我该如何设计?我不想在各种数据库中孤立数据。
我是否可以使用设计模式或实践来帮助出现故障或停机的服务,而其他服务却保持稳定?
如果我有三个微服务,其中两个很好,又在POST中间死了怎么办?有两个将获得POST,而一个则不会。我认为我无法进行交易,因为我正在将请求发送给服务。
我该如何设计?我不想在各种数据库中孤立数据。
Answers:
一些选择。
将消息放在高可用性且持久的队列中,而不是HTTP。例如卡夫卡。只要目标服务器在某个时候可用,它就会收到消息。
您现在需要权衡配置和管理复杂子系统(队列)。因此,请确保您分析这是否值得。
让呼叫者保留失败的请求(可能持久保存到磁盘)并定期重试。在这种情况下,区分导致崩溃的请求和刚刚关闭的服务很重要。前者可能是由于错误所致,应予以记录...重试在进行修复之前可能不会有所作为。
定期任务检查微服务之间的一致性条件。例如,故障会一直记录到必要的直接API查询。如果发现问题(例如有订单但运输从未收到装箱单),请执行赔偿步骤。这些步骤可能是为手动修复创建支持票证,或者向某人发送电子邮件,等等。
这样的情况可能需要API网关来管理对受影响的微服务的调用。这样,您可以控制使用哪些策略来减轻此问题。您可能不想让客户负担这些实施细节。请参阅断路器模式。
由于微服务是独立的,因此总会存在一些故障情况,可能导致不一致。当这些情况出现时,您必须准备进行手动修复。
如果您需要强一致性,那么微服务将不是一个很好的选择。如果仍然需要可伸缩性,则可能需要研究分片,其中相关数据可以共存于同一分片上,以确保一致性。您仍然可以通过添加分片来扩展IO。
如果您需要强大的一致性并且没有可伸缩性问题,则只需使用单片服务。将库用作应用程序中的边界以分离关注点。
我认为您所描述的是共识问题:除非分布式事务中的每个参与者都说操作成功,否则您不想提交。对此的简单解决方案是两阶段提交。从本质上讲,它在每个系统中分阶段进行事务,直到每个系统都报告分阶段成功为止(阶段1)。如果交易中的每个参与者都返回成功,则每个参与者都被要求提交;如果其中任何一个返回了故障,则发出回滚(阶段2)。这种折衷使您获得更复杂的“三相提交”解决方案。您可以在此处阅读每个说明的更好描述:
http://the-paper-trail.org/blog/consensus-protocols-two-phase-commit/
http://the-paper-trail.org/blog/consensus-protocols-three-phase-commit/