У меня есть приложение Node, которое обращается к статической, большой ( > 100M), сложной структуре данных в памяти, принимает запросы и затем обслуживает небольшие фрагменты этих данных клиенту через HTTP.
На большинство запросов можно ответить в десятые доли секунды. Ура для Node!
Но для некоторых запросов поиск этой структуры данных занимает несколько секунд. Это отстой, потому что все остальные должны ждать.
Чтобы эффективно обслуживать больше клиентов, я хотел бы использовать какой-то parallelism.
Но, поскольку эта структура данных настолько велика, я хотел бы поделиться ею между рабочими или потоками или тем, что у вас есть, поэтому я не сжигал сотни мегабайт. Это было бы совершенно безопасно, потому что структура данных не будет записана. Типичный "fork()" на любом другом языке сделал бы это.
Однако, насколько я могу судить, все стандартные способы сделать parallelism в Node явно делают это невозможным. Для безопасности они не хотят, чтобы вы что-то рассказывали.
Но есть ли способ?
Фон:
Неправильно размещать эту структуру данных в базе данных или использовать memcached или что-то в этом роде.
Библиотеки API WebWorker и т.д. позволяют передавать только короткие сериализованные сообщения внутри и вне рабочих.
Node Кластер использует вызов с именем "fork", но он не является вилкой существующего процесса, он порождает новый. Итак, еще раз, никакой общей памяти.
Вероятно, правильным ответом было бы использовать доступ к файловой системе в общую память, например, tmpfs или mmap. Есть несколько библиотек Node, которые делают mount() и mmap() доступными для чего-то подобного. К сожалению, тогда необходимо реализовать комплексный доступ к структуре данных поверх синхронных запросов и чтений. Мое приложение использует массивы массивов dicts и так далее. Было бы неплохо не переопределять все это.