Дмитрий
чат, вопрос...
нужно по команде вызвать функцию около тысячи раз, функция обращается к стороннему сервису, и неизвестно как что по времени там будет. как лучше вызов этой функции и запись пришедших данных? Понимаю, что, скорее всего, нужно будет класть в бд (mongodb), а функции вызывать в цикле, верно ли это ?
Evgeny
А в чем вопрос? Циклом отправь пачку через request-promise и жди.
Evgeny
Или надо ограничить кол-ао паралельных запрсов?
Evgeny
Или в чем вопрос?
Aleksei
скорее всего вопрос в том как синхронно обработать 1000 асинхронных запросов. если так, то Promise.all(array).then(...)
Дмитрий
т.е. это считается нормальным, что будет цикл таких запросов?)
Дмитрий
Aleksei
я бы сделал так
let requests = new Array(1000); requests.fill(requestFunctionThatReturnыPromise()) Promise.all(requests).then(…)
но я бы подождал ответа от человека попрошаристей)
Aleksei
а тысяча - это число от балды?
DB
а результат каждого вызова важен?
если важен - promise.all вроде как не прокатит. ибо при первой же ошибке - получится непонятное состояние
Anton
А поподробней?
Vladimir
Добрый день. Ребят, как правильно передавать бинарные файлы в NodeJS? Есть какие нибудь устоявшиеся алгоритмы? Просто асинхронность в NodeJS добавляет многие сложности. К примеру мы не получаем ответ от клиента, получил он пакет или нет(хоть и TCP соединение), поэтому я не могу на стороне клиента нормальн собрать файл. Как быть?
Anton
Вроде нет с этим проблем?
Anton
При TCP соединении вообще "пакетов" нет - они склеиваются при получении. Ну а порядок гарантирует OS
Anton
А метод передачи зависит исключительно от канала - обычный tcp/ip сокет, тунель какого либо рода и так далее. Но все эти вариант (спасибо POSIX!) так или иначе приводятся к файлу, над которым можно поднять stream.
Vladimir
Клиент у меня на С++ написан
Vladimir
Там вообще ничего не гарантируется
Vladimir
Прихотят пакеты с обрывками
Anton
TCP?
Vladimir
Да
Vladimir
Юзаю либу net
Anton
TCP гарантирует доставку, но не гарантирует что у тебя в момент "чтения" данных там будет целый пакет. Полпакета бывает редко, а вот полтора(или 35) - без проблем
Anton
TCP не разделяет пакеты. Это только UDP так имеет
Vladimir
http://pastebin.com/hz1TfZJt
Примерно так отправляю
Anton
фактически на клиенте данные в начале аккумулируются до MTU(2kb) потом улетают.
Anton
Ага. JSON через TCP так не просунуть. Считай скобочки ручками, ищи по ним границы пакетов
Vladimir
ммм
Anton
websocket/protobuf этим не страдают
Vladimir
Да знаю, на socket.io все нормально запилил, теперь мне эту картинку нужна раздавать сервисам, а там только TCP/Unix sockets
Vladimir
websocket/protobuf этим не страдают
Vladimir
К тимлиду вопросы. Сказал что всякие экзотические языки вроде Rust/Go юзать не будем
Vladimir
Нам нужна асинхронность и хайлоад
Vladimir
Асинхронность в go?
Vladimir
А либку или еще что нить в виде пруфа
Anton
Задача передачи данных вроде от языка не зависит
Anton
Сделай по старинке - передавай терминатор между фреймами - - daemon.write(JSON.stringify(data)+MAGIC_SYMBOL). По нему и разбивай данные на пакеты.
Vladimir
"Сядет спать" занимая собой ОЗУ?
Vladimir
В том то и профит NodeJS
Vladimir
Нужно еще передавать позицию chunk в общем буфере
Vladimir
Сделай по старинке - передавай терминатор между фреймами - - daemon.write(JSON.stringify(data)+MAGIC_SYMBOL). По нему и разбивай данные на пакеты.
Vladimir
Чтоб потом правильно собрать все пакеты в единый файл
Vladimir
нет
Vladimir
Файл хранится в ОЗУ
Vladimir
Он там пролетом считай, пока приняли с клиента
Vladimir
в го нет асинхронности
Vladimir
лучше вместо сепаратора использовать префикс с длиной
Vladimir
оно - это кто? тред засыпает, да
Vladimir
но в го нет работы с тредами
Vladimir
ну да
Vladimir
просто синхронность - это про другое
Vladimir
асинхронность, то есть
Vladimir
это когда колбэки и стек трейса нет)
Vladimir
то есть, ничего хорошего
Anton
Асинхронность в данном случае это асинхронные функции io операционки.
Vladimir
Проблема осталась. Мастера NodeJS, хотя бы теоретически раскажите как должно оно работать
Anton
Берешь данные, кладешь в tmpFile. Создаешь сокет на сервер. Это тоже файл. Потом или pipe с одного на другой, либо вообще системный sendfile
Vladimir
sendfile нет в ноде
Vladimir
если ты хочешь передавать что-то по tcp, то нужен формат фрейма для начала
Vladimir
либо нужно передавать файл и закрывать сокет сразу
Vladimir
Закрывать сокет не могу, так как там соединение с сервисом
Vladimir
либо нужно передавать файл и закрывать сокет сразу
Vladimir
Можно по подробнее?
Vladimir
если ты хочешь передавать что-то по tcp, то нужен формат фрейма для начала
Vladimir
Там С++ клиент
Vladimir
ты передаешь свои "пакеты", но они могут быть порезаны как угодно. Нужно знать, где начало, где конец
Vladimir
Чистый TCP сокет
Vladimir
Просто взять и брать то мы получим данные не в корректном виде, а именно пакеты смешиваются
Anton
передавай между фреймами \n\r\r\n. Считай терминатором. Но лучше считать скобки.
Vladimir
не, терминатор это будет боль
Vladimir
потому что нужно его эскейпить тогда в пакете
Anton
H.323 это боль. А терминатор - норм :)
Vladimir
ага. id не нужен только особо
Vladimir
К такому варианту я приглядываюсь, только в начале мне нужно еще передавать index чанка во всем буффере, чтоб если чанки и мешались между собой, то по index можно было восстановить файл
Vladimir
терминатор это не способ лол. проще size of chunk + id + chunk
Vladimir
Так вот, а разделять чанки таким вод средством это нормально? То бишь применяется в практике?
Vladimir
передавай между фреймами \n\r\r\n. Считай терминатором. Но лучше считать скобки.
Vladimir
чанки не буду мешаться если ты не будешь их мешать
Vladimir
socket.write('a');
socket.write('b');
socket.write('c');
В ноде нет гарантии что а передастся быстрее чем б. Из-за этого приходится каждому chunk-у давать свой индекс, после так собирать файл
Vladimir
Или я не правильно мыслю?
Vladimir
Мм, тогда все немного проще