1

你们在 Go 项目中如何实现分表读写的?插件?手写?代理?

 1 year ago
source link: https://www.v2ex.com/t/925774
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  Go 编程语言

你们在 Go 项目中如何实现分表读写的?插件?手写?代理?

  RedisMasterNode · 7 小时 5 分钟前 · 1440 次点击

苦于写了很多重复代码,想了解一下大家在 Go 的项目里面是怎么用 GORM (或者其他 MySQL 客户端,不限 ORM / Raw SQL )来实现分表读写的?

例如 user_tab_00000000 - user_tab_00000199,一共 200 张表,按 user_id % 200 来分表。

了解过的方案:

  1. DAO 层(或操作 DB 层)时根据传入参数计算,相关代码会出现在每个 Query 方法,例如 CreateUser()GetUserByUserID()UpdateUserByUserID()
  2. 挂载插件,init 时定义、注册分表字段、分表算法等等,DAO 层无特殊处理(就像在操作单表一样),实际执行的时候被改写,例如应用里执行 SELECT * FROM user_tab WHERE user_id = 199 最终会被改写成 SELECT * FROM user_tab_00000199 WHERE user_id = 199 发往 MySQL ;
  3. 应用层外挂载 MySQL 的代理,类似 ShardingSphere 这种,流程跟方案 2 类似,只是改写由外部中间件完成。

个人感觉方案 2 是个挺好的思路但是 Go 里面好像没有什么特别好用的中间件。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK