2012-05-07 4 views
6

В настоящее время я пишу приложение 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-манере.

поэтому я полагаю, решение будет один из ниже:

  1. Реализовать свою собственную транзакцию в MongoDB используя флаги. Клиент выполняет findAndModify по переменной блокировки и в случае успеха выполняет операции. Если это не удается, клиент повторяет попытку после определенного таймаута.

  2. Используйте операции Redis и pubsub для достижения такого же эффекта. Я не совсем уверен, как это сделать, но похоже, что это было бы правдоподобно.

  3. Реализация какой-то умной балансировки нагрузки. Если несколько клиентов работают на одном и том же элементе, проложите их в один и тот же экземпляр. Поскольку JS является однопоточным, проблема будет решена. К сожалению, я не нашел прямого решения этого.

Я уверен, что существует лучший, более элегантный способ достижения вышеуказанного, и я хотел бы услышать любые решения или предложения. Спасибо!

+3

+1 только для использования Node.js + MongoDB –

+0

Также обратите внимание на Neo4j, если ваши данные больше похожи на граф, чем набор документов ... –

+0

Спасибо :) Я буду смотреть на это слишком , – johncch

ответ

0

Если я правильно понял, и список хранится как один документ, вы можете посмотреть на управление версиями строк. Так добавить свойство к документу, который будет обрабатывать версии, при обновлении, вы увеличите (или изменить) версию, и вы делаете, что условное обновление:

// обновление (состояние, значение)

обновление ({версия: whateverYouReceivedWhenYouDidFind}, newValue)

Надеюсь, это поможет. Гаса

0

Вы хотите, чтобы команда findAndModify на mongodb гарантировала атомную модификацию при возврате недавно измененного документа. Поскольку изменения последовательного и атомному экземпляр 1 будет иметь a-> b-> с и экземпляр 2 будет иметь a-> b-> c-> d

Приветствия

+0

К сожалению, мне нужно будет выполнить некоторую обработку между командами find и modify, поэтому кажется, что это невозможно, используя этот API-интерфейс mongo? – johncch

0

Если все, что вы делаете, это добавление нового элементов в список, вы можете использовать список Redis и включать время в каждое добавленное значение. Список может быть несортирован по redis, но должен быть быстро отсортирован при извлечении.

Смежные вопросы