Velocity:微软的分布式内存缓存
在过去几年里,从主流的Java应用到象Erlang这样的边缘语言,分布式内存缓存的应用相当流行。为了继续疯狂赶超开源世界中处于支配地位的技术,微软也引入了它的分布式缓存。
Velocity是专门针对.NET平台设计的分布式缓存。那些熟悉其他分布式内存缓存的人们会在其中发现许多相似的特性。它目前作为社区技术预览对外提供下载。
Velocity的客户端有两类。简单客户端只知晓一个单缓存服务器。如果在那个服务器上没有找到被请求的对象,那么缓存服务器会从合适的服务器上将它取来。路由客户端(Routing client)则对其了解更深一些。它们总是知道在哪里可以找到哪个特殊的对象,因此它可以直接查询缓存服务器。关于发送所有缓存位置数据给路由客户端(Routing client)对性能造成的影响,尚未有所定论。除了缓存服务器,两类客户端都支持一个本地缓存选项。对于过期数据,该选项仍然要求去检查服务器。但是在处理大量缓存对象时,它应该能减少网络流量。
关于并发性有两个选项。使用乐观并发,只有第一次更新才能成功,任何后续对现有过期对象的更新都将失败。使用悲观锁,一个锁句柄将会被返回。在锁释放或超时之前,任何获得锁的尝试都将失败。获得锁失败操作是一个非阻塞操作。
通过设置过期日期或每当内存压力过大时,对象可以从缓存中显式被移除。后一种方法,被称为驱逐(eviction),使用最近最少使用的算法来处理。
除了一个关键字,对象还可能有一组与之关联的标签。Velocity提供了检索一个或全部与一个标签列表相匹配的对象的方法。
尽管支持ASP.NET的会话模型,但是那只是微软众多设想中的一个。S Muralidhar写道:
我们对ASP.NET的支持只是整个.NET平台蓝图中的一部分。剩下的是确保我们不只把焦点单单放在ASP.NET应用上。作为例子,我们计划与普通.NET应用(如Windows服务)或那些不涉及ASP.NET的IIS应用集成。
现在让我们看看即将到来的功能。目前的CTP版特性支持向外扩展(scale-out)、本地缓存,以及ASP.Net SessionState与许多其他应用的集成。我们有大量的工作项,它们有望在随后的CTP和RTM版中实现,包括:支持可用性、缓存复制、通知和更好地管理支持等。
我们已经从很多开发者那里听到对于推式通知(Push-based notification)的需求。这当然是我们非常关心的领域。尽管目前的CTP版还不支持它,但是这个需求有望在我们即将发布的版本中得到满足。在目前这个过渡时期,如果你使用Velocity的本地缓存,我们提供了一些绕过它的API(如GetIfVersionMismatch())来处理本地缓存中潜在的陈旧/过期对象。(你需要使用Get()和GetIfVersionMismatch()方法组合来得到正确的行为。)
对更高级技术的支持亦在计划中。Anil Nori补充道:
由于应用开始将缓存用于数据访问,我也相信,他们会要求更丰富的数据服务,如查询、事务、分析、同步等。例如,我相信.NET有可能会要求在分布式缓存上使用LINQ查询,就像它们查询后端SQL Server数据库一样。我们预计“Velocity”会成为一个全面的分布式缓存平台。