Как сделать так, чтобы у нескольких экземпляров не было проблем с синхронизацией данных? - PullRequest
0 голосов
/ 28 марта 2012

Вот ситуация, у меня есть 3 экземпляра, один - менеджер для назначения работы, а два - рабочий, выполняющий работу.Допустим, пользователю нужно что-то отозвать, и рабочий процесс выглядит следующим образом:

Request sent 
Manager assign job, depends on worker instance loading 
worker do the work (reduce the num in db) 
tell the manager instance job is finished!

Все работает, но два экземпляра могут иметь два отзыва в одном аккаунте, у него могут быть некоторые проблемы, чтобы сделать отрицательное число.... Итак, там есть некоторые проблемы.Ну, вы можете сказать добавить канал выполнения или очередь или что-то, что выполняет только функцию записи одной базы данных ....

Но проблема в том, что у меня все больше и больше экземпляров, только с одним экземпляром для записи, чтоМожет снизить продуктивность, кто-нибудь рекомендует?Спасибо.

Ответы [ 2 ]

0 голосов
/ 28 марта 2012

Как ты это делаешь?

Путем тщательной разработки атомарных операций и выполнения всех соответствующих проверок, обращений и обновлений в рамках атомарного действия.

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

  1. Запрос получен
  2. Менеджер назначает работу работнику
  3. Работник осуществляет вывод средств следующим образом:
    1. Запустить транзакцию базы данных
    2. Убедитесь, что учетная запись существует.
    3. Проверьте, что withdrawal > 0.
    4. Проверьте, что balance - withdrawal >= 0
    5. Обновление баланса базы данных.
    6. Подтвердите транзакцию или откатите ее, если были ошибки.
  4. Рабочий сообщает результат менеджеру
  5. Менеджер отвечает на запрос.

С другой стороны, если база данных не была задействована, и вы просто обновляли объекты в памяти, вы бы создали класс Account, у которого был синхронизированный метод для вывода средств, который выполнял шаги с 3.3 по 3.5 выше, и пусть рабочий вызовет метод с соответствующими параметрами.

0 голосов
/ 28 марта 2012

Я предлагаю вам прочитать о синхронизированном блоке / методе или ReentrantLock. По сути, вам необходимо установить блокировку чтения / записи для функции извлечения, чтобы два потока не могли одновременно читать и записывать один и тот же фрагмент данных.

...