0

问题:

我目前正在使用socket.io(服务器端)来处理来自客户端的异步请求。这些请求被传递到上游服务 - 这是相当昂贵/缓慢且速率有限的。我想解复用/缓存对上游服务的调用。例如10 次调用getUserProfile(123)=> 1 次调用上游服务(在一段时间内)

  1. 我尝试使用缓存(lru-cache),但是在从上游服务器获得响应(对于第一次调用 - 所以这不起作用)之前,从客户端收到了一些调用(在毫秒内)。

  2. debounce -promise库听起来像我需要的,但是它没有考虑不同的参数(例如 getUserProfile(123)and getUserProfile(456)=> 期望profile_123and profile_456,但是返回 profile_456(两次)。

如果我举个例子可能最好...

服务器.js

// on request from client...
socket.on('getUserProfileRequest', userId => {
    getUserProfile(userId).then(profile => socket.emit('getUserProfileResponse', profile))
})

...

function getUserProfile(userId) {
    // ... call upstream server, do async work, return a Promise...
}
4

1 回答 1

0

我最终将and 与lru-cache结合使用,以达到预期的效果 - 我还在函数中添加了一个参数,以方便实现这一点。maxAgePromisesinitialiseFnget(key, initialiseFn)

公关: https ://github.com/isaacs/node-lru-cache/pull/132

// setup an LRU cache (with eviction policy)...
const PROFILE_CACHE = LRU({ max: 50, maxAge: 1000 * 60 })

// receives "lots" of async requests from a client...
socket.on('getUserProfileRequest', userId => {
  PROFILE_CACHE.get(userId, () => getUserProfile(userId))
    .then(profile => socket.emit('getUserProfileResponse', profile))
})

// calls upstream server, does async/expensive/long running work, returns a Promise...
function getUserProfile(userId) { /* ... */ }
于 2018-09-13T06:15:23.803 回答