假设我有一个gpc服务,并且有一个API可以创建新用户,如下所示: service UserService{ rpc CreateUser(CreateUserRequest) returns (CreateUserResponse);}message User { string userId = 1; string firstName = 2; string lastName = 3; string password = 4;}message CreateUserRequest { user User = 1;}message CreateUserResponse { user User = 1;}该服务将用户数据保存到PostgresDb中的users_table中,如下所示:user1 := NewUser() // instantiating the User object as defined in the proto file.// user2 := NewMyUser() // instantiating the MyUser object as defined separately in the service.result := s.db.Table(UsersTable).Create(user1) 此外,我正在使用proto缓冲区根据上面的api proto文件生成服务器和客户端代码。我的问题是:在实例化用户对象时,用户应该是在原型定义中定义的生成的用户结构吗?或者我应该像这样将另一个用户结构定义为专用于postgresDb的服务中的模型?struct MyUser { userId string firstName string lastName string password string createdAtMs int64 // an extra field not available in the api}后续问题:每种方法的优缺点是什么?它的最佳设计原则是什么?
1 回答

眼眸繁星
TA贡献1873条经验 获得超9个赞
这两种方式在实践中都会发生。这可能主要取决于您的服务有多少逻辑;逻辑很少的服务(例如,围绕数据库的小型包装器)更有可能将原型直接存储在数据库中。具有相似但略有不同的原型是很常见的,其中数据在通过系统时在每一步都被复制。
如果您将原型直接存储在数据库中,然后意识到您犯了一个错误,则可以通过创建一个与旧消息兼容的新消息(一个新名称,但所有相同的字段具有相同的ID)来“分叉”原型消息。您将代码迁移到新消息(将旧消息保留在服务中)的痛苦,但是使用此方法,您不必在交换到新消息类型之前重新编码数据库中的所有数据。
如果选择在数据库中使用相同的消息,则应确保在存储未知字段之前将其删除。否则,当您将来添加新字段时,您可能会发现已损坏/恶意的客户端已在该字段中存储了数据。
- 1 回答
- 0 关注
- 106 浏览
添加回答
举报
0/150
提交
取消