#c# #node.js #algorithm
Вопрос:
Я начинаю свою работу со школьного проекта полного стека, и стек NodeJS amp; React является обязательным требованием. Однако у меня есть алгоритм, написанный на C#, который мне нужен для этого проекта. Я создаю приложение, в которое люди загружают MIDI-файлы, а алгоритм анализирует MIDI и выдает инструкции по воспроизведению песни на гитаре (или другом струнном инструменте, например укулеле).
Проблема в том, что если у меня есть серверная часть NodeJS, я понятия не имею, как лучше всего использовать этот алгоритм. Мои варианты таковы:
- Перепишите в машинописном виде (не поклонник этой опции)
- Контейнеризация алгоритма
- Разместите алгоритм как собственную веб-службу с единой конечной точкой API
- Веб-сборка??
- Дополнения NodeJS C ? (Я бы предпочел переписать на C )
Причина, по которой я не хочу использовать машинописный текст для алгоритма, заключается в том, что, на мой взгляд, он не очень подходит. Алгоритм почти полностью состоит из битовых операций и структур минимального размера с битовыми масками для обеспечения эффективного копирования данных (по сути, это алгоритм поиска). Я чувствую, что машинопись ограничила бы мою способность улучшать и расширять ее, поскольку эти вещи, возможно, проще реализовать на языках более низкого уровня.
Я прошу совета, как действовать дальше. Я (скорее всего) буду использовать Heroku в качестве хостинга, и я понятия не имею, какой из этих вариантов, если таковой имеется, был бы лучшим выбором. Мы ценим любые советы.
Комментарии:
1. Вы уже перечислили все варианты. Все они применимы. Задавая вопрос о «лучшем», вы делаете вопрос основанным на мнении и поэтому оффтопичным на SO. Переписывать на C имеет смысл только из-за проблем с производительностью и безопасностью исходного кода. Придерживайтесь своей текущей кодовой базы, если вас не интересует ненужная дополнительная работа
Ответ №1:
Наиболее эффективным вариантом было бы переписать MIDI-процессор в качестве дополнения C NodeJS. Если он не слишком большой и уродливый, то это был бы правильный путь.
Самый простой вариант и лучшая альтернатива-это обернуть алгоритм C# в простой маленький сервер, с помощью которого вы можете запускать из NodeJS child_process.spawn()
.
У меня есть изрядный опыт в подобных вещах, так что, если вы хотите пойти этим путем, я могу дать вам этот совет:
- Дочерний процесс должен завершиться, когда закроется стандартный ввод. Это самый удобный, надежный, кроссплатформенный сигнал отключения, который у вас есть.
- Stdin/stdout следует использовать для всех других коммуникаций типа жизненного цикла между родителем и ребенком. Если ваш дочерний процесс открывает сокет для прослушивания, он должен, например, отправить номер порта родителю в stdout. Опять же, это очень просто для родителей и детей.
- Каждый экземпляр дочернего процесса должен быть способен обрабатывать несколько операций. Проще всего то, что дочерний элемент последовательно обрабатывает несколько запросов из stdin и записывает каждый результат в stdout. Если вам нужно, чтобы дочерний элемент обрабатывал несколько запросов одновременно, он может открыть серверный сокет, который обрабатывает один запрос на соединение.
- Родительский процесс NodeJS должен управлять пулом запущенных дочерних процессов. Всегда поддерживайте один из них, чтобы запросам не приходилось ждать запуска дочерних процессов.