node.js - 在多个微服务上使用猫鼬模式
问题描述
我的应用程序被拆分为在heroku dynos上运行的多个微服务(它们无法访问彼此的文件)。有时,有多个微服务使用一个集合。因此,两个微服务都需要相应的猫鼬模式。
然而,并不是两个微服务都需要完整的模式。例如,微服务 A 需要完整的模式,而微服务 B 只需要该模式的几个字段。
微服务 A 中的示例架构:
var AccountSchema = mongoose.Schema({
email: { type: String, required: true, unique: true },
password: { type: String, required: true },
phone: { type: String, required: true, unique: true },
forename: { type: String, required: true },
surname: { type: String, required: true },
middleInitals: { type: String, required: false },
failedLoginAttempts: { type: Number, required: true, default: 0 },
lockUntil: { type: Number },
createdAt: { type: Date, default: Date.now }
})
微服务 B 中的示例模式:
var AccountSchema = mongoose.Schema({
email: { type: String, required: true, unique: true },
password: { type: String, required: true },
failedLoginAttempts: { type: Number, required: true, default: 0 },
lockUntil: { type: Number },
createdAt: { type: Date, default: Date.now }
})
我的方法
我会继续在每个微服务中创建一个新模式,只包含所需的字段。但是不知道当多个微服务注册一个新的schema到MongoDB数据库时会不会有什么问题?例如,两个微服务都会尝试为unique
字段创建索引。会不会有性能问题?
有人有我可以使用的不同方法吗?这甚至是一种有效的方法吗?
提前致谢 :)
解决方案
这是一种有效的方法。您可以有 2 个模式指向同一个集合。我已经对其进行了测试,并且可以正常工作。
Mongoose 是一个对象数据建模 (ODM) 库,您可以让 2 个对象查看同一个集合/(SQL 中的表或视图)——这没问题。
没有理由出现性能问题,只要你得到了正确的索引。与对象数据建模无关。
您可能想要添加一些类型键,以便在获取请求时只能找到 type1/type2 帐户。在查找时,您可以限制使用投影获取正确的字段。
我认为您应该在索引中只有 2 个键 - 电子邮件 + 密码。如果你有电话索引和微服务 B:不要包含电话——你将违反电话的 唯一索引。
但是,如果您真的想要一个唯一的电话索引,您可以进行覆盖。您可以为微服务 B 生成电话的临时唯一值(使用自动生成或复制电子邮件值),您将在微服务 B 上忽略此值,并且仅在您拥有有效电话的微服务 A 中查找/更新/显示电话。当用户从 accountB 类型更改为 accountA 类型时 - 您必须确保将错误的电话号码替换为有效的电话号码。
我认为同一个集合的 2 个模式没有问题 - 您只需要以正确的方式管理索引 - 以避免冲突,并确保您可以区分集合中的不同帐户类型。
推荐阅读
- java - 无法使用 JSONObject 更新 .json 文件中的子节点
- jquery - 如何使用 jQuery 中的类选择器更改表的 td 的背景颜色
- javascript - 异步混淆。处理 API 响应并失去对这段代码中发生的事情的掌握
- ascii - ASCII码挑战
- python - 遍历一个将 range 作为元素的 lisit 并扩展它
- python-3.x - 嵌套字典理解提取一个键值对
- javascript - await 不等待承诺在节点 js 中返回
- python - 在 Flask MySQL 和 SqlAlchemy 命令 db.create_all() 中给出错误
- c++ - ADAPTIVE Communication Environment (ACE) C++ 库是否支持 iOS 和 Android?
- android - Xamarin Forms 上传图片 Laravel POST 请求失败