Несколько экземпляров узла с одной базой данных

В настоящее время я пишу приложение для Node и думаю о масштабировании. Насколько я понимаю, горизонтальное масштабирование — один из самых простых способов масштабирования приложения для обработки большего количества одновременных запросов. Моя рабочая копия в настоящее время использует MongoDb на сервере.

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

Для примера :Представьте, что сервер имеет этот список a ->b. Экземпляр 1 приходит с объектом c, а экземпляр 2 — с объектом d. Возможно, существует состояние гонки, при котором оба экземпляра читают a ->b и решают добавить в список свои собственные объекты. Затем экземпляр 1 будет представлять, что его вставка представляет собой ->b ->c, тогда как экземпляр 2 думает, что это ->b ->d, хотя база данных на самом деле содержит ->b -. >с ->г.

В общем, это звучит как работа для оптимистической блокировки, однако, насколько я понимаю, ни MongoDB, ни Redis (другая база данных, которую я рассматриваю ), не выполняет транзакции в манере SQL.

Поэтому я думаю, что решение будет одним из следующих:

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

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

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

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

6
задан johncch 7 May 2012 в 06:53
поделиться