【问题标题】:use mongoose schema over multiple microservices在多个微服务上使用猫鼬模式
【发布时间】:2020-07-18 17:09:45
【问题描述】:

我的应用程序被拆分为 多个微服务,它们在 heroku dynos 上运行(它们无法访问彼此的文件)。有时,有多个微服务使用一个集合。因此,这两个微服务都需要相应的 mongoose 架构。

但是,并非两个微服务都需要 full 架构。例如,微服务 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 字段创建索引。会有性能问题吗?

有没有人可以使用不同的方法?这甚至是一种有效的方法吗?

提前致谢:)

【问题讨论】:

    标签: node.js mongodb mongoose microservices mongoose-schema


    【解决方案1】:

    据我所知,您没有理由不能使用相同的模式,也许使用某种特权系统并让它只在这些单独的微服务之间返回正确的信息。您可以让一个 fetch 请求告诉它它来自哪个服务,并使用一个简单的条件返回哪些项目。

    【讨论】:

      【解决方案2】:

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

      Mongoose is an Object Data Modeling (ODM) library,您可以让 2 个对象查看同一个集合/(SQL 中的表或视图)——这没问题。

      没有理由出现性能问题,只要你得到了正确的索引。与对象数据建模无关。

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

      我认为索引中应该只有 2 个键 - 电子邮件 + 密码。如果您有电话索引和微服务 B:不要包含电话 - 您将在 unique index of phone 处违规。

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

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

      【讨论】:

        猜你喜欢
        • 2018-11-16
        • 2014-10-08
        • 2023-04-09
        • 2020-08-01
        • 2011-11-14
        • 2016-07-21
        • 2016-08-05
        • 1970-01-01
        • 2020-09-18
        相关资源
        最近更新 更多