2013-03-20 3 views
4

Вот мой сценарий:Зависимости между сообщениями очереди сообщениями

  • У меня есть два сервера с многопоточными очередями сообщений потребителя на каждом (всего два потребителя).
  • У меня много типов сообщений (CreateParent, CreateChild и т. Д.)
  • Я застрял с плохим устаревшим кодом (создание ребенка частично создаст родителя. Я знаю, что это плохо ... Но я не могу это изменить.)
  • Сообщение не может быть принята (принцип очередности сообщений!)
  • RabbitMQ - мое сообщение, обслуживающее брокера.

Моей проблема:

  • Когда два потока работает одновременно (один выполнение CreateParent, другое выполнение CreateChild), они порождают конфликты, потому что два поток пытается создать подразделы в базе данных (помните, унаследованного кода)

Мое первое решение:

  • Внутри потребителя , Я создал концепцию блокировки объектов. Поэтому, когда поток обрабатывает сообщение CreateChild, например, он блокирует дочерний элемент и родителя (устаревший код !!), поэтому обработка сообщений CreateParent может подождать. Я использовал базовый монитор .net и список идентификаторов для реализации этой концепции. Это работает хорошо.

Мое начальное ограничение решение:

  • Моя концепция «сущность замок» хорошо работает на одного потребителя в одном процессе на одном сервере. Но он не будет работать на нескольких серверах с несколькими потребителями.
  • Я думаю об использовании общей базы данных для «хранения» концепции блокировки сущности, поэтому каждый процесс (и потоки) может обращаться к базе данных, чтобы проверить, какие объекты заблокированы.

Мой вопрос (наконец!):

Все это становится очень сложным, и это увеличивает проблемы ошибок риска и обслуживание кода. Мне действительно не нравится! Кто-нибудь уже сталкивался с такой проблемой? Являются ли они приемлемыми обходными решениями для этого? Есть ли у кого-нибудь идеи для чистого решения для моего сценария?

Спасибо!

ответ

1

И, наконец, простые решения всегда лучшие!

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

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

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