【问题标题】:Statelessness of RESTREST 的无状态性
【发布时间】:2014-12-17 11:06:56
【问题描述】:

我正在创建一个 REST 服务,它有两种方法,一种是 GetAll,另一种是 GetById。在我的场景中,数据库请求非常昂贵,所以我想存储输出GetAll 的某处(缓存)并将其用于后续请求 GetById

REST 的一个特点是它应该是无状态的。请求不能依赖于过去的请求,服务会独立处理每个请求。 我想了解处理此类场景的理想方法或如何在 REST 中设计此要求?

【问题讨论】:

  • 即使你缓存了数据,你的服务仍然是无状态的。在GetAll 之前调用GetById 并不重要。如果调用GetById,并且没有缓存数据,那么它只会获取它需要的数据。顺序无关紧要。

标签: rest web-applications asp.net-web-api restful-architecture stateless


【解决方案1】:

实现您想要的正确方法是使用缓存,例如MemoryCache

您创建一个单独的私有函数,该函数获取所有数据并将其缓存在内存中。然后你可以让GetAllGetById 都使用这个函数。

您的服务将保持无状态

MemoryCache 使用示例

MemoryCache cache = MemoryCache.Default;
string cacheName = "MyCache";

if (!cache.Contains(cacheName) || cache[cacheName] == null)
{
    // get data
    var data = ...

    // cache data
    cache.Set(cacheName, data, new CacheItemPolicy() { SlidingExpiration = DateTime.Now.AddDays(1).TimeOfDay });
}

return cache[cacheName];

【讨论】:

    【解决方案2】:

    REST 中无状态的要求是服务应该看起来是无状态的。服务是否在内部维护某种状态并不重要。这只是一个实现细节。

    【讨论】:

    • 这不是真的。无状态的定义意味着一个请求不应该假设前一个请求完成的工作。例如,一个请求不应该假设先前的请求处理了身份验证。
    • 其实是一样的。
    • 如果一个服务请求存储了一些东西,它不会变成有状态的吗?你能简单地告诉我有状态服务和无状态服务的区别吗?
    • 如果不管它是否存储了东西,它的行为都一样怎么办?无状态意味着无论调用顺序如何,它的行为都是相同的。恕我直言,只要服务行为相同,无论数据是否缓存,它都可以缓存一些数据 - 它仍然必须返回相同的结果,只是允许更快地返回相同的结果。
    • 为什么要使用状态而不公开呢?那将是两全其美。您不需要状态,因为它可以更好地扩展。
    【解决方案3】:

    对此有很多解决方案。我向您推荐的一种解决方案如下:

    配置 infinispan 以将其用作缓存机制。里面存储了一个并发的哈希图,键是查询,值是数据库的结果集,

    第二次要getAll时,检查查询是否作为缓存的键存在,如果是则从缓存中检索值,否则联系数据库,然后将结果插入缓存中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-21
      • 2011-11-12
      • 2015-09-18
      • 2011-04-21
      • 2019-05-29
      • 2016-04-28
      • 2020-05-16
      • 2017-09-01
      相关资源
      最近更新 更多