Javascript> Демультиплексировать / кэшировать вызов функции Promise - PullRequest
0 голосов
/ 12 сентября 2018

Проблема:

В настоящее время я использую socket.io (на стороне сервера) для обработки асинхронных запросов от клиента.Эти запросы передаются в вышестоящую службу, которая является достаточно дорогой / медленной и с ограниченной скоростью.Я хотел бы демультиплексировать / кэшировать вызовы к восходящему сервису. например, 10x вызовов для getUserProfile(123) => 1x вызовов восходящей службы (в течение определенного периода времени)

  1. Я пытался использовать кэш ( lru-cache ), однако от клиента поступает несколько вызовов (в течение миллисекунд) до получения ответа от вышестоящего сервера (для первого вызова - так что это не работает).

  2. Библиотека debounce-обещания звучит как то, что мне нужно, однако она не учитывает различные параметры ( например getUserProfile(123) и getUserProfile(456) =>ожидая profile_123 и profile_456, однако возвращает profile_456 (дважды).

Вероятно, лучше, если я приведу пример ...

server.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...
}

1 Ответ

0 голосов
/ 13 сентября 2018

В итоге я использовал lru-cache в сочетании с maxAge и Promises, чтобы достичь желаемого результата - я также добавил параметр initialiseFn в функцию get(key, initialiseFn), чтобы облегчить это.

PR: 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) { /* ... */ }
...