我们有一个应用程序,用户只能使用Facebook登录。在Facebook成功登录后,将进行另一个http休息呼叫,以存储名称,电子邮件和来自Facebook登录提供商的其他信息。如果第二个RESTful服务无法将信息从fb存储到Mongodb,则会导致数据一致性问题
因此,如果第3步失败,我们将丢失通过Facebook注册的用户的信息。
loginWithFacebook() {
const provider = new firebase.auth.FacebookAuthProvider();
provider.addScope('user_birthday');
provider.addScope('user_friends');
provider.addScope('user_gender');
return new Promise<any>((resolve, reject) => {
this.afAuth.auth
.signInWithPopup(provider) // a call made to sign up via fb
.then(res => {
if (res) {
resolve(res);
if (res.additionalUserInfo.isNewUser) { // creatin profile only if he is a new user
this.createProfile(res); // a call to store the response in the db
}
this.setTokenSession(res.credential.accessToken);
}
}, err => {
console.log(err);
reject(err);
})
})
}
是否有一种巧妙的架构方式来编排此内容?
答案 0 :(得分:3)
解决,因为这不是小问题。
如果这是一个真正的微服务体系结构,其中每个服务都有其自己的 dedicated 数据库,那么您显然不能有效地执行事务。您也许可以执行2-phase commit,但这本身就有问题,尤其是对于长期存在的数据库锁而言。
Distributed Saga Pattern是解决问题的一种可扩展方法:
实施跨多个服务的每个业务交易作为传奇。传奇是一系列本地交易。每个本地事务都会更新数据库并发布消息或事件以触发传奇中的下一个本地事务。如果本地事务因为违反业务规则而失败,那么该传奇将执行一系列补偿事务,以撤消先前的本地事务所做的更改。
我认为上面的内容非常简洁,因此我将故意切线切线:
难以管理分布式系统。确保您的系统架构没有违反YAGNI。如果可能的话,请问一下自己是否真的需要分布式架构。
确保分布式系统中的数据一致性相对复杂 在大多数情况下,这项任务需要专用的协调器服务,额外的代码来管理所有这些任务以及所有这些额外机制所带来的所有复杂性。