一篇文了解分布式队列编程:从模型、实战到优化(3)
采集计费系统架构图如下:
采用此架构,我们可以在如下方面做进一步优化:
分布式缓存更新(Distributed Cache Replacement)缓存是一个非常宽泛的概念,几乎存在于系统各个层级.典型的缓存访问流程如下:
对于已经存入缓存的数据,其更新时机和更新频率是一个经典问题,即缓存更新机制(Cache Replacement Algorithms ).典型的缓存更新机制包括:近期最少使用算法(LRU)、最不经常使用算法(LFU). 这两种缓存更新机制的典型实现是:启动一个后台进程,定期清理最近没有使用的,或者在一段时间内最少使用的数据.由于存在缓存驱逐机制,当一个请求在没有命中缓存时,业务层需要从持久层中获取信息并更新缓存,提高一致性. 挑战分布式缓存给缓存更新机制带来了新的问题:
构思根据上面的分析,分布式缓存需要解决的问题是:在保证读取性能的前提下,尽可能地提高老数据的一致性和新数据的可用性.如果仍然假定最近被访问的键值最有可能被再次访问(这是LRU或者LFU成立的前提),键值每次被访问后触发一次异步更新就是提高可用性和一致性最早的时机. 无论是高性能要求还是业务解耦都要求缓存读取和缓存更新分开,所以我们应该构建一个单独的集中的缓存更新服务.集中进行缓存更新的另外一个好处来自于频率控制. 由于在一段时间内,很多类型访问键值的数量满足高斯分布,短时间内重复对同一个键值进行更新Cache并不会带来明显的好处,甚至造成缓存性能的下降.通过控制同一键值的更新频率可以大大缓解该问题,同时有利于提高整体数据的一致性,参见“排重优化”. 综上所述,业务访问方需要把请求键值快速传输给缓存更新方,它们之间不关心对方的业务.要快速、高性能地实现大量请求键值消息的传输,高性能分布式消息中间件就是一个可选项.这三方一起组成了一个典型的分布式队列编程模型. 架构如下图,所有的业务请求方作为生产者,在返回业务代码处理之前将请求键值写入高性能队列.Cache Updater作为消费者从队列中读取请求键值,将持久层中数据更新到缓存中. 采用此架构,如果一个Cache Updater在性能上无法满足要求,可以对键值进行主题分区(Topic Partition)进行并行缓存更新,即采用发布订阅模式以提高可扩展性(Scalability). 后台任务处理(编辑:ASP站长网) |