【问题标题】:Caching strategy to reduce load on web application server减少Web应用服务器负载的缓存策略
【发布时间】:2012-11-08 07:29:21
【问题描述】:

网络服务器应用服务器之间应用缓存层的好工具是什么。

基本要求:

  1. 应用程序服务器需要一种方法来从缓存中删除项目,并将项目放入缓存中并设置过期日期。
  2. 网络服务器需要一种以非常轻量级、快速的方式从缓存中提取项目的方法,而无需在应用服务器上分配线程。
  3. 它不一定需要是分布式缓存(可从多台机器访问),但不会有什么坏处。

我考虑过的策略:

  1. 静态文件缓存。请求进来,被散列,如果文件存在我们提供它,如果不存在,我们将请求路由到应用服务器。高 I/O 是并发问题还是文件锁定问题?由于内存中的内核级缓存,文件系统实际上非常快,这是否准确。
  2. 使用 mongodb 或 redis 等键值数据库。这会将完成的 HTML/JSON 片段存储在 db 中。如果需要,网络服务器将能够从数据库中读取数据并路由到应用服务器。应用服务器将配备从数据库中插入/删除。
  3. 像 memcached 或 Varnish 这样的内存缓存(不太了解 Varnish)。我对 memcached 的唯一担心是我想要在任何给定时间缓存 3 到 10 GB 的数据,这超出了我在内存中可以安全分配的数量。 memcached 是否有方法溢出到文件系统?

在尝试这种类型的缓存层时对一些技术和陷阱有什么想法吗?

【问题讨论】:

  • Mongodb/redis 可以轻松缓存一些数据,尤其是来自 SQL 的查询(这大致是 twitter 对 cassandra 所做的)。通常,我发现一个不错的选择是将 MongoDB/redis 等半永久缓存与 memcached 混合,在 memcached 中保留小热点以提高速度,但通过在 mongodb/redis 中存储更大的聚合信息来提高速度
  • 从 memcache 提供数据和从 MongoDB/Redis 提供数据之间没有显着差异,前提是后一个选项将它放在内存中(当数据足够热时,MongoDB 会这样做,而不是 100% 在 Redis 上,但我相信如此)。 memcache 的另一个小问题是它是分布式的,但不一定是复制的。如果 memcache 节点出现故障,则必须冷启动,这可能会给您带来问题。
  • 如果它是相关的,我不想缓存“数据”。在大多数情况下,缓存将是完整呈现的 HTML 或 HTML 片段。这并不是真正意义上的减少 SQL 查询的方法。这是一种减少整个应用程序堆栈负载的方法,但将缓存层移至网络服务器。
  • 您需要缓存 10GB 的 HTML?这……很多,你确定你不考虑缓存不需要的页面吗?
  • @sammaye 我认为 10gb 是我们计划永远不会达到但可以达到的最高端。如果我们估计每页 30k x 40 个站点 x 1250 个页面 = 10gb,这不太可能但可能。无论哪种方式,都超出了完全存储在内存中的合理范围,对吧?

标签: mongodb caching iis coldfusion memcached


【解决方案1】:

您还可以在内存数据网格中使用 GigaSpaces XAP 来缓存甚至托管您的 Web 应用程序。您可以只选择缓存选项,也可以将两者结合起来,并通过其他方式对您的环境进行单一管理。

与您建议的键值对方法不同,使用 GigaSpaces XAP 您将能够进行复杂的查询,例如 SQL、基于对象的 Temples 等等。在您的缓存方案中,您应该更具体地检查与本地缓存相关的功能。

Local Cache

Web Container

免责声明,我是 GigaSpaces 的开发人员。

艾坦

【讨论】:

    【解决方案2】:

    只是从使用 Coherence (http://coherence.oracle.com/) 的观点来回答这个问题:

    1.应用程序服务器需要一种方法来从缓存中删除项目并将项目放入缓存中并具有到期日期。

    // remove one item from cache
    cache.remove(key);
    
    // remove multiple items from cache
    cache.keySet().removeAll(keylist);
    

    2.网络服务器需要一种方法以非常轻量级、快速的方式从缓存中提取项目,而不需要在应用服务器上分配线程。

    // access one item from cache
    Object value = cache.get(key);
    
    // access multiple items from cache
    Map mapKV = cache.getAll(keylist);
    

    3.它不一定需要是分布式缓存(可从多台机器访问),但它不会受到伤害。

    • 弹性。只需添加节点。自动发现。自动负载平衡。没有数据丢失。没有中断。每次添加节点时,您都​​会获得更多的数据容量和更高的吞吐量。
    • 自动高可用性 (HA)。杀死一个进程,没有数据丢失。终止服务器,不会丢失数据。

    类似 memcached 或 Varnish 的内存缓存(对 Varnish 了解不多)。我对 memcached 的唯一担心是我想要在任何给定时间缓存 3 到 10 GB 的数据,这超出了我在内存中可以安全分配的数量。 memcached 有方法溢出到文件系统吗?

    • 同时使用 RAM 和闪存。透明地。每个 Coherence 节点轻松处理 10 甚至 100 GB 的数据(例如,每个物理服务器高达 1 TB 或更多)。

    为了全面披露,我在 Oracle 工作。这篇文章中表达的观点和观点是我自己的,并不一定反映我雇主的观点或观点。

    【讨论】:

      猜你喜欢
      • 2019-01-28
      • 2018-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多