Apache ShardingSphere 行表达式配置详解
什么是行表达式
行表达式是 Apache ShardingSphere 中一种简洁高效的配置方式,主要用于定义数据分片规则中的实际数据节点(actualDataNodes)和分片算法表达式。它通过特定的语法规则,可以快速生成一系列符合特定模式的字符串,大大简化了分片规则的配置工作。
行表达式的四种实现类型
Apache ShardingSphere 提供了四种行表达式实现类型,每种类型适用于不同的场景和需求。
1. GROOVY 类型(默认)
GROOVY 类型使用 Groovy 语法来实现行表达式功能,是最常用的一种实现方式。
语法特点:
- 使用
${ expression }
或$->{ expression }
标识表达式 - 支持 Groovy 的所有操作
${begin..end}
表示范围区间${[unit1, unit2, unit_x]}
表示枚举值- 多个表达式会进行笛卡尔积组合
使用示例:
# 生成 t_order_1, t_order_2, t_order_3
<GROOVY>t_order_${1..3}
# 生成 online_table1, online_table2, online_table3, offline_table1, offline_table2, offline_table3
<GROOVY>${['online', 'offline']}_table${1..3}
适用场景:
- 大多数常规分片场景
- 需要灵活生成复杂分片规则的场景
2. LITERAL 类型
LITERAL 类型是最简单的实现,它不会对输入内容做任何转换处理。
语法特点:
- 直接输出配置的字符串
- 不支持任何表达式解析
- 适用于 GraalVM Native Image 环境
使用示例:
# 直接输出 t_order_1, t_order_2, t_order_3
<LITERAL>t_order_1, t_order_2, t_order_3
# 直接输出 t_order_${1..3},不会解析表达式
<LITERAL>t_order_${1..3}
适用场景:
- 需要精确控制输出内容的场景
- 在 GraalVM Native Image 环境下使用
3. INTERVAL 类型
INTERVAL 类型专门用于处理时间区间相关的分片规则,采用键值对语法定义时间范围。
语法特点:
- 使用
Key=Value
格式定义参数 - 多个参数用
;
分隔 - 支持时间区间自动生成
主要参数说明:
P
:前缀,表示结果单元的前缀格式SP
:后缀模式,表示时间戳格式DIA
:时间间隔量DIU
:时间间隔单位DL
:时间下限DU
:时间上限C
:日历系统(可选)
使用示例:
# 生成 t_order_2023_1202, t_order_2023_1203, t_order_2023_1204
<INTERVAL>P=t_order_;SP=yyyy_MMdd;DIA=1;DIU=Days;DL=2023_1202;DU=2023_1204
# 生成 t_order_2023_10, t_order_2023_11, t_order_2023_12
<INTERVAL>P=t_order_;SP=yyyy_MM;DIA=1;DIU=Months;DL=2023_10;DU=2023_12
# 使用日本日历系统生成表名
<INTERVAL>P=t_order_;SP=GGGGyyyy_MM_dd;DIA=1;DIU=Days;DL=平成0001_12_05;DU=平成0001_12_06;C=Japanese
适用场景:
- 按时间范围分片的场景
- 需要自动生成时间序列表名的场景
4. ESPRESSO 类型(实验性)
ESPRESSO 类型是实验性功能,通过 GraalVM Truffle 的 Espresso 实现在 GraalVM Native Image 环境下支持 Groovy 语法。
语法特点:
- 语法规则与 GROOVY 类型相同
- 需要额外依赖支持
- 目前仅支持 Linux amd64 环境
使用示例:
# 生成 t_order_1, t_order_2, t_order_3
<ESPRESSO>t_order_${1..3}
# 生成 online_table1, online_table2, online_table3, offline_table1, offline_table2, offline_table3
<ESPRESSO>${['online', 'offline']}_table${1..3}
适用场景:
- 在 GraalVM Native Image 环境下需要使用 Groovy 语法的场景
配置示例
下面是一个完整的分片规则配置示例,展示了不同行表达式类型的实际应用:
rules:
- !SHARDING
tables:
t_order:
actualDataNodes: <LITERAL>ds_0.t_order_0, ds_0.t_order_1, ds_1.t_order_0, ds_1.t_order_1
tableStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: t_order_inline
keyGenerateStrategy:
column: order_id
keyGeneratorName: snowflake
defaultDatabaseStrategy:
standard:
shardingColumn: user_id
shardingAlgorithmName: database_inline
shardingAlgorithms:
database_inline:
type: INLINE
props:
algorithm-expression: <GROOVY>ds_${user_id % 2}
t_order_inline:
type: INLINE
props:
algorithm-expression: t_order_${order_id % 2}
keyGenerators:
snowflake:
type: SNOWFLAKE
选择建议
- 常规场景:优先使用 GROOVY 类型,功能最全面,使用最广泛
- 精确控制场景:使用 LITERAL 类型,避免表达式解析
- 时间分片场景:使用 INTERVAL 类型,简化时间区间配置
- GraalVM Native Image 环境:根据是否需要 Groovy 语法选择 LITERAL 或 ESPRESSO 类型
注意事项
- 如果不指定类型,默认使用 GROOVY 类型
- INTERVAL 类型会忽略时区信息,使用时需确保时间格式一致
- ESPRESSO 类型是实验性功能,生产环境需谨慎使用
- 使用非默认类型时,需确保相关依赖已正确配置
通过合理选择和使用行表达式类型,可以大大简化 Apache ShardingSphere 的分片规则配置,提高配置效率和可维护性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考