性能是所有微服务成功的关键。只有在微服务设计,开发和交付整体过程中的各个环节上使用“性能友好型”技术,才能得到一个良好的总体性能。
但在很多情况下,通过在数据消费者与存储数据的服务器之间的中间层采用各种基本技术(例如使用和优化缓存),可以大幅改善性能。因为缓存使用内存来提供更低的访问延迟,因此能够比位于磁盘的原数据库更快地返回数据。同时,从网络拓扑的角度来说,缓存通常也更靠近数据消费者。
缓存可以放到基础架构中任何存在数据传输瓶颈的地方。在这篇文章中,我们将主要介绍旁路缓存 (Look-Aside Caching),它是避免微服务从后端存储中访问数据的高性能替代方案。我们也会介绍各种缓存模式术语,如旁读 (read-aside)、透读 (read thru)、透写 (write through) 和后写 (write behind) 缓存,以及何时选择不同的模式。
旁路缓存与内嵌缓存
缓存的两种主要模式是旁路缓存模式和内嵌缓存模式。这两种模式的介绍与区别如下表所示。
旁路缓存基础知识
在旁路缓存模式中,如果数据未缓存,应用便从后端存储中获取数据,并将数据放入缓存中以备后续读取。
这种模式的优势在于它不需要开发人员向缓存服务器中部署任何代码。相反,旁路模式让开发人员和应用代码负责管理缓存。但缓存控制这个优势,也需要和缓存管理成本一起考虑。
Spring Framework 等开发框架可通过缓存抽象来减轻这种负担,缓存抽象可为开发人员提供一种统一机制来使用缓存,而无需考虑采用哪种具体的缓存技术。这种抽象提供了一套 Java 注释(如针对方法的 @Cacheable 注释),当出现缓存缺失时执行函数并缓存结果。开发人员可以学习和使用 Spring 的缓存抽象,而不用了解各种缓存技术相关的内部细节。同事,缓存内置的数据生命周期管理功能也可以进一步减轻缓存的管理成本。
旁路缓存主要用于不经常变化的数据, 就是我们经常说到的“一写多读”场景。如果后端存储中的数据变化很快,那么条目失效的通知数量会大幅增加,这会大幅削弱缓存的优势。
在应用层具有更多控制
与内嵌缓存相反,旁路缓存是声明性的:开发人员需要告诉应用需要缓存什么,而不是如何缓存。而使用内嵌缓存时,开发人员必须将代码部署到缓存服务器中,同时开发人员也必须明确的处理缓存未命中的情况。
开发人员可以根据业务需要部署代码,以完成将写入缓存的操作以同步或者异步的方式写到后端存储中。
因此,内嵌缓存模式和旁路缓存模式的关键区别在于应用层代码和缓存负责内容。
在旁路缓存模式中,在应用层的控制力更大。而在内嵌缓存模式中,代码部署到缓存服务器,由缓存负责控制和后端存储之间的读写交互。
转自 pivotal中国公众号