目前我们有一些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"
}
答案 0 :(得分:2)
如果我正确理解您的问题,您仍尝试使用一个MySQL实例但使用许多微服务。
有几种方法可以使SQL系统工作:
您可以创建一个微服务类型来处理数据库中的数据插入/读取并利用connection pooling。并让其他服务通过这些服务读取/写入所有数据。这肯定会给你的所有写入/读取带来一些额外的延迟,并且可能会出现大规模的问题。
您可以尝试查找可轻松扩展的多主SQL解决方案(例如CitusDB),并且可以为数据库使用中央架构,并确保处理数据插入的边缘情况(de-deuping等)
您可以使用Kafka或AWS Kinesis等数据流架构将数据传输到微服务,并确保它们仅通过这些流处理数据。这样,您就可以将数据库与数据分离。
在我看来,接近它的最好方法是#3。这样,您就不必在微服务架构的计算层考虑存储。
不确定您为微服务使用了哪些服务,但StdLib强制进行一些转换(例如,仅通过HTTP传输数据),这有助于人们全力以赴。 AWS Lambda也可以很好地与Kinesis一起使用,作为启动该功能的源,可以帮助实现#3方法。
免责声明:我是StdLib的创始人。
答案 1 :(得分:2)
根据您的用例,可以选择使用MySQL Cluster。 MySQL群集使用的Two phase commits使得频繁写入变得不切实际,但是如果写入性能不是大问题,那么我希望MySQL群集比连接池或排队黑客更好。当然值得考虑。
答案 2 :(得分:1)
如果我理解你的问题,在我看来可能有多种方法可以实现这一目标。
一种解决方案是在数据库中的某个位置具有模式版本,您的微服务会定期检查。数据库架构更改后,您可以增加架构版本。因此,如果服务注意到数据库模式版本高于服务的当前模式版本,则它可以在typedef const char* LPCSTR;
允许的代码中迁移模式。
其他选项可能取决于您运行微服务的方式。例如,如果您使用某个业务流程平台(例如Kubernetes)运行它们,则可以在服务初始化时将迁移代码放在某处运行。然后,一旦更新了模式,就可以强制滚动刷新容器,从而触发迁移。