Есть ли здесь проблема параллелизма? Как это проверить во время разработки? - PullRequest
0 голосов
/ 17 февраля 2011

Сценарий: существует «n» команд, каждая из которых работает над своей виртуальной «стеной» (наподобие стены Facebook). Каждая команда видит только свою стену и посты на ней. Сообщения могут быть отредактированы автором сообщения или другим членом команды (если так настроено. Предполагается, что это действительно так, поскольку это необходимо).

Проектные / технологические решения: RESTful веб-приложение с использованием Restlet + Glassfish / Java + Mysql (РЕДАКТИРОВАТЬ: Использование Apache DBUtils для доступа к БД. Нет ORM - кажется излишним)

Вопрос: Несколько команд входят в T1, T2 и T3 (скажем), каждая с некоторым количеством участников. Существует параллелизм при доступе к данным на уровне команды, но не между командами, т. Е. Разные группы получают доступ к непересекающимся наборам данных. Чтобы оптимизировать частое чтение / запись из / в БД, мы рассматриваем TeamGateway, который контролирует доступ к БД для обработки параллелизма. Веб-сервер будет кэшировать данные, полученные командами, для ускорения чтения (а также для обновления списка сообщений на стене)

  • В1: Требуется ли это (TableGateway на команду + кэш)? Если нет, то как вы предлагаете справиться с этим?
  • Q2: Если это так, нужно ли кодировать TableGateway (для каждой команды) как поточно-ориентированный (синхронизированный метод) ?? Допустим, у нас есть класс / реестр TableGatewayFinder со статическим методом, который возвращает TableGateway для использования этой конкретной командой (используя хэш-карту).

Если 6 человек из каждого из T1 - T3 войдут в систему, тогда будет создано ТОЛЬКО 3 TableGateways, и это поможет перехватывать одновременные записи (простое сравнение временных меток перед фиксацией или добавлением с пометкой о конфликте) и эффективно управлять кэшированием (мы планируете иметь карты идентичности для сущностей - необходимо отследить 4-5 разных сущностей: 4 сущности для составной иерархии и еще один связан с каждой из 4)?

Как один модуль будет тестировать шлюз (на основе TDD или по факту)?

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 17 февраля 2011

Если вы просто пишете в БД или в решение для кэширования поверх БД (например, Spring + Hibernate + EhCache и т. Д.), Вам не нужно беспокоиться о повреждении ваших таблиц и т. Д. Т.е. нет проблем параллелизма из-за низкого уровняточка зрения

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

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

Если ваши сущности являются статьями, то у вас, вероятно, есть другая форма параллелизма.Как тот, который решается с помощью программного обеспечения для управления версиями, такого как SVN, Mercurial и т. Д. То есть, если вы не включаете возможность слияния в свое приложение., Становится раздражающим, если кто-то редактирует чью-то статью только для того, чтобы обнаружить, что кто-то другой «совершил» другуюредактировать перед вами и т. д. Нужно ли вам добавлять такую ​​возможность, зависит от варианта использования.

Что касается тестирования вашего приложения.для параллелизма юнит-тестирование неплохое.Путем написания параллельных юнит-тестов намного легче выявлять ошибки параллелизма.Написание параллельных тестов очень сложно, поэтому я рекомендую вам прочитать хорошие книги, такие как «Java Concurrency in Practice», прежде чем писать их.Лучше поймать свои ошибки параллелизма перед интеграционным тестированием, когда становится трудно догадаться, что, черт возьми, происходит!

ОБНОВЛЕНИЕ:
@Nupul: Это сложный вопрос.Тем не менее, если вы наберете 18 человек, моя ставка будет записывать каждый раз, когда в БД все будет в порядке.

Если вы не сохраняете какое-либо состояние в другом месте (т.е. только в БД), вам следует избавиться от любого ненужного мьютекса (и вы не должны хранить никакое состояние в другом месте, кроме БД, если у вас нет веских причинсделать это в вашей ситуации IMO).

Легко ошибиться и получить мьютекс, выполняя что-то вроде сетевой операции, и, следовательно, вызывать серьезные проблемы с юзабилити (например, приложение не отвечает в течение многих секунд и т. Д.).Кроме того, легко иметь неприятные ошибки параллелизма, такие как блокировка потоков и т. Д.

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

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

0 голосов
/ 17 февраля 2011

Сосредоточение внимания на 2 вопросах в названии.

Есть ли здесь проблема параллелизма?

Да. Очевидно. Единственный способ избежать возможности возникновения проблем с параллелизмом - это сделать продукт однопоточным, что приведет к серьезным проблемам с производительностью и удобством использования.

Как проверить это во время разработки?

Это сложный вопрос.

Очевидно, вам нужны юнит-тесты. Но классические модульные тесты на самом деле не позволяют справиться с проблемами параллелизма, потому что хитрые ошибки параллелизма обычно появляются редко.

Лучшим подходом является нагрузочное тестирование. как описано @ Gnat.

Но для достижения наилучших результатов вам необходимо признать, что тестирование не является (целым) решением, и добавить следующее:

  • Персонал, имеющий опыт разработки, кодирования и тестирования параллельных приложений.
  • Уделяя большое внимание подходу / рекомендациям "Java - параллелизм на практике" Гетца и др.
  • Множество обзоров дизайна и кода.
  • Тщательное использование статических анализаторов кода для выявления потенциальных проблем параллелизма.
0 голосов
/ 17 февраля 2011

Модульное тестирование может быть не лучшим подходом к проблемам параллелизма.Вместо этого вы можете попробовать веб-инструмент для повышения производительности, такой как JMeter или Rational Performance Tester, чтобы проверить, как он работает, и что у вас есть действительное содержание стен по мере увеличения количества пользователей.С помощью этих инструментов вы можете назначить каждому пользователю свое поведение.

...