You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从管理应用向所有Node.js Dyno发送请求清除内存缓存

解决多Dyno缓存批量清除的方案

针对你遇到的负载均衡导致请求只能到达单个Dyno的问题,下面是几个实用的解决思路:

1. 基于Redis Pub/Sub的消息广播

这是最直接的多实例同步方案,通过消息队列让所有Dyno同时收到清缓存指令:

  • 每个App Dyno启动时,连接到Redis服务,订阅一个固定频道(比如cache:clear)
  • 当Admin应用需要清缓存时,向Redis的该频道发布一条清缓存指令
  • 所有订阅了该频道的App Dyno收到消息后,立即执行本地缓存清除逻辑

示例代码片段:

// App Dyno 订阅逻辑
const redis = require('redis');
const subscriber = redis.createClient({/* Redis配置 */});

subscriber.subscribe('cache:clear');
subscriber.on('message', (channel, message) => {
  if (channel === 'cache:clear') {
    // 执行清缓存操作
    clearLocalCache();
    console.log('缓存已清除');
  }
});

// Admin 应用发布逻辑
const publisher = redis.createClient({/* Redis配置 */});
publisher.publish('cache:clear', 'clear-command');

注意:确保所有Dyno都能访问到同一个Redis实例,并且配置好认证信息避免未授权访问。

2. 直接调用Dyno内部地址(针对Heroku等平台)

如果你的Dyno运行在Heroku这类平台上,可以通过平台API获取所有Dyno的内部地址,逐个发送请求:

  • 给Admin应用配置平台API的访问权限(比如Heroku的OAuth令牌)
  • 调用平台API获取目标App的所有运行中Dyno列表,提取每个Dyno的内部域名(格式通常为<dyno-id>.<app-name>.herokuapp.com)
  • 遍历所有Dyno的内部地址,向每个地址发送清缓存的HTTP请求

示例代码片段:

// Admin 应用获取Dyno列表并发送请求
const fetch = require('node-fetch');

async function clearAllDynosCache() {
  // 调用Heroku API获取Dyno列表
  const dynosRes = await fetch('https://api.heroku.com/apps/your-app-name/dynos', {
    headers: {
      'Authorization': 'Bearer YOUR_HEROKU_OAUTH_TOKEN',
      'Accept': 'application/vnd.heroku+json; version=3'
    }
  });
  const dynos = await dynosRes.json();
  
  // 逐个发送清缓存请求
  for (const dyno of dynos) {
    await fetch(`https://${dyno.name}.your-app-name.herokuapp.com/api/clear-cache`, {
      method: 'POST',
      headers: {/* 必要的认证头,比如API密钥 */}
    });
  }
}

注意:内部地址通常只能在平台内网访问,确保Admin应用和目标App在同一个平台环境下,或者配置了合适的网络访问权限。

3. 基于共享存储的缓存失效标记

通过共享存储维护一个缓存失效标记,让每个Dyno主动检查并清除缓存:

  • 在Redis等共享存储中设置一个cache_invalidation_timestamp键,存储最后一次触发清缓存的时间戳
  • 每个App Dyno在读取本地缓存前,先检查共享存储中的时间戳,如果该时间戳晚于本地记录的最后失效时间,则清除本地缓存并更新本地时间戳
  • Admin应用只需要将cache_invalidation_timestamp更新为当前时间即可

示例代码片段:

// App Dyno 缓存读取逻辑
async function getCachedData(key) {
  const localInvalidationTime = getLocalInvalidationTime(); // 本地存储的失效时间
  const remoteInvalidationTime = await redis.get('cache_invalidation_timestamp');
  
  if (remoteInvalidationTime > localInvalidationTime) {
    clearLocalCache();
    setLocalInvalidationTime(remoteInvalidationTime);
  }
  
  return getFromLocalCache(key);
}

// Admin 应用更新失效标记
async function triggerCacheClear() {
  await redis.set('cache_invalidation_timestamp', Date.now().toString());
}

这种方案不需要主动推送消息,靠Dyno主动检查,适合对实时性要求不是极高的场景。


内容的提问来源于stack exchange,提问作者Stan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 15:45:36