[ 
https://issues.apache.org/jira/browse/KYLIN-4654?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17196654#comment-17196654
 ] 

chuxiao commented on KYLIN-4654:
--------------------------------

projectL2Cache重构
核心原则
最重要的方法是getRealizationsByTable,每次查询都用到。其他listDefinedTables,listAllRealizations,listExposedColumns,listExposedTables方法也会被用到。
核心原则是读缓存的性能优先,写缓存不堵塞读,多进程场景下允许短时间内读到脏缓存。
写缓存操作最小粒度加锁,保证高并发场景下的最终一致性。
读缓存尽量不加锁,读访问的容器对象要么是支持并发的,要么只通过new重置引用来更新。projectcache的tableCache每次更新new一个重新put,其他的容器字段改并发容器。
projectCaches改为ConcurrentHashMap提高读性能。prjCache的realizations由Set<realization>改ConcurrentHashMap,tables由Map<String,
 TableCache>改ConcurrentHashMap,exposedTables改为copyonwriteset

更新
更新操作拆分为PrjCache整体load和局部更新。
loadPrjCache
只有当系统第一次加载某个prj的projectcache时,要double check加锁等缓存加载完再读,其他时候读操作都不受锁影响。
reloadprojectcache会加一个prj的锁,先将旧projectcache的reload标签设置为true,再重新load一次prjCache对象,put回map。

局部更新
最终一致性保证
更新/删除 table或realization时局部更新prjCache。先get 
prjcache并判断prjcache的reload是否为true,true则加prj的锁等待reload完成后再重新get 
prjCache,在新的prjcache上做更新操作。
假设reloadprjcache前已经有更新table/realization操作正在执行了,则更新table/realization会在旧prjCache上操作。由于触发二级缓存更新realization的前提是一级缓存已经更新了,所以reload新的prjCache是可以加载到table/realization的更新,不会有正确性问题。

table操作

更新table操作,当save 
table成功/收到同步table广播reloadLocal后触发。能更新说明没有依赖自己的model更没有realization,所以exposedTables不需要更新。对table
 name加锁,{tables putIfAbsent,get tableCache,从1级缓存中获取最新的tableDesc,设置tableDesc}。
删除table操作,当删除table成功/收到删除table广播removeLocal后触发。exposedTables遍历一遍,找到同名的remove掉。tables也remove。

realization操作
更新realization操作,当save 
realization/收到同步广播后触发。先对canonicalName加锁,{重新从1级缓存中获取最新的realization对象,如果prjCache中已存在相同更新时间的realization,说明最新的对象更新过了,不需要更新直接return。否则遍历tablesCache,把存在realization的tablesCache找出来,再计算new
 realization有哪些tablesCache,这些是要改变的tablesCache。遍历每一个要改变的tablesCache,对table 
name加锁,{new tableCache并init,put回tables。}}
删除realization操作,当删除realization成功/收到删除realization广播removeLocal后触发。realizations中删除。遍历tablesCache,把存在realization的tablesCache找出来,加table名的本地锁。{new
 tableCache并init,put回tables}。

> new metadata read/write and reload mechanism
> --------------------------------------------
>
>                 Key: KYLIN-4654
>                 URL: https://issues.apache.org/jira/browse/KYLIN-4654
>             Project: Kylin
>          Issue Type: Improvement
>            Reporter: chuxiao
>            Priority: Major
>         Attachments: 优化方案.docx, 现有代码梳理.docx
>
>
> support when there are 10,000 cube in one cluster one project, and 1000 cubes 
> continue update,still can create cube  and query  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to