【发布时间】:2021-05-20 19:06:02
【问题描述】:
我开发的微服务公开了一个端点 PUT /deployments/{uuid} 。端点用于启动可能代价高昂的部署操作,因此我们只希望它发生一次,这就是我们选择 PUT + UUID 而不是 POST 的原因(为了唯一性)。部署是不可变的,因此它永远无法更新,因此如果 PUT 被多次调用且使用相同的 uuid,我们目前会引发异常。
作为一个喜欢骑自行车并因此深深地关心休息的人,这让我感到厌烦。 PUT 应该是幂等的,因此在多次发出相同请求后引发异常是一种反模式。但是,我们有一个要求,不允许连续的相同请求生成新的部署,所以通常的 POST 不可用。
虽然最好的解决方案是可行的,但如果可能的话,我希望我们的解决方案更优雅一点。我已经在有效载荷中使用 UUID 放置了一个 POST,但我的团队似乎认为这比当前的解决方案更糟糕。我正在考虑只将 200 OK 从 PUT 返回到相同的 UUID 而不是 201 CREATED,但我不确定这是否与 non-idempotent-put 存在相同的问题,即没有在语义上传达我想要的信息。
这里有“最佳解决方案”吗?或者,如果我进一步追求这一点,我是否注定要成为团队中的“那个人”(开你的玩笑,我已经是那个人了)。
tl;dr 什么是不可变的 /deployments 端点的正确 RESTful API 签名,并且要求不允许同一请求被处理两次?
【问题讨论】: