項目中做個統一訂單的基礎服務(只記錄訂單的基本的公共信息),1、便與后續各種其他業務的接入~ 2、同時APP端提供統一訂單信息的查詢入口,后續其他業務不用升級
由於統一的訂單服務,所以訂單量會很大,所以目前考慮進行分表操作,
1、分表方案
一:基於Poxy MyCat中數據庫中間件
優點:功能強大,對應用侵入小,不需要改代碼
缺點:搭建更復雜,需要專門部署中間件
二:基於Sharding jdbc 開發框架
優點:輕量級java組件,部署簡單~ 集成一個jar
缺點:對應用有入侵,需要修改代碼
采用當當sharding jdbc (https://www.jianshu.com/p/dd47dd3b1f6b)
2、分表策略
(1)容量粗略估算 每天10w訂單 一個月300W訂單
(2) 分表數量 5張 每張 300w共 5 * 300W = 150000
( 3)分表維度
按用戶標識進行分表
后續需要考慮~~~
(4) 擴容問題 : 按用戶標識分表后如何解決擴容?一致性hash?
(5) 數據分離:前5個月的數據如何歸檔到歷史庫?
3、分表實踐
(1)maven倉庫
maven {url 'https://mvnrepository.com/artifact/io.shardingjdbc/sharding-jdbc-core'}
(2) Sharding JDBC依賴
增加 sharding jdbc 和 HikariCP 連接池
compile('io.shardingsphere:sharding-jdbc-spring-boot-starter:3.0.0.M1')
compile('com.zaxxer:HikariCP')
(3)增加配置
# 分庫策略 sharding: jdbc: datasource: names: order_service order_service: type: com.zaxxer.hikari.HikariDataSource driverClassName: com.mysql.jdbc.Driver jdbcUrl: jdbc:mysql://**/order_service username: root password: ** config: sharding: tables: t_order: actual-data-node: order_service.t_order_${0..4} table-strategy: inline: sharding-column: user_id algorithm-expression: t_order_${user_id % 5}
數據庫名 order_service
邏輯表名 t_order (所有查詢可以基於邏輯表名)
分表列 user_id
分表算法:user_id % 5
下面可以基於mybatis 對邏輯表t_order 進行增、刪、改操作 具體sharding jdbc 使用方法略