Я работаю над серверным приложением, которое обрабатывает тонны данных, поступающих через веб-сокет, и у меня возникают проблемы с ним.
Используемая мной машина:
- Intel Xeon 3,6 ГГц, 22 ядра, 44 потока, кэш-память 55 МБ
- 256 ГБ Ram
- 1 Гбит, сеть
Теперь, когда приложение запускается, оно подключается к данным провайдер использует WebSocket
const connect = () => {
ws = new WebSocket(config.connectAddress, {
perMessageDeflate: false
});
ws.on("open", open);
ws.on("message", message);
ws.on("error", error);
ws.on("close", close);
};
const message = data => { // executed every 1 - 20 ms
let parseStream = JSON.parse(data);
let { channel, ...props } = parseStream;
if (
channel === "new" &&
manager.validateRecord(props) === true
) {
manager.addRecord(props);
}
if (channel === "updated") {
manager.updateRecord(props);
}
if (channel === "deleted") {
manager.removeRecord(props);
}
};
const updateRecord = data => { // manager.updateRecord
source.update(data);
broadcast.run('update', data);
};
const run = (type, data) => { // broadcast.run
io.emit(type, data);
};
В этот момент я получаю данные с событием message
. Данные поступают как объект с около 30 ключами и значениями. Частота сообщений составляет около 1-20 мс. Я обрабатываю эти данные, чтобы проверить наличие обновлений, и храню их в памяти, и если что-то изменилось, я передаю их подключенным клиентам через socket.io
.
. После момента запуска приложения оно перестает отвечать на запросы. Я отслеживал ресурсы сервера, и они почти полностью бесплатны. 1% ЦП и 1 ГБ оперативной памяти в использовании. Таким образом, кажется, что процесс забивается частотой сообщений и операций, выполняемых с каждым сообщением.
Возможно ли использовать кластерный или другой метод, поэтому серверный компьютер фактически использует все свои доступные ресурсы для жизненного цикла приложения (прослушивание данных, добавление / обновление / обработка данных, широковещательные данные)?