实时数据流系统中避免"过期读"的性能优化方案

问题的背景

实时数据流系统具有以下特点:

典型的实时数据流系统包括:工业数据监测系统、传感器检测系统、位置服务系统、电子商务网站、电信收费系统、服务器日志。

问题是什么

对于实时数据流系统,数据的汇集、存储、转换、查询、统计都面临性能优化的需求。在实际的系统实现中,性能优化的技术体现的多个层面:

同时采用以上技术时,可能碰到“过期读”(stale read)问题。例如,持久化事务的缓存会使从库无法实时读到数据更新:一条数据在主库中被修改了,它由持久化对象写入主库,然后同步到从库,但是从库的持久层并没有感知到此条数据已被更新,因而从库的查询就会得到其持久层缓存里的旧数据。

怎么才能避免“过期读”、同时又不放弃所有的性能优化技术呢?

解决问题的方案

通过实践得知:当创建或者删除数据时,主从持久化层对象必然更新。如果一种数据只增删不更改,则这类数据不存在“过期读”的问题。所以,解决方案是:对系统中的数据加以分类,对只增删的数据做读写分离,对会发生更改的数据要么只在主库上操作、要么关闭持久化层的缓存。

幸运的是,实时数据流系统中的关键数据通常是只增删的。以定位服务系统为例,大量积累的数据是坐标值,一旦记录不再更改,则可以做到读写分离加缓存同时避免过期读;系统中的用户管理数据是实时变动的,读写均在主库上,由于数据规模有限、对性能影响并不大。