170 похожих чатов

Такой вопрос. У меня мелкое приложение, конектится к бирже по

сокетам и постоянно получает большое количество данных, которые потом обрабатываются(куча операций над реально маленькими массивами). И видимо из-за блокирующих операций пропускная способность падает, мой сервер не успевает ответить бирже Понг и биржа меня отключает. Вообще печально что нода не справляется с таким объёмом инфы и вычислений, имхо, не так уж их много. Но что можно предпринять в этом случае?

Я вот думаю, раз одно приложение забивает себе ивент луп, то может на микросервисы разбить, пусть даже на одном и том же хосте? Первое приложение коннектится с биржей и передаёт данные другим двум, а те уже проводят вычисления, потом сливают данные в общак третьему. Таким образом появятся 2 вычислительные ноды без перегрузки ивентлупа. Но всё так же на одном сервере, процессорные мощности они же между собой поделят я так понимаю.
Но это как то грустно, получается standalone приложение уже склепать не получится чисто из-за того что нода не справляется. Плюс разбивать функционал на несколько приложений немного времязатратно будет, само-то приложение сейчас очень мелкое, строк 200 своего кода, как-то нелепо это ещё разбивать на другие приложения.
Можно ли сделать что-то ещё в моем случае для оптимизации? Вы бы что сделали с такой проблемой?

5 ответов

20 просмотров

Для начала можно не разбивать, но хотя бы "тяжёлые вычисления" отдавать воркеру, а не блочить эвентлуп. Больше асинхронгости

Код в студию. Кажется это на вашей стороне проблема.

Вы установили необязательные бинарные зависимости к модулю ws?

Opt-in for performance and spec compliance There are 2 optional modules that can be installed along side with the ws module. These modules are binary addons which improve certain operations. Prebuilt binaries are available for the most popular platforms so you don't necessarily need to have a C++ compiler installed on your machine. npm install --save-optional bufferutil: Allows to efficiently perform operations such as masking and unmasking the data payload of the WebSocket frames. npm install --save-optional utf-8-validate: Allows to efficiently check if a message contains valid UTF-8 as required by the spec.

1. Это делать максимально ассинхронно. 2. Если у тебя не нужно отдавать результат твоих вычислений, то сразу отвечай понг, а сами вычесления перенеси в воркер например. 3. Еще вариант поигратся с воркерами и месседж брокером (кафка, раббит). Лично я бы предпочтел 3 вариант. Так как в случае отказа или падений мы брокеры имеют возможность поаторно отправить данные на обработку, что, я подозреваю, в твоем случае критично. А еще при таком подходе будет проще распределять нагрузку

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта