事件驱动应用程序的契约流

Pact flow for Event Driven Applications

虽然 Pact 支持消息测试,但我发现“Pact Nirvana”中推荐的流程与我理解的 事件驱动应用程序 需要的流程不太匹配。

假设我们有一个订单管理服务和一个运输管理服务Shipping 服务发出 ShippingPreparedEventOrder 服务接收。

如果我们删除 ShippingPreparedEvent 中的一个字段,我希望首先对订单服务进行更改,以便它停止读取旧字段。部署它。然后在 Shipping 服务中进行更改并部署它。 这样,服务就不会停机。

但是,我相信 Pact 会期望首先部署 Shipping 服务(它是事件的提供者),以便在部署消费者之前可以验证合同。在这种情况下,首先部署提供者会破坏我的消费者。

有没有办法避免这种情况?我错过了什么吗?

只是为了提供更多上下文,我们可以在此 link 中看到不同的更改需要不同的部署顺序。 https://docs.confluent.io/current/schema-registry/avro.html#summary 我不会使用 Kafka 或 Avro,但我相信我的流程会很相似。

非常感谢。

If we deleted a field inside the ShippingPreparedEvent, I'd expect first to make a change to the Order service so that it stops reading the old field. Deploy it. And then make the change in the Shipping service and deploy it. That way, there wouldn't have any downtime on the services.

我同意。 Pact Nirvana 指南中的哪些具体内容让您觉得这不是正确的方法? Pact(和 Pact Broker)实际上并不关心部署的顺序。

在您的情况下,删除该字段会导致 can-i-deploy 检查失败,因为删除该字段会破坏 Order Management Service。唯一的方法是从消费者那里删除字段使用,发布该合同的新版本并首先部署到生产环境。