假設(shè)我有一個gpc服務(wù),并且有一個API可以創(chuàng)建新用戶,如下所示: 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;}該服務(wù)將用戶數(shù)據(jù)保存到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緩沖區(qū)根據(jù)上面的api proto文件生成服務(wù)器和客戶端代碼。我的問題是:在實例化用戶對象時,用戶應(yīng)該是在原型定義中定義的生成的用戶結(jié)構(gòu)嗎?或者我應(yīng)該像這樣將另一個用戶結(jié)構(gòu)定義為專用于postgresDb的服務(wù)中的模型?struct MyUser { userId string firstName string lastName string password string createdAtMs int64 // an extra field not available in the api}后續(xù)問題:每種方法的優(yōu)缺點是什么?它的最佳設(shè)計原則是什么?
1 回答

眼眸繁星
TA貢獻1873條經(jīng)驗 獲得超9個贊
這兩種方式在實踐中都會發(fā)生。這可能主要取決于您的服務(wù)有多少邏輯;邏輯很少的服務(wù)(例如,圍繞數(shù)據(jù)庫的小型包裝器)更有可能將原型直接存儲在數(shù)據(jù)庫中。具有相似但略有不同的原型是很常見的,其中數(shù)據(jù)在通過系統(tǒng)時在每一步都被復制。
如果您將原型直接存儲在數(shù)據(jù)庫中,然后意識到您犯了一個錯誤,則可以通過創(chuàng)建一個與舊消息兼容的新消息(一個新名稱,但所有相同的字段具有相同的ID)來“分叉”原型消息。您將代碼遷移到新消息(將舊消息保留在服務(wù)中)的痛苦,但是使用此方法,您不必在交換到新消息類型之前重新編碼數(shù)據(jù)庫中的所有數(shù)據(jù)。
如果選擇在數(shù)據(jù)庫中使用相同的消息,則應(yīng)確保在存儲未知字段之前將其刪除。否則,當您將來添加新字段時,您可能會發(fā)現(xiàn)已損壞/惡意的客戶端已在該字段中存儲了數(shù)據(jù)。
- 1 回答
- 0 關(guān)注
- 107 瀏覽
添加回答
舉報
0/150
提交
取消