根据来自另一个服务的数据在微服务中进行输入验证

Input validation in microservices depending on data from another service

我正在使用微服务设计照片管理解决方案。

我需要阻止用户将不属于自己的照片添加到他的相册中。很明显,我需要对 "album service" 进行一些验证。但是有关照片所有者的信息在 "photo service".

我想到的一个可能的解决方案是将具有相关属性的照片记录复制到"album service"。但是我不太喜欢,因为这样的话"album service"会有很多相册里没有的照片记录。

另一种选择是从 "album service" 到 "photo service" 的同步调用。但这会打破微服务范式。

问题是,实施此类验证的好方法是什么。

ID 为 9876 的用户想要将 ID 为 1234 的照片添加到相册 333:

PUT /albums/333/photos/1234
user-id:9876 (in header)

相册服务调用照片服务来验证照片属于用户:

GET /photos/9876/1234 <- a bit contrived
404 Not Found

“未找到”向相册服务表明照片不属于用户,因此它 returns 向调用者发送 403(并且不更新相册)。

如您所说,这可能会破坏微服务范式,但您已将问题定义为实时验证问题。实时问题需要实时解决方案。

如果不期望实时验证,那么您可以让用户发出将照片添加到相册的请求,然后通过消息队列在稍后进行实际验证操作,任何负面结果都会通过 websockets 或其他通知机制返回给用户。