我正在为 DDD 应用程序编写服务层。
服务通过 WSS 上的 JSON-RPC 公开。
我不确定如何响应多余的服务调用。
关于系统的一些事实:
- 所有请求必须在特定时间内完成,否则会发生超时异常。
- 如果系统负载很重,它可能会决定丢弃请求(可见为timeout)。
- 如果系统负载过重,一些消息可能会在队列中过期(显示为timeout)。
- 即使请求到达它的目标 ACK 也可能无法及时到达用户(可见为timeout)。
- 如果 ACK 没有及时到达,最终用户有权重新调用方法。
不保证请求完成。因此需要幂等性。
如果我们考虑 [4]+[5] 的含义,就会出现问题:
- 用户调用方法 setFoo(Bar)。
- 实体已创建,但 ACK 未按时完成。
- 用户收到超时并假设他应该再试一次,所以他重新调用 setFoo(Bar)。
- 实体已经存在 -> 嗯...
问题是:用户应该得到 ACK 还是错误(我已经完成了那个伙伴......)?