分布式文本多语言翻译存储平台
地址:
Gitee:https://gitee.com/dreamPointer/zza-translation/blob/master/README.md
一、提供服务
二、特点
- 分布式部署:zza-translation-core 服务支持集群部署,zza-translation-client 客户端采用轮询策略实现(CoreServerSelector.java)
- 高度并行化:文本翻译、已翻译文本获取/存储等操作按数据源分片策略并行执行
- 并行自适应性调整(todo):当并行执行的线程数量较高时,可自适应调整为串行,减少线程上下文切换开销
- 高效网络传输:客户端(TransClient.java)与服务端(TransService.java)之间的数据传输使用 ProtoBuf 进行压缩(todo),服务端网络应用(CoreServer.java)采用 Netty 实现
- 翻译失败重试:开启失败担保策略下,当依赖的第三方翻译服务不可用或请求翻译失败,将翻译失败的请求存储,由后台线程 retry 处理(TextTranslateFailedGuarantor.java),默认支持最大重试次数为 5 次,失败则丢弃
- 高效缓存:使用 LRU 策略的 Caffeine 作为本地缓存,以单条翻译结果为单位进行存储
- 定制化存储:翻译文本数据库支持自定义分库分表数量,以及语言类型与数据源关系映射
三、软件架构
1. 网络应用层:Netty
- CoreServer.java
支持 token 身份验证
2. 数据存储层:MySQL
-
DynamicDatasourceInterceptor.java:
基于动态数据源实现分库分表检索 -
原文本数据库:zza_origin
- text_origin_${0…9}
-
翻译文本数据库:zza_translation_${0…n}
- text_translation_KaTeX parse error: Expected group after '_' at position 15: {languageType}_̲{0…n}
3. 本地缓存:Caffeine
- TranslationCache.java:
采用Caffeine LRU策略实现,未指定长度时,默认为5000
4. 翻译失败担保
- TextTranslateFailedGuarantor.java:
支持自适应的失败重试策略,根据失败数量动态调整重试并行度
5. 第三方翻译服务
第三方服务支持:
- 百度翻译:BaiduTranslator.java
- 阿里云翻译:AliyunTranslator.java
四、模块介绍
- zza-translation-core:文本多语言翻译与存储服务,支持集群部署
- zza-translation-client:文本多语言翻译存储服务客户端,采用轮询策略
- zza-translation-console:文本翻译结果控制台,支持对翻译结果的修改(todo)
- zza-translation-demo:客户端应用示例
五、安装教程
1. 配置MySQL数据库,导入SQL语句
导入 doc/sql 目录下的SQL
创建 zza_translation.sql 下 text_translation_* 相关的表,需要修改表名。
格式:text_translation_KaTeX parse error: Expected group after '_' at position 15: {languageType}_̲{idx}
- ${languageType}: 支持的语言类型,com.zhangziang.translation.common.constant.LanguageType.CN.name().toLowerCase()
- ${idx}: 分片索引,与 zza-translation-core 服务下 application.yml 配置中的 zza-trans.language-table-sharding 对应, 开始索引为0,最大值为 zza-trans.language-table-sharding - 1
比如:支持语言类型为中文(CN)、英文(EN),翻译结果表分片为10(zza-trans.language-table-sharding = 10),则需要创建 text_translation_cn_{0…9}、text_translation_en_{0…9}
2. 配置 zza-translation-core
- 配置application.yml
server:
port: 9820
tomcat:
threads:
max: 200
spring:
application:
name: zza-translation-core
datasource: # 支持多数据源
dynamic:
primary: zza_origin # 主数据源配置为 zza_origin 库,存储 /doc/sql/zza_origin.sql 中的表
datasource:
zza_origin:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/zza_origin?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
username: root
password: root
zza_translation_0: # 翻译结果数据源 zza_origin 库,存储 /doc/sql/zza_translation.sql 中的表
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/zza_translation_0?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
username: root
password: root
zza_translation_1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/zza_translation_1?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
username: root
password: root
zza_translation_2:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/zza_translation_2?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
username: root
password: root
mybatis:
mapper-locations: "classpath:/mybatis-mapper/*Mapper.xml"
type-aliases-package: com.zhangziang.translation.common.pojo.doo
configuration:
map-underscore-to-camel-case: true
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # Mybatis Log
# zza-trans-config
zza-trans:
core-server:
port: 9821 # CoreServer 端口
access-token: ZZA_TRANSLATION_CORE_ACCESS_TOKEN # 请求身份验证标识
datasource-language: # "数据源名称"与"对应语言类型"存储分片映射关系
zza_translation_0: CN,EN # 语言类型:com.zhangziang.translation.common.constant.LanguageType.name()
zza_translation_1: JA,FR
zza_translation_2: DE
language-table-sharding: 10 # 翻译结果存储表分片数
cache-size: 5000 # 本地缓存大小
failed-guarantee: true # 是否开启翻译失败重试机制
translator: # 第三方翻译工具
baidu:
app-id: "20231130001896326"
secret-key: "prEilA7caZpzDluJmV2j"
qps-limit: 1
3. 部署 zza-translation-core
4. 服务中引入 zza-translation-client 依赖
<dependency>
<groupId>com.zhangziang</groupId>
<artifactId>zza-translation-client</artifactId>
<version>${zza-trans.version}</version>
</dependency>
5. 配置CoreServer服务地址
zza-trans:
languages: CN,EN,JA,DE,FR # com.zhangziang.translation.common.constant.LanguageType
core-server: # 服务名称以及对应地址、访问身份校验(access-token需与该zza-translation-core服务中配置的 zza-trans.core-server.access-token 值相同)
core-9821: # 服务名称(可以任意命名,但多个服务名不可重复)
address: 127.0.0.1:9821 # 服务地址IP与CoreServer端口(端口需与该zza-translation-core服务中配置的 zza-trans.core-server.port 值相同)
access-token: ZZA_TRANSLATION_CORE_ACCESS_TOKEN
core-9822:
address: 127.0.0.1:9822
access-token: ZZA_TRANSLATION_CORE_ACCESS_TOKEN
core-9823:
address: 127.0.0.1:9823
access-token: ZZA_TRANSLATION_CORE_ACCESS_TOKEN
6. 使用
参考示例:zza-translation-demo