Вам не нужно разбивать приложение.
Вы можете определить свой модуль следующим образом:
@Module({
providers: [
MyGateway,
MyService,
],
})
export class MyModule {}
, где gateway
отвечает за канал веб-сокетов
import { SubscribeMessage, WebSocketGateway } from '@nestjs/websockets'
import { Socket } from 'socket.io'
...
@WebSocketGateway()
export class MyGateway {
constructor(private readonly myService: MyService) {}
@SubscribeMessage('MY_MESSAGE')
public async sendMessage(socket: Socket, data: IData): Promise<IData> {
socket.emit(...)
}
}
, а service
отвечает за канал TCP
import { Client, ClientProxy, Transport } from '@nestjs/microservices'
...
@Injectable()
export class MyService {
@Client({
options: { host: 'MY_HOST', port: MY_PORT },
transport: Transport.TCP,
})
private client: ClientProxy
public async myFunction(): Promise<IData> {
return this.client
.send<IData>({ cmd: 'MY_MESSAGE' })
.toPromise()
.catch(error => {
throw new HttpException(error, error.status)
})
}
}
У меня есть серверное приложение, которое тяжело в использовании потока, оно использует настраиваемый пул потоков, который настраивается клиентом, и по крайней мере в одном сайте оно имеет 1000 + потоки, и при запуске оно использует только 50 МБ. Причина состоит в том, что Windows резервирует 1 МБ для стека (он отображает свое адресное пространство), но он не обязательно выделяется в физической памяти, только меньшей части его. Если стек выращивает больше, чем которые сгенерировано отсутствие страницы, и больше физической памяти выделяется. Я не знаю, каково начальное выделение, но я предположил бы, что это равно гранулярности страницы системы (обычно 64 КБ). Конечно, поток также использовал бы немного больше памяти для других вещей при создании (TLS, TSS, и т.д.), но мое предположение для общего количества составит приблизительно 200 КБ. И примите во внимание, что любая память, которая не часто используется, была бы разгружена диспетчером виртуальной памяти.
Добавление к комментариям Fabios:
Память является Вашим вторым беспокойством, не Вашим первым. Цель пула потоков состоит в том, чтобы обычно ограничивать контекстное переключение наверху между потоками, которые хотят работать одновременно, идеально к количеству доступных ядер процессора.
Контекстное переключение является очень дорогим, часто заключаемое в кавычки в нескольких тысячах к 10 000 + циклы ЦП.
Немного теста на WinXP (32 бита) начинает работу приблизительно в 15k частные байты на поток (999 созданных потоков). Это - фиксировавший размер стека начальной буквы плюс любые другие данные, управляемые ОС.
Если Вы используете Vista, или Win2k8 просто используют собственный пул потоков Win32 API. Позвольте ему выяснить калибровку. Я также считал бы типы разделения рабочих нагрузок, например, ЦП интенсивными по сравнению с Диском ввод-вывод в различные пулы.
Пул потоков MSDN документы API
http://msdn.microsoft.com/en-us/library/ms686766 (По сравнению с 85) .aspx
Я думаю, что Вам было бы нелегко обнаруживать любое влияние того, чтобы заставлять это своего рода измениться на рабочий код - 20 потоков вниз к 5. И затем прибавьте добавленную сложность (и наверху) управления пулом потоков. Возможно, достойный рассмотрения во встроенной системе, но Win32?
И можно установить размер стека на то, что Вы хотите.
Это зависит высоко от системы:
Но обычно, каждый обрабатывает, независимо. Обычно системный планировщик удостоверяется, что каждый обрабатывает, получает равный доступ к доступному процессору. Таким образом многопоточное время приложения мультиплексируется между доступными потоками.
Память, выделенная потоку, будет влиять на память, доступную процессам, но не памяти, доступной другим процессам. Хорошая ОС разобьет на страницы неиспользованное стековое пространство, таким образом, это не будет в физической памяти. Хотя, если Ваши потоки выделяют достаточно памяти, в то время как живой Вы могли вызвать перегрузку, поскольку память каждого процессора разбита на страницы к/от вторичному устройству.
Я сомневаюсь, что поток сна оказывает любое (очень небольшое) влияние на систему.
Я предполагаю, что это может измеряться довольно легко.
Обратите внимание, что некоторые потоки должны быть указаны различные значения, чем по умолчанию.
Можно попытаться найти среднее использование памяти путем создания различного количества потоков (шаг 2).
Память, выделенная ОС при создании потока, состоит из потоков локальные данные: TCB TLS...
Из Википедии: "Потоки не владеют ресурсами за исключением стека, копии регистров включая счетчик команд и локальной памяти потока (если таковые имеются)".