Node легкий и масштабируемый, позволяет нам быстро развиваться, а у npm есть невероятные пакеты.

Команда основателей HarperDB создала первую и единственную базу данных, написанную на Node.js. Несколько месяцев назад наш генеральный директор Стивен Голдберг был приглашен выступить на встрече Women Who Code, чтобы поделиться историей этого (что некоторые называют безумным) начинанием. Стивен обсудил архитектурные уровни базы данных, продемонстрировал, как создать хорошо масштабируемый и распределенный продукт на Node.js, и продемонстрировал внутреннюю работу HarperDB. Вы можете посмотреть его выступление по ссылке выше и даже прочитать пост в 2017 году, но, поскольку мы все любим Node.js и это интересная тема, я подведу итоги здесь.

Основная (и самая простая) причина, по которой мы решили создать базу данных в Node, заключается в том, что мы очень хорошо ее знали. Мы получили неприятности из-за того, что не выбрали Go, но теперь люди признают, что Go и Node по сути идут лицом к лицу (в популярности и поддержке сообщества). Зак, один из наших соучредителей, признал, что, учитывая время, которое потребовалось бы на изучение нового языка, оно того не стоило.

Плюсы создания базы данных на Node.js

  • Мы уже знали Node.js
  • Легкий
  • Быстрое развитие
  • Высокая масштабируемость
  • Нпм

Команда HarperDB имеет опыт крупномасштабной разработки программного обеспечения. Первоначальной целью нашей базы данных было создание инструмента, который позволит разработчикам сосредоточиться на кодировании, не тратя время и усилия на обслуживание базы данных, и в то же время предоставить мощное решение. Мы хотели, чтобы люди чувствовали себя комфортно и уверенно в продукте, который они используют. Наша команда имеет большой опыт работы с языками, отличными от Node, но мы добились больших успехов в программировании на нем. (Хотя Стивен пришел с Java, сначала Стивен подумал, что Node ужасен, но примерно через 90 дней он полюбил его). Node легкий, позволяет нам быстро развиваться, а npm предлагает невероятные пакеты.

Минусы построения базы данных в Node.js

  • В то время не был принят в качестве «языка корпоративного уровня».
  • Не имеет прямого контроля над операционной системой / файловой системой
  • Не такой производительный, как C / C ++
  • Не было встроенной потоковой передачи (теперь она есть)

У нас действительно были проблемы ... будучи первой базой данных, написанной на Node.js, у нас не было возможности пойти по чьим-либо стопам. Вероятно, мы являемся одним из первых корпоративных продуктов, когда-либо созданных на Node, по крайней мере, наиболее ориентированным на данные. Люди сомневались в этом. Один парень сказал Стивену, что он скорее вырежет себе сердце ложкой, чем запрограммирует базу данных на Node.js. Теперь люди поняли, что это отличная идея, потому что у нас есть все эти невероятные функции в нашем продукте, которые нам не нужно было создавать и которые являются неотъемлемой частью того, что мы делаем. Мы действительно столкнулись с проблемами из-за отсутствия прямое управление ОС в файловой системе. Кроме того, C / C ++ быстрее, но может быть более сложным и не обязательно масштабируемым по горизонтали. Это действительно зависит от того, ищете ли вы вертикальные или горизонтальные вычисления.

Стек технологий

Вот как выглядит наш технический стек. Мы считаем, что наша Management Studio является частью стека HarperDB, и она построена на React с серверной частью Node. Зеленое поле обозначает любое приложение, построенное на основе HarperDB, например, наш узел Node-RED можно использовать для создания пользовательских рабочих процессов. Технология HarperDB полностью построена на Node.js, который включает в себя наши интерфейсы и ядро ​​HarperDB.

Наш продукт представляет собой REST API, который, по сути, представляет собой просто приложение Express, являющееся основным интерфейсом для взаимодействия с HarperDB. Наш парсер NoSQL - это индивидуальное решение, которое мы создали внутри компании. Мы используем AlaSQL для наших функций синтаксического анализа SQL, о которых вы можете подробнее прочитать здесь, мы расширяем их функциональность с помощью специального кода, кроме того, это потрясающий пакет npm для синтаксического анализа SQL. Мы предлагаем драйверы, такие как ODBC и JDBC, созданные нашим партнером. Наконец, мы используем SocketCluster для распределенных вычислений и кластеризации, которые наш технический директор представил в августе.

Основная технология HarperDB заключает в себе «секретный соус». Это то, что позволяет нам полностью индексироваться без дублирования данных и предлагать различные варианты интерфейса для единой модели данных. В ядре реализовано множество пакетов npm для расширения нашей функциональности.

Наконец, у нас есть различные варианты носителей. Мы объединяем LMDB по умолчанию, поскольку он обеспечивает значительный прирост производительности по сравнению с другими вариантами. Ядро HarperDB содержит расширяемый код, который позволяет нам добавлять дополнительные параметры носителей в будущем.

REST API

  • HarperDB - это набор микросервисов
  • Единая конечная точка
  • Все операции являются почтовыми
  • Без сохранения состояния / RESTful

(Пример кода находится на https://docs.harperdb.io/)

В бывшей компании наша команда справилась с головной болью, связанной с сотнями API-интерфейсов с разными конечными точками, что было просто безумием. Люди могут подумать, что это странно, что HarperDB - это всего лишь одна конечная точка, но если вы посмотрите в тело кода, для каждой операции, которую вы делаете, все, что вам когда-либо придется изменить, - это тело, эти первые несколько строк. Это очень просто, и при написании приложения на основе REST вы можете сделать его действительно простым. Это то, что вы можете взять у нас и использовать в любом приложении! Обычно вы отправляете в API одно сообщение, мы видим, какую операцию вы выполняете, и обрабатываем ее стандартным набором методов. За последние пару лет мы переписали много нашего приложения, но эта часть в основном осталась прежней.

Студия управления

  • Создан на основе REST API HarperDB
  • Написано на React Native
  • Позволяет управлять вашими экземплярами HarperDB через графический интерфейс

Management Studio HarperDB - это интерфейс React, построенный на основе наших микросервисов (так что мы едим свою собачью еду). В JavaScript замечательно то, насколько он легковесен, независимо от того, какой фреймворк вы используете (Node, React и т. д.), и вы можете легко объединить эти разные слои. React потрясающий, он изменился качество фронтенд-разработки и позволяет сделать наше приложение более доступным. Основываясь на этом, мы одновременно тестируем наш собственный API, что делает его действительно мощным. Джексон, наш вице-президент по продукту, выбрал React для студии, а Стивен написал нашу внутреннюю отчетность в Express.

AlaSQL

  • SQL-поиск построен на AlaSQL
  • Https://github.com/agershun/alasql
  • Позволяет использовать расширенный SQL
  • Наши разработчики вносят свой вклад в проект

Мы выбрали AlaSQL для внутренней функциональности HarperDB, в нем есть несколько замечательных вещей, которых у нас нет, и он позволяет нам подключаться к таким вещам, как Math.js и GeoJSON, так что это невероятный пакет. Одно удивительное преимущество использования Node для такого языка заключается в том, что по мере развития технологий большинство интересных вещей, которые вам нужны и которые вам понадобятся, находится на npm. Если бы нам пришлось создать собственный синтаксический анализатор SQL, мы бы вероятно, все еще строит HarperDB. Одному из наших конкурентов, FaunaDB, потребовалось около 4 лет, чтобы выйти на рынок, но мы запустили бета-версию нашего продукта через 6 месяцев, исходную версию - через 12 месяцев, и мы только что выпустили наш облачный продукт несколько месяцев назад (около 3 года спустя). Мы не говорим, что мы гении, но, разрабатывая на Node, мы должны встать на плечи таких людей, как разработчики AlaSQL, и это то, что мы считаем замечательным в сообществе npm.

Maths.js

  • HarperDB использует функции math.js внутри нашего SQL
  • Позволяет расширять математические возможности, используя возможности сообщества npm

Maths.js - еще один замечательный пакет для таких вещей, как средние значения, анализ данных и т. Д., Который мы встроили в наши возможности SQL. Это несложно в использовании и очень мощно в сочетании с AlaSQL.

Кластеризация / репликация

  • Построен на SocketCluster.io
  • Отказоустойчивой
  • Пиринговый
  • Репликация на уровне таблицы
  • Глобально общая схема
  • Распределенных вычислений

Еще одна очень интересная особенность создания чего-либо в Node.js заключается в том, что он не имеет состояния по своей природе, то есть не требует хранения данных в памяти, что имеет решающее значение для обслуживания клиентов в сеансах, что очень эффективно с точки зрения ресурсов. Большинство приложений корпоративного уровня имеют фоновые процессы и переменные с отслеживанием состояния, которые могут стать очень нестабильными. Узел не имеет состояния, разработан для Интернета, предназначен для горизонтального масштабирования и для одноранговой сети. Поразительным преимуществом использования инфраструктуры Node является то, что мы смогли подключиться к SocketCluster для обеспечения нашей кластеризации и репликации. HarperDB использует простую модель pub-sub, поэтому мы реплицируем данные, публикуя данные в разных чатах, на которые подписаны разные узлы и которые могут быть распределены по горизонтали. Узел может быть горизонтально масштабируемым и менее ресурсоемким, чем другие языки, а его природа без сохранения состояния делает его невероятно стабильным. Размещая Node на большом количестве компьютеров (с горизонтальным масштабированием), вы можете значительно повысить мощность фреймворка, снизить затраты, упростить разработку и стать частью замечательного сообщества.

LMDB и файловая система

  • Изначально построили нашу разнесенную модель данных в файловой системе
  • Проблема связана с созданием большого количества файлов, занимающих inodes и избыточное дисковое пространство, а также по другим причинам.
  • Восстановленная модель данных на LMDB
  • Значительный прирост производительности

Первоначально мы использовали файловую систему напрямую с указанной выше моделью данных HarperDB, это то, что делает продукт уникальным. По мере поступления данных мы сопоставляем их с нашей моделью данных, а не механизмом SQL или механизмом NoSQL. Мы разделили эти данные на отдельные атрибуты и сохранили их в структуре папок в файловой системе. Мы храним каждую вещь атомарно, и вы можете делать запросы через SQL и NoSQL. Мы действительно столкнулись с некоторыми проблемами при масштабировании, поэтому совсем недавно мы включили пакет под названием LMDB, хранилище ключевых значений, над которым мы работаем. Вдобавок мы смогли реализовать нашу точную модель данных, и это обеспечило невероятный прирост производительности. В недавнем тесте мы были примерно в 37 раз быстрее, чем MongoDB, во многом благодаря LMDB.

И снова, используя замечательное сообщество Node, мы можем сосредоточиться на том, в чем мы хороши.

Вы уже могли сказать, что мы ЛЮБИМ Node. Надеюсь, это было полезно, и что вы здесь чему-то научились или просто разжигали свою любовь к Node.js. Мы будем рады услышать ваши комментарии и всегда рады обсудить, если вы не согласны! :)