Форум программистов, компьютерный форум, киберфорум
Наши страницы
Node.js
Войти
Регистрация
Восстановить пароль
 
golden103
0 / 0 / 3
Регистрация: 03.10.2014
Сообщений: 56
#1

Node и скорость запроса request - Node.js

09.07.2017, 20:07. Просмотров 347. Ответов 8

Всем доброго времени суток!
И снова я обращаюсь к гуру этого форума за помощью.
Суть в чем, делаю бота для торговой площадки, который через сокет сканирует новые, добавленные вещи и скупает их если название и цена совпадают с теми что я указываю, все вроде работает, но бот не успевает купить вещь, так как проходит слишком много времени( порядка 250 - 300мс ), не хитрым кодом я проверил время выполнения скрипта и понял что во всем виновата функция парсинга информации о вещи. Найти решение мне так и не удалось, пробовал найти альтернативу request, но не вышло. Вся надежда на вас
PS. Пробую открыть ссылку из функции в браузере, консоль показывает время выполнения 100 - 180мс.

Функция парсинга информации:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
function getItemsInfo( classid, instanceid, infoCallback ) {
    request( 'https://market.csgo.com/api/ItemInfo/' +classid+ '_' +instanceid+ '/ru/?key=' +apiKey, function( err, resp, body ) { 
        if( err && resp.statusCode !== 200 ) {
            loggerMess( 'Ошибка!: ' +resp.err, 'error' );
            return;
        }
        if( typeof( body ) === 'string' ) {
            body = JSON.parse( body );
        }
        infoCallback( body );
    });
}

http://www.cyberforum.ru/nodejs/thread2237973.html
0
Миниатюры
Node и скорость запроса request  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2017, 20:07
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Node и скорость запроса request (Node.js):

Прочитать тело запроса в Node.js
Добрый день. На сервере (Node.js) написан такой код let post = " "; ...

Не запускается пакет node js - пакетами? npm? сам node? gulp?
Всем доброго времени суток. Есть такая проблема, пытаюсь перебраться на Linux...

Request - передача данных
Здраствуйте, как из request передать body чтобы его можно было видеть вне...

Node.js
Всем привет,наткнулся на такой чат,вот решил его взять и доработать,вот сам код...

С js на Node.js
Доброго времени суток! Есть полноценно работающая вещь, написанная на...

8
whiteapps
408 / 373 / 220
Регистрация: 18.07.2014
Сообщений: 1,258
10.07.2017, 12:57 #2
golden103, с трудом верится что
Javascript
1
body = JSON.parse( body );
может занимать 250-300мс

покажите как вы это высчитали
и покажите, пожалуйста, что у вас в колбэке infoCallback
0
golden103
0 / 0 / 3
Регистрация: 03.10.2014
Сообщений: 56
10.07.2017, 13:25  [ТС] #3
Время узнал:
Javascript
1
2
3
var time = new Date().getTime(); // в начале
var resTime = new Date().getTime() - time;//После выполнения getItemsInfo
loggerMess( resTime, 'info' );
infoCallback просто передает полученный json в функцию getItemsInfo( вроде правильно выразился )

Функция где должна происходить "магия":
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
function newItems( data ) {
    var time = new Date().getTime();
    if( typeof( data ) === 'string' ) {
        data = JSON.parse( data );  
        var objData = JSON.parse( data.data );
    }
    var app = objData.app;
    if( app == 'go' ) {
        var market_hash_name = objData.i_market_hash_name;
        var classid = objData.i_classid;
        var instanceid = objData.i_instanceid;
        var uiprice = objData.ui_price; 
        for( items in OrderItems ) {
            //console.log( items );
            if( market_hash_name === OrderItems[items].name && uiprice <= OrderItems[items].price ) {
                var OItemsName = OrderItems[items].name;
                var OItemsPrice = OrderItems[items].price;
                var OItemsAutobuy = OrderItems[items].autobuy;
                getItemsInfo( classid, instanceid, function( info ) {
                    //var info = JSON.parse( body );
                    //console.log( info.rarity );
                    if( info.stickers != null ) {
                        var stickerNum = info.stickers.split( '|' );
                        if( stickerNum.length >= 1 && stickerNum.length <= 3 ) {
                            if( OItemsAutobuy === 'yes' ) {
                                buyItems( classid, instanceid, uiprice, info.hash );
                            }
                            console.log( 'M: ' +market_hash_name+ ' (' +uiprice+ ') - O: ' +OItemsName+ ' S: ' +stickerNum.length+ ' A: ' +OItemsAutobuy );
                            console.log( 'https://market.csgo.com/item/' +classid+ '-' +instanceid );
                        } else if( stickerNum.length == 4 ) {
                            buyItems( classid, instanceid, uiprice, info.hash );
                            /*if( openBrowser ) {
                                opener( 'https://market.csgo.com/item/' +classid+ '-' +instanceid, { app: 'firefox' } );
                            }*/
                            console.log( 'stickerNum.length == 4' );
                            console.log( 'M: ' +market_hash_name+ ' (' +uiprice+ ' ) - O: ' +OItemsName+ ' S: ' +stickerNum.length+ ' A: ' +OItemsAutobuy );
                        }
                        var resTime = new Date().getTime() - time;
                        loggerMess( resTime, 'info' );
                        //if( soundAlert ) { console.log( '\x07' ); }                       
                    }
                    
                } );
            }
            if( purchased ) {
                break;  
            }
        }
    }
}
В newItems( data ) идет информация с сокета через onmessage, типа string
0
golden103
0 / 0 / 3
Регистрация: 03.10.2014
Сообщений: 56
12.07.2017, 00:11  [ТС] #4
Проблема так и не решена, все еще требуется помощь
0
muxahuk1214
Coding is art
201 / 199 / 66
Регистрация: 04.09.2013
Сообщений: 604
12.07.2017, 20:05 #5
тут вам в теории может помочь только увеличение скорости интернета на сервере, что бы быстрее отправлял и получал запрос через request библиотеку.
Но, есть так же такая вещь как горизонтальное расширение вашего приложения.
Грубо говоря создаёте не 1-н "сервер" а 10, так нагрузка будет меньше и может быстрее будет отдавать данные.
0
whiteapps
408 / 373 / 220
Регистрация: 18.07.2014
Сообщений: 1,258
13.07.2017, 12:01 #6
golden103, если это возможно, скиньте архивом все что есть, включая package.json, но без node_modules

Не по теме:


muxahuk1214, человек спрашивает как оптимизировать программно. мне кажется, ответ купи 10 серверов, не очень тут подходит

0
golden103
0 / 0 / 3
Регистрация: 03.10.2014
Сообщений: 56
13.07.2017, 13:14  [ТС] #7
https://yadi.sk/d/S9dQFhUD3L2S4H

Добавлено через 1 минуту
Проблема в том что доступа к серверу нет, это торговая площадка и есть только ее апи.
0
muxahuk1214
Coding is art
201 / 199 / 66
Регистрация: 04.09.2013
Сообщений: 604
14.07.2017, 01:27 #8
Всё упираеться в скорость соединения интернета на вашем сервере..
Тем более вы делаете n-е кол-во запросов одновременно, что может снижать скорость.

и учитывая что вы далее делаете buyItems который тоже делает запрос
+ использует fs.writeFileSync ( что не есть хорошо, лучше fs.writeFile )
вот тут у вас получается скорость где-то равна
n + nx + 2ny ( где x - скорость работы файловой системы, y - пропускная способность интернета, n - кол-во элементов в массиве )
0
golden103
0 / 0 / 3
Регистрация: 03.10.2014
Сообщений: 56
14.07.2017, 18:56  [ТС] #9
Спустя 2 без сонные ночи и несколько литров выпитого кофе, я узнал что информация о стикерах так же идет через сокет, а это значит что не нужно вызывать itemsinfo в основной функции, но минус с том что мне нужно для покупки узнать hash этой вещи, а это опять же запрос к itemsinfo, думал как то объединить запрос к получению hash и покупке, но не могу сообразить как это сделать...

На другом форуме один человек посоветовал:
Убери запрос на ItemInfo, тебе от куда нужно только hash, сделай разовые запросы для каждого предмета из твоего списка предметов и занеси в массив под каждый предмет.
Hash не меняется со временем, он статичен и уникален для каждого предмета.
Так что не вижу смысла каждый раз просить его.
Но как это будет выглядеть и как будет проходить сверка, я не понимаю...
0
14.07.2017, 18:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2017, 18:56
Привет! Вот еще темы с решениями:

Multiparty постоянно вываливается с ошибкой Request aborted
Всем доброго времени суток))) Помогите разобраться, не загрузить файл на...

Загрузка страницы через request происходит некорректно
Добрый день. Хотел написать парсер. Долго мучался почему cheerio работает не...

Поддомены на Node.js
Здравствуйте, форумчане начал понимаете ли писать себе сайтик на ноде, просто...

Массивы в node js
Не понимаю что может быть не так, казалось бы один и тот же JS но массивы ведут...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru