В настоящее время я пишу приложение Node, и я думаю о будущем масштабирования. Насколько я понимаю, горизонтальное масштабирование - один из самых простых способов масштабирования приложения для обработки более параллельных запросов. В моей рабочей копии в настоящее время используется MongoDb на сервере.Несколько экземпляров узлов с одной базой данных
Мой вопрос заключается в следующем: у меня есть структура данных, которая напоминает связанный список, который требует строгого обслуживания. Мое (мнимое) беспокойство заключается в том, что, когда в базе данных есть условие гонки для нескольких экземпляров узла, возможно, что разрешение связанного списка будет неправильным.
Чтобы привести пример: представьте, что сервер имеет этот список a-> b. Экземпляр 1 входит в объект c, а экземпляр 2 входит в объект d. Возможно, что существует условие гонки, в котором оба экземпляра читают a-> b и решают добавить свои собственные объекты в список. Затем экземпляр 1 предположил, что его вставка будет a-> b-> c, а экземпляр 2 считает, что это a-> b-> d, когда база данных фактически содержит a-> b-> c-> d.
В общем, это похоже на работу для оптимистической блокировки, однако, как я понимаю, ни MongoDB, ни Redis (другая база данных, которые я рассматриваю) не делают транзакций в SQL-манере.
поэтому я полагаю, решение будет один из ниже:
Реализовать свою собственную транзакцию в MongoDB используя флаги. Клиент выполняет findAndModify по переменной блокировки и в случае успеха выполняет операции. Если это не удается, клиент повторяет попытку после определенного таймаута.
Используйте операции Redis и pubsub для достижения такого же эффекта. Я не совсем уверен, как это сделать, но похоже, что это было бы правдоподобно.
Реализация какой-то умной балансировки нагрузки. Если несколько клиентов работают на одном и том же элементе, проложите их в один и тот же экземпляр. Поскольку JS является однопоточным, проблема будет решена. К сожалению, я не нашел прямого решения этого.
Я уверен, что существует лучший, более элегантный способ достижения вышеуказанного, и я хотел бы услышать любые решения или предложения. Спасибо!
+1 только для использования Node.js + MongoDB –
Также обратите внимание на Neo4j, если ваши данные больше похожи на граф, чем набор документов ... –
Спасибо :) Я буду смотреть на это слишком , – johncch