在多个微服务上使用猫鼬模式

lin*_*ram 5 mongoose mongodb node.js microservices mongoose-schema

我的应用程序被分成多个在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 }
})
Run Code Online (Sandbox Code Playgroud)

微服务 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 }
})
Run Code Online (Sandbox Code Playgroud)

我的方法

我将继续在每个微服务中创建一个新架构,仅包含所需的字段。但是,我不确定当多个微服务向MongoDB数据库注册新的schema时是否会出现问题?例如,两个微服务都会尝试为该unique字段创建索引。会不会有性能问题?

有人有我可以使用的不同方法吗?这是否是一种有效的方法?

提前致谢 :)

Cit*_*ror 4

这是一个有效的方法。您可以有 2 个模式指向同一个集合。我已经测试过它并且有效。

\n\n

Mongoose 是一个对象数据建模 (ODM) 库,您可以让 2 个对象查看同一个集合/(SQL 中的表或视图) - 没有问题。

\n\n

只要您获得正确的索引,就不会出现性能问题。与对象数据建模无关。

\n\n

您可能想要添加一些类型键,以便在获取请求时只能找到 type1/type2 帐户。在查找时,您可以通过投影来限制获取正确的字段。

\n\n

我认为索引 \xe2\x80\x93 电子邮件 + 密码中应该只有 2 个密钥。如果您有电话索引和微服务 B:不包含电话 \xe2\x80\x93,您将在 电话的唯一索引处发生冲突。

\n\n

但如果您确实想要一个唯一的电话索引,您可以进行覆盖。您可以为微服务 B 的电话生成临时唯一值(使用自动生成或复制电子邮件值),您将在微服务 B 上忽略此值,并且仅在微服务 A 中查找/更新/显示电话,其中您拥有有效的电话。当用户从 accountB 类型更改为 accountA 类型 \xe2\x80\x93 时,您必须确保将错误的电话号码替换为有效的电话号码。

\n\n

我认为同一集合的 2 个模式没有问题 - 您只需要以正确的方式管理索引 \xe2\x80\x93 以避免冲突,并确保您可以区分集合中的不同帐户类型。

\n