- Оригинальный адрес:Good practices for high-performance and scalable Node.js applications [Part 2/3]
- Оригинальный автор:virgafox
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:jianboy
- Корректор:calpa
Глава 2. Как сделать ваше приложение Node.js безопасным для масштабирования
существуетПредыдущая статьяВ разделе мы узнали, как горизонтально масштабировать приложение Node.js, не беспокоясь о коде. В этой главе мы обсудим вещи, о которых необходимо позаботиться при расширении, чтобы предотвратить возникновение ошибок при расширении процесса.
Отключить экземпляр приложения от БД
Эта глава в первую очередь посвящена не коду, а вашемуинфраструктура.
Если вы хотите, чтобы ваше приложение масштабировалось на несколько хостов, вы должны развернуть базу данных на нескольких отдельных хостах, чтобы вы могли свободно реплицировать хосты по мере необходимости.
Развертывание приложения и базы данных на одном компьютере может быть дешевым и в целях разработки, но определенно не рекомендуется для производственных сред, где приложение и база данных должны иметь возможность независимого масштабирования. То же самое относится к базам данных в памяти, таким как Redis.
нет статуса
Если вы создаете несколько экземпляров вашего приложения,Каждый процесс имеет собственное пространство памяти.. Это означает, что даже если вы работаете на одной машине, когда вы сохраняете какое-то значение в глобальной переменной или, чаще, сеанс в памяти, если сервер балансировки нагрузки перенаправляет вас на другой во время следующего процесса запроса, вы не будете удалось найти там.
Это относится как к данным сеанса, так и к внутренним значениям, как и к любой конфигурации приложения.
Параметры или конфигурации, которые можно изменить во время выполнения, можно сохранить во внешней базе данных (на диске или в памяти), чтобы все процессы могли получить к ним доступ.
Аутентификация без сохранения состояния с помощью JWT
Аутентификация — это одна из первых вещей, которую следует учитывать при разработке приложений без сохранения состояния. Если сеансы хранятся в памяти, они будут воздействовать на этот единственный процесс.
Чтобы это работало, вы должны настроить сервер балансировки сетевой нагрузки так, чтобы он всегда перенаправлял одного и того же пользователя на один и тот же компьютер, а локальные пользователи, перенаправляемые на одного и того же пользователя, всегда перенаправляли на один и тот же процесс (закрепленный сеанс).
Простое решение этой проблемы — установить стратегию хранения сеанса как постоянную, например, хранить их в БД, а не в ОЗУ. Однако, если ваше приложение проверяет данные сеанса для каждого запроса, для каждого вызова API будут выполняться дисковые операции ввода-вывода, что определенно не очень хорошо с точки зрения производительности.
Лучшее и более быстрое решение (если ваша среда аутентификации поддерживает его) — хранить сеанс в базе данных в памяти, такой как Redis. Экземпляр Redis обычно находится за пределами экземпляра приложения, например экземпляра БД, но он быстрее работает в памяти. В любом случае, хранение сеансов в оперативной памяти потребует больше памяти по мере увеличения количества одновременных сеансов.
Если вам нужен более эффективный метод аутентификации без сохранения состояния, вы можете проверитьВеб-токен JSON.
Идея JWT проста: когда пользователь входит в систему, сервер генерирует токен, который по сути представляет собой кодировку base64 объекта JSON, содержащего полезную нагрузку, плюс хэш, полученный из подписи, которая имеет ключ, принадлежащий серверу. Полезная нагрузка может содержать данные, используемые для аутентификации и авторизации пользователя, такие как идентификатор пользователя и связанная с ним роль ACL. Токен отправляется обратно клиенту и используется им для аутентификации каждого запроса API.
Когда сервер обрабатывает входящий запрос, он берет полезную нагрузку токена и повторно подписывает его своим ключом. Если две подписи совпадают, полезная нагрузка может считаться действительной и неизменной, а также может быть идентифицирован пользователь.
Важно помнитьJWT не обеспечивает никакой формы шифрования. Полезная нагрузка кодируется только в base64 и отправляется в виде открытого текста, поэтому, если вам нужно скрыть содержимое, вы должны использовать SSL.
jwt.ioПроцесс аутентификации был возобновлен в следующем режиме:
Во время аутентификации серверу не требуется доступ к хранящимся где-то данным сеанса, поэтому каждый запрос может обрабатываться другим процессом или машиной очень эффективным способом. Данные не хранятся в ОЗУ, и операции ввода-вывода для сохранения не требуются, поэтому этот подход полезен при расширении.
Магазин на S3
При использовании нескольких серверов невозможно хранить созданные пользователем данные непосредственно в файловой системе, поскольку доступ к этим файлам возможен только для процессов, локальных для этого сервера. РешениеХранить все во внешнем сервисе, возможно, на выделенном сервисе, таком как Amazon S3, и сохраните в базе данных только абсолютный URL-адрес ресурса.
Тогда каждый процесс/машина сможет получить доступ к этому ресурсу таким же образом.
Использовать официальный AWS SDK для Node.js очень просто, и вы можете легко интегрировать сервис в свое приложение. S3 очень дешев и оптимизирован для этой цели, и это хороший выбор, если ваше приложение не является многопроцессорным.
Правильно настроить WebSockets
Если ваше приложение использует WebSockets для взаимодействия в реальном времени между клиентами или между клиентом и сервером, вам необходимоСвязать серверный экземпляр, чтобы широковещательные рассылки или сообщения правильно распространялись между клиентами, подключенными к разным узлам.
Socket.ioБиблиотека предоставляет для этого специальное средство подключения к базе данных, называемое socket.io-redis, которое позволяет вам связывать экземпляры сервера, используя функциональность Redis pub-sub.
Для использования нескольких узловsocket.ioКроме того, вам необходимо настроить протокол на «веб-сокеты», так как для работы длительного опроса требуются липкие сеансы.
Следующий шаг
В этой короткой статье мы увидели некоторые вещи, о которых нужно знать, как масштабировать приложение Node.js, что также можно считать хорошей практикой для среды с одним узлом.
В следующей (и последней) статье этой серии мы познакомим вас с некоторыми продвинутыми операциями в Nodejs. ты сможешьздесьНайди это.
Если эта статья была вам полезна, пожалуйста, поставьте мне лайк!
Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллекти другие поля, если вы хотите видеть больше качественных переводов, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.