翻译系统 5/14/2019更新

第二版 (5/14/2019更新)

React component example

<LanguageResource key = checkout.cfmMoney>Confirm Amount</LanguageResource>

数据库设计

Language Resource Table Schema
Key, OriginContent, LastUpdated, ContentLangId1, LastUpdatedLangId1, ContentLangId2, LastUpdatedLangId2, ...
Key一定是要有比较规范的name space, 避免出现同一个key被不同的developper使用修改。

Task Table Schema
Key, OriginContent, LastUpdated, LanguageId, TranslatorId, status, HtmlFileLink, prioritiy

一种做法: 网页修改完毕不等翻译完成就上线。

网页文件修改之后一种做法是直接deploy,用户load页面的时候会产生翻译请求。
这种做法的考虑基于是很多时候某个页面在某种语言很少会出现,没必要等全部翻译完再上线。
根据用户load的时候如果某个key找不到,就会自动产生一个translation request, 同时用英语做为fall back。 一个key被Request的次数越多他的优先级越高,

API:

GetTranlantion(key, originContent, url)
this API call may make internal call: RequestTranslatorService(key, originContent, url)

单词内容有变化? OriginalContent修改的情况

如果这个key的英文改了: 在translation的时候就会发现送过去的originalLanguageContent的数据库里的不一致!这种情况要做三件事情: 1。 更新数据库里的original content, 2。 更新originalContent 的last update time。 3. send update translation request.

如果翻译还没更新又来访问这个request了, 虽然内容一致,但翻译和原文的timestamp顺序相反,这时仍然使用旧的翻译,同时再发一次translation request.

updateTranslationAsOriginalContentUpdated(key, previousContent, newContent)

如果嫌慢(因为要写很多个任务)可以丢到一个message Queue里面去异步执行。

key , originalcontent, translantion.

如何翻译

getTranslation(key, OriginalLanguageContent, languageId)

如果找到,originalContent一致并且翻译的timestamp比数据库里originalContent的时间stamp要晚,则直接返回。如果找到但内容不一致/timestamp不对 则refer to original content修改的情况。

如果找不到就fall back为英语,同时增加一个翻译请求。这个翻译请求如果已经在task list里了,就更新优先级, 如果不在, 就新建。

如何给翻译员分配任务

根据翻译员的语言种类,从当前任务列表里先择优先级最高的一组翻译,最好是据有相同key前缀的(一般优先级也会相同, 因为一个页面里的key是同时更新优先级的)。同时更新Task table把当前任务设为pending,翻译员id也设置上. 这样别的翻译员就不会去拿同一个task。 可以再增加一个field记一下任务是什么时候开始的。如果一段时间任务并没有完成,则自动重新变成available.

getTranslationTask(languageId, amount, translatorId);

翻译员如何更新翻译

Api: enterTranslation(key, languageId, translated content, translatetimeStamp, originContentTimeStamp)

在更新数据库时候先check一下数据库里original content的time stamp, 如果翻译人员提交的original content的timestamp比较老, 则拒绝这次更新,返回outdated originalContent Exception.

如果更新成功, 则把更新的信息broadcast给所有存有cache的web服务器。也可以定期推送。

另外一种做法翻译完再上线。

另外一种做法是网页修改之后,直接extract新的key和修改过的key value pair. 这些key不翻译完新版网页就不上线。

Api: ExtractForTranslation(fileName) return a jobId

Using this jobId, the developper can see how much content has been already translated

全部翻译完成后翻译官把整个翻译的package发过来。发过来之后由系统统一deploy。但这样会delay上线速度。 此时翻译官也不会直接把翻译输入数据库。因为新网页还没上线, 翻译先上线会造成数据不一致。

Scale

可以把两张表都放到数据库里面。 Lanaguage Resource Table直接在每个webserver上做cache。如果数据库有更新,数据库服务器就会notify 其他所有的webserver更新cache。可以每十分钟做一次。

如何Sharding:

由于数据量不大,本身不一定需要sharding。可以按语言和对应的location sharding。

Indexing

LanguageResource直接按key查+就可以了, 本身就有index, 不需要再建index。

对于task Table要按 languageId + 状态 建 index,

task Table的primary index是 key + languageId,

每天半夜12点可以更新一下优先级,让所有的优先级衰减。删掉那些低于某些threhold的值。

-----------------------------我写的翻译系统第二版到这里结束-------------------------------------------------------------

参考文献:

相关的官方技术博客
https://medium.com/airbnb-engineering/launching-airbnb-jp-in-record-time-52f8b0af965d
技术文档 https://airbnb.io/polyglot.js/
其他 https://www.jiuzhang.com/qa/5054/ https://github.com/donnemartin/system-design-primer

4S 分析大法

Scenario:

前端人员使用一种语言(比如英语)设计前端。
menu label, 描述,免责条款,
前端人员release 英文版网页或内容 ==》 触发翻译系统extract 翻译事件 :翻译系统分析英文版文件,对比哪些句子/内容已经翻译过了,哪些句子/内容需要新翻译。==》 extract出新句子分发给翻译员。==》翻译员完成翻译任务之后返回给翻译系统。翻译系统输出多种语言包。

系统可以分为两种实现形式:

如果是网页更新比较慢而且是一组静态网页的话。

1。前端人员 2。 网页分析服务。 3数据库 4。 Combine 服务 5。翻译员。
这样的话,所有的内容在创建的时候都立马翻译好,可能有几个小时到一两天的delay。
这种的缺点是所有语言版本的发布会比较慢,因为所有内容都要翻译。

如果是像Airbnb这样的动态生成的网页(数据都是数据库里调出来的)

前端人员修改网页的时候,可以在修改完网页时自动发一个翻译的request 通知系统去翻译,但可能网页还没翻译完就上线了。
用户输入airbnb.cn网站地址,根据用户的地理语言信息,webserver在生成网页的时候发一个translate request. 把网页里对应的标签转换成相应的语言再返回给用户。相当于一个实时的翻译系统。不需要等待页面全部翻译完成再上线。如果一个词在本地cache里,先查本地cache, 如果不在本地cache,则可以跨过网络去查数据库的cache,如果数据库的cache里面也没有,则去数据库里找,找不到就用默认语言并且去待翻译数据库里面给该key增加一下优先级。 一个key被request的次数越多,它的优先级越高。

翻译人员从“待翻译数据库” 里拿出当前优先级最高的词, 翻译,输入系统。

API

GetTranslate(key, default, locale)
EnterTranslatedVersion(key, default, value, locale)
如果要改key 和default的话, 可以增加一个api, updateTranslate(key, new default, locale)

需要设计多牛的系统

怎么估算size??
还真不知道。 算一下有多少网页:每个网页有多少单词??还得再想想

Service

Translate Service
Translator task service

Client     -->        webServer 
                            |
                            v
Front End -> Translate Service ->    DataBase
                                         ^
                                         |
                                         v
Translator   <-->       Translate Task Service 

Storage

Data model

Translation Table

用什么数据库? Redis (内存型), Cassandra, SQL + Memcached

Redis是纯粹的key -value pair: 如果用Redis
Key:Key + Locale, Value : content in language of locale + time stamp

如果用Cassandra, 三层结构。
Schema:
Row Key : Key ;
Column Key: Locale
Value: content in some language + time stamp
读取的时候要用Key + locale去读。

也可以用SQL,反正是读多写少,大不了用cache优化一下。
SQL也行。。。因为哪儿哪么多访问量

Task Table

这个量级很小,一个SQL就足够了。
Schema如下
Key,Original Language, To Language,优先级, status,

Working solution

前端人员把 key, English

优化:

按优先级排序,如果一个key被call的次数越多,优先级越高。 如果一个key四天都没有被call过,则自动清除出队列。

加速 优化perf

在Web Server端放一些Cache,有问题先查本地的cache,查不到再找DB。
建index, 只需要根据key 和locale建一个composite primary index就可以了。
bloom filter : 如果一个key不在bloom filter里面,则肯定不用找了。

关键问题: 如果DB更新了,如何第一时间更新那么多server:

DB主动发送push notification给Web Server.
需要设计TTL吗? 最好这样,不然如果某些push notification某种原因没有收到,就跪了。

Sharding

如果需要Sharding,则可以按语言按距离按国家Sharding。
非要按Hash code sharding的话,sharding key就是我们的key。其实并不需要sharding,一台机器是可以搞定的。
Consistent hashing 的概念
按String做为sharding key

Cache

Cache thru 和Cache aside都可以。但重要的是在服务器端直接cache, 就不用每次访问数据库了。

前端程序员不受后端设计的影响。

前端用key,和 value写在html里面。

translator有另一个portal输入翻译而且能马上看到效果

把对应的html存下来,直接调存下来的html显示。

再来就是有时候translator翻译错了修改之后怎么样才能更快的让大家看见(如果你有cache的话)

Broadcast,Server和DB 保持一个长链接,有新的变化立马通知。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容