微服务集中式数据库模型

时间:2017-01-25 11:13:51

标签: mysql database go microservices

目前我们有一些microservice,他们有自己的数据库模型和迁移GORM Golang包提供的内容。我们有一个很老的MySQL数据库,它违反了微服务法则,但我们无法取代它。我担心当微服务数量开始增长时,我们将在许多数据库模型中丢失。当我在微服务中添加一个新列时,我只需在终端中键入service migrate(因为有一个用于运行和迁移命令的cli),它会刷新数据库。

管理它的最佳做法是什么。例如,我有1000个微服务,当有人刷新模型时,没有人会输入service migrate。我考虑了一个集中式数据库服务,我们只需添加一个新列,它就可以存储所有迁移的所有模型。唯一的问题是,服务如何了解数据库模型的变化。这就是我们在服务中存储例如用户的方式:

type User struct {
    ID        uint           `gorm:"column:id;not null" sql:"AUTO_INCREMENT"`
    Name      string         `gorm:"column:name;not null" sql:"type:varchar(100)"`
    Username  sql.NullString `gorm:"column:username;not null" sql:"type:varchar(255)"`
}

func (u *User) TableName() string {
    return "users"
}

3 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题,您仍尝试使用一个MySQL实例但使用许多微服务。

有几种方法可以使SQL系统工作:

  1. 您可以创建一个微服务类型来处理数据库中的数据插入/读取并利用connection pooling。并让其他服务通过这些服务读取/写入所有数据。这肯定会给你的所有写入/读取带来一些额外的延迟,并且可能会出现大规模的问题。

  2. 您可以尝试查找可轻松扩展的多主SQL解决方案(例如CitusDB),并且可以为数据库使用中央架构,并确保处理数据插入的边缘情况(de-deuping等)

  3. 您可以使用KafkaAWS Kinesis等数据流架构将数据传输到微服务,并确保它们仅通过这些流处理数据。这样,您就可以将数据库与数据分离。

  4. 在我看来,接近它的最好方法是#3。这样,您就不必在微服务架构的计算层考虑存储。

    不确定您为微服务使用了哪些服务,但StdLib强制进行一些转换(例如,仅通过HTTP传输数据),这有助于人们全力以赴。 AWS Lambda也可以很好地与Kinesis一起使用,作为启动该功能的源,可以帮助实现#3方法。

    免责声明:我是StdLib的创始人。

答案 1 :(得分:2)

根据您的用例,可以选择使用MySQL Cluster。 MySQL群集使用的Two phase commits使得频繁写入变得不切实际,但是如果写入性能不是大问题,那么我希望MySQL群集比连接池或排队黑客更好。当然值得考虑。

答案 2 :(得分:1)

如果我理解你的问题,在我看来可能有多种方法可以实现这一目标。

一种解决方案是在数据库中的某个位置具有模式版本,您的微服务会定期检查。数据库架构更改后,您可以增加架构版本。因此,如果服务注意到数据库模式版本高于服务的当前模式版本,则它可以在typedef const char* LPCSTR; 允许的代码中迁移模式。

其他选项可能取决于您运行微服务的方式。例如,如果您使用某个业务流程平台(例如Kubernetes)运行它们,则可以在服务初始化时将迁移代码放在某处运行。然后,一旦更新了模式,就可以强制滚动刷新容器,从而触发迁移。