如果我的Node.js服务器在等待Web服务回调时崩溃会发生什么?

时间:2015-07-24 14:17:11

标签: node.js web-services transactions soa

我刚刚开始研究Node.js来创建一个异步调用多个Web服务来完成单个客户端请求的Web应用程序。我认为在SOA中,这称为复合服务/事务。

如果任何Web服务调用在组合服务中失败,我的Node.js应用程序将负责完成任何补偿操作。例如,如果服务A和B返回“成功”,但服务C返回“失败”,则Node.js可能需要对服务A和B应用补偿操作(有效撤消)。

我的问题是,如果我的Node.js服务器崩溃了怎么办?我可能正处于复合交易的中间。已经多次调用Web服务,我正在等待回调。如果我的节点服务器崩溃,那么针对回调的响应将闻所未闻。然后,其中一个Web服务可能无法成功,并且需要对其他服务进行一些补偿操作。

我不知道一旦我的节点服务器重新上线,我将如何解决这个问题。如果服务A和B成功,这可能会使系统处于不一致状态,但C没有。

1 个答案:

答案 0 :(得分:2)

分布式事务are bad for SOA - 它们引入了依赖性,刚性,安全性和性能问题。您可以实现Saga,这意味着您的每个服务都需要了解正在进行的操作,并在发现问题时采取补偿措施。您希望为每项服务保存状态,以便他们在恢复时了解到达到一致的内部状态。

如果您发现必须拥有分布式交易,则可能需要重新考虑服务之间的界限。

(评论更新) 即使您使用Saga,您可能会发现您希望某个协调员控制补偿 - 但如果您的服务是自主的,他们将不需要该中央协调员 - 他们自己执行补偿操作 - 例如如果他们使用预订模式infoq.com/news/2009/09/reservations。他们可以在预订到期时进行赔偿。否则,您可以将状态持久保存(redis / db / zookeeper等),然后在恢复协调器时检查该状态