Как использовать алгоритм, написанный на другом языке в веб-сервисе (NodeJS)?

#c# #node.js #algorithm

Вопрос:

Я начинаю свою работу со школьного проекта полного стека, и стек NodeJS amp; React является обязательным требованием. Однако у меня есть алгоритм, написанный на C#, который мне нужен для этого проекта. Я создаю приложение, в которое люди загружают MIDI-файлы, а алгоритм анализирует MIDI и выдает инструкции по воспроизведению песни на гитаре (или другом струнном инструменте, например укулеле).

Проблема в том, что если у меня есть серверная часть NodeJS, я понятия не имею, как лучше всего использовать этот алгоритм. Мои варианты таковы:

  1. Перепишите в машинописном виде (не поклонник этой опции)
  2. Контейнеризация алгоритма
  3. Разместите алгоритм как собственную веб-службу с единой конечной точкой API
  4. Веб-сборка??
  5. Дополнения NodeJS C ? (Я бы предпочел переписать на C )

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

Я прошу совета, как действовать дальше. Я (скорее всего) буду использовать Heroku в качестве хостинга, и я понятия не имею, какой из этих вариантов, если таковой имеется, был бы лучшим выбором. Мы ценим любые советы.

Комментарии:

1. Вы уже перечислили все варианты. Все они применимы. Задавая вопрос о «лучшем», вы делаете вопрос основанным на мнении и поэтому оффтопичным на SO. Переписывать на C имеет смысл только из-за проблем с производительностью и безопасностью исходного кода. Придерживайтесь своей текущей кодовой базы, если вас не интересует ненужная дополнительная работа

Ответ №1:

Наиболее эффективным вариантом было бы переписать MIDI-процессор в качестве дополнения C NodeJS. Если он не слишком большой и уродливый, то это был бы правильный путь.

Самый простой вариант и лучшая альтернатива-это обернуть алгоритм C# в простой маленький сервер, с помощью которого вы можете запускать из NodeJS child_process.spawn() .

У меня есть изрядный опыт в подобных вещах, так что, если вы хотите пойти этим путем, я могу дать вам этот совет:

  • Дочерний процесс должен завершиться, когда закроется стандартный ввод. Это самый удобный, надежный, кроссплатформенный сигнал отключения, который у вас есть.
  • Stdin/stdout следует использовать для всех других коммуникаций типа жизненного цикла между родителем и ребенком. Если ваш дочерний процесс открывает сокет для прослушивания, он должен, например, отправить номер порта родителю в stdout. Опять же, это очень просто для родителей и детей.
  • Каждый экземпляр дочернего процесса должен быть способен обрабатывать несколько операций. Проще всего то, что дочерний элемент последовательно обрабатывает несколько запросов из stdin и записывает каждый результат в stdout. Если вам нужно, чтобы дочерний элемент обрабатывал несколько запросов одновременно, он может открыть серверный сокет, который обрабатывает один запрос на соединение.
  • Родительский процесс NodeJS должен управлять пулом запущенных дочерних процессов. Всегда поддерживайте один из них, чтобы запросам не приходилось ждать запуска дочерних процессов.