NodeJS: Как автоматически генерировать все предыдущие кэшированные запросы по истечении срока действия - PullRequest
0 голосов
/ 14 января 2020

Я создаю API-интерфейс блога, используя Nodejs, и мои данные поступают из службы очистки, которая собирает данные с множества новостных веб-сайтов, поэтому базы данных нет.

Службе очистки требуется около 30 секунд, чтобы вернуть ответ для страницы 1 всех сайтов, с которыми я выполняю очистку. (Представьте себе, как будет выглядеть разбиение на страницы в моем приложении :()

Если вы не знаете, что такое scaping, вы просто думаете о нем как о нескольких API и я получаю данные от каждого из них, затем объединяю все в один массив результатов.

Так что из-за длительного времени ответа я начинаю использовать пакет node-cache для кэширования, и он сохраняет мой запрос время от 30 секунд до 6 миллисекунд (Wooow, верно?)

Проблема в том, что когда мой кэш истекает через x раз, мне нужно ждать, пока случайный пользователь снова не достигнет моей конечной точки, чтобы восстановить кеш снова с новыми данными, и он будет ждать целых 30 секунд, пока не получит ответ.

Мне нужно избегать этого столько, сколько я мог, поэтому любые идеи? Я искал? много и не получая никаких полезных результатов !!, все статьи рассказывают о том, как кэшировать, а не техники.

# обновление

Я нашел своего рода решение для пакета, который я использую для кеширования предусмотрены в их API Docum Ввод события с именем cache.on('expired', cb) означает, что я могу прослушать любой срок действия кэша.

То, что я сделал, - это бесконечное l oop, когда я обращаюсь к себе каждый раз, когда срок действия кэша истекает

Код

class MyScraperService {
   constructor() {

        this.cache = new NodeCache({ stdTTL: 30, checkperiod: 5, useClones: false });
        this.cache.on('expired', (key: string, data: Article[]) => {
            console.log('key: ', key);
            // send a request to get all my articless again and again once the cahce get expires 
            this.articles( key.charAt( key.length -1 ) ); // page number 
        });
    }


    async articles(page: string): Promise<Article[]> {
        // nodeCache()


        if (this.cache.get(`articles_page_${page}`)) {

            let all: Article[] = this.cache.get(`articles_page_${page}`); //.sort(() => Math.random() - 0.5); 
            return all.sort(() => Math.random() - 0.5);
        }

        let artilces: any = await Promise.all([
            this.xxScraper(page),
            this.xxScraper(page),
            this.xxScraper(page),
            this.xxScraper(page),
            this.xxScraper(page),
            this.xxScraper(page),
            this.xxScraper(page),
            this.xxScraper(page),
            this.xxScraper(page),
            this.xxScraper(page)
        ]);

        let all: Article[] = [];

        for (let i = 0; i < artilces.length; i++) {
            const article = artilces[i];

            all.push(...article);
        }


        this.cache.set(`articles_page_${page}`, all);

        all = all.sort(() => Math.random() - 0.5);

        return all;
    }

}

1 Ответ

0 голосов
/ 14 января 2020

Вы можете запланировать cronjob для вызова вашего скребка каждые [cachingTime-scrapExecutionTime] (в данном случае, 30) секунд с cron .

Я бы также предложил вам увеличить кеширование запроса выше 1м, что разделит количество запросов на другие сайты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...