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

Вот ситуация, у меня есть 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!

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

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


person DNB5brims    schedule 28.03.2012    source источник
comment
У вас есть только проблема согласования двух попыток доступа к одной учетной записи? Или у вас могут быть другие проблемы с координацией? (Если только это, держите таблицу учетных записей, которые в настоящее время обрабатываются, и откладывайте любое задание, которое обращается к учетной записи в таблице.)   -  person David Schwartz    schedule 28.03.2012


Ответы (2)


Как ты сделал это?

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

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

  1. запрос принят
  2. Менеджер назначает работу работнику
  3. Worker does the work of the withdrawal as follows:
    1. Start database transaction
    2. Убедитесь, что учетная запись существует.
    3. Убедитесь, что withdrawal > 0.
    4. Убедитесь, что balance - withdrawal >= 0
    5. Обновите баланс базы данных.
    6. Подтвердите транзакцию или откатите ее, если были ошибки.
  4. Работник сообщает о результатах менеджеру
  5. Менеджер отвечает на запрос.

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

person Stephen C    schedule 28.03.2012

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

person Shuo Ran    schedule 28.03.2012