Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужен совет по архитектуре 
:(
    Опции темы
graycrocodile
Дата 6.12.2010, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 13
Регистрация: 6.12.2010
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Здравствуйте,
Хотелось бы узнать мнение, желательно, основанное на опыте smile, по следующему вопросу.

Входящие, неизменяемые условия:
Имеется Tomcat 6. Несколько сотен клиентов шлют к нему запросы с частотой не меньше чем 1 запрос за 5 секунд.
Для каждого запроса надо обратиться к нескольким общим ресурсами в памяти. Работа с БД минимальна, при этом она используется либо до исполнения запроса (подгрузить что-то в кеш), либо после (кинуть лог, обновить персистант объект, коих не так много и они не являются общими ресурсами). 

Предлагаемое решение:
В сервлете, на основе аргументов создается задача и возможно происходит загрузка чего-то необходимого из БД для этой задачи. далее в задача кидается в однопоточный(!) Executor, в нем происходит выполнение логики (при этом логика не совершает операций ввода вывода и не требует блокировок). В это время сервлет ждет результата задачи.
Получив его, он, возможно что-то пишет в БД, и отдает ответ. Ответ по объему небольшой.

Ожидаемые преимущества:
1 - резкое уменьшение сложности кода за счет того, что можно спокойно выкидывать все блокировки в бизнес-логики

Интересующий показатель:
Влияние на решения на производительность: как возможное положительное, так и возможное отрицательное.


Это сообщение отредактировал(а) graycrocodile - 6.12.2010, 20:24
PM   Вверх
LSD
Дата 7.12.2010, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15717
Регистрация: 24.3.2004
Где: Dublin

Репутация: 1
Всего: 537



Вообще не вижу никаких преимуществ.
1. Откуда в бизнес логике берутся взаимные блокировки? Блокировки могут быть на операциях чтения/записи в кеш/СУБД, но они не в бизнес логике, а в сторонних библиотеках.
2. Сервлет это отдельный поток, и отказ от многопоточного сервера в пользу однопоточного Executor-а, не принесет никаких особых преимуществ.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
graycrocodile
Дата 7.12.2010, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 13
Регистрация: 6.12.2010
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата(LSD @  7.12.2010,  15:52 Найти цитируемый пост)
1. Откуда в бизнес логике берутся взаимные блокировки? Блокировки могут быть на операциях чтения/записи в кеш/СУБД, но они не в бизнес логике, а в сторонних библиотеках.

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

PM   Вверх
LSD
Дата 7.12.2010, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15717
Регистрация: 24.3.2004
Где: Dublin

Репутация: 1
Всего: 537



Цитата(graycrocodile @  7.12.2010,  20:04 Найти цитируемый пост)
в данном случае клиентам приходится постоянно оперировать общими данными, и если доступ к этим данным не синхронизировать, то они потеряют целостность

А что за "общие данные" такие, которые меняются но при этом
Цитата(graycrocodile @  6.12.2010,  21:23 Найти цитируемый пост)
Работа с БД минимальна, при этом она используется либо до исполнения запроса (подгрузить что-то в кеш), либо после (кинуть лог, обновить персистант объект, коих не так много и они не являются общими ресурсами).

не хранятся в БД?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
graycrocodile
Дата 7.12.2010, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 13
Регистрация: 6.12.2010
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата(LSD @  7.12.2010,  19:06 Найти цитируемый пост)
А что за "общие данные" такие, 

важно что такие данные есть не так ли? smile
данные текущих игровых сессий между группами игроков.

Это сообщение отредактировал(а) graycrocodile - 7.12.2010, 19:11
PM   Вверх
LSD
Дата 7.12.2010, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15717
Регистрация: 24.3.2004
Где: Dublin

Репутация: 1
Всего: 537



Цитата(graycrocodile @  7.12.2010,  20:11 Найти цитируемый пост)
важно что такие данные есть не так ли? smile
данные текущих игровых сессий между группами игроков.

Важен характер этих данных. Просто я не совсем понимаю как происходит работа с этими данными:
Цитата(graycrocodile @  6.12.2010,  21:23 Найти цитируемый пост)
В сервлете, на основе аргументов создается задача и возможно происходит загрузка чего-то необходимого из БД для этой задачи. далее в задача кидается в однопоточный(!) Executor, в нем происходит выполнение логики (при этом логика не совершает операций ввода вывода и не требует блокировок). В это время сервлет ждет результата задачи.
Получив его, он, возможно что-то пишет в БД, и отдает ответ. Ответ по объему небольшой.

И где в этой схеме происходит изменение игровых сессий игроков?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
graycrocodile
Дата 7.12.2010, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 13
Регистрация: 6.12.2010
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата(LSD @  7.12.2010,  19:17 Найти цитируемый пост)
И где в этой схеме происходит изменение игровых сессий игроков? 

я предполагаю выполнять ее здесь.
Цитата(LSD @  7.12.2010,  19:17 Найти цитируемый пост)
далее в задача кидается в однопоточный(!) Executor, в нем происходит выполнение логики (при этом логика не совершает операций ввода вывода и не требует блокировок).


Добавлено через 6 минут и 18 секунд
поясню примером.
Имеется куча игроков. Они трепятся у себя в своих чатиках, часто сразу в нескольких (там зональный чат, клан чат, приватный с другом). Далее в это же время игроки используют сервис поиска соперника из желающих сразится. В случае нахождения, игроки на  утюжат друг друга в дуэльном пошаговом бою или групповом, не прекращая своего флуда. 
Реально в БД необходимо коммитить только результат боя, ну и результат похода в магазин перед боем. Все остальное большой информационный шум, не требующий увековечивания его в БД. Однако, требующий использования общих данных, типа списки чатов, поля боев, списки желающих подраться по зонам с желаемыми параметрами соперника и проч.
PM   Вверх
LSD
Дата 7.12.2010, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15717
Регистрация: 24.3.2004
Где: Dublin

Репутация: 1
Всего: 537



Мое мнение таково:
- в принципе этот метод может дать прирост производительности если большую времени обработчик тратит на изменение общих объектов.
- на многопроцессорной машине будет эффективно утилизироваться только одно ядро
- если сравнить предложенным метод оптимизации и грамотно реализованные "общие данные" (использование неблокируемых коллекций из java.util.concurent, synchronized блоки заменить на ReadWriteLock и т.д.), то второй вариант будет более производительным и масштабируемым

P.S. Рекомендую почитать Оптимизация производительности: эффективное взаимодействие с виртуальной машиной, раздел про блокировки.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
graycrocodile
Дата 7.12.2010, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 13
Регистрация: 6.12.2010
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата(LSD @  7.12.2010,  19:46 Найти цитируемый пост)
P.S. Рекомендую почитать Оптимизация производительности: эффективное взаимодействие с виртуальной машиной, раздел про блокировки. 

спасибо за ссылку. Почитаю.


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

Это сообщение отредактировал(а) graycrocodile - 7.12.2010, 20:32
PM   Вверх
COVD
Дата 7.12.2010, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: нет
Всего: 43



Цитата

подход сильно упрощает код

"общие данные" - это же, наверное, обычные коллекции, Мап, Лист. Почему бы не использовать синхронизированные коллекции? Например, кеш системы, где кроме синхронизации еще много чего полезного. Автоматический сброс на диск редко используемых обьектов. Или распределенный кеш. Чтобы обшие ресурсы не "жили" в Томкате. ehcache, hazelcast e.t.c. 
PM MAIL   Вверх
graycrocodile
Дата 8.12.2010, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 13
Регистрация: 6.12.2010
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата(COVD @  7.12.2010,  22:43 Найти цитируемый пост)
"общие данные" - это же, наверное, обычные коллекции, Мап, Лист.

да, в подавляющем большинистве списки, массивы, деревья из объектов, которые подвержены частым модификациям.


Цитата(COVD @  7.12.2010,  22:43 Найти цитируемый пост)
 Почему бы не использовать синхронизированные коллекции?

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

PM   Вверх
Skipy
Дата 8.12.2010, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

Репутация: нет
Всего: 16



Цитата(graycrocodile @ 7.12.2010,  19:04)
в данном случае клиентам приходится постоянно оперировать общими данными, и если доступ к этим данным не синхронизировать, то они потеряют целостность. А любая синхронизация (критическая секция), активно используемая, приводит к блокировке.

Сравните размер критической секции и всей бизнес-логики обработки запроса. Первая выполняется 5 мс, вторая - 200. Т.е. в первом случае будут блокировки на 5мс, во втором - на 200. 

Кроме того, синхронизацию с части изменений можно снять с помощью Atomic- переменных.

Добавлено через 51 секунду
Цитата(graycrocodile @ 8.12.2010,  12:52)
Хочется именно универсального решения, которое вынесет все проблемы синхронизации в отдельный слой абстракции и при этом не било кувалдой по производительности.

Вынос обработки всех запросов в один поток - это не кувалда. Это Царь-бомба. 


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
graycrocodile
Дата 8.12.2010, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 13
Регистрация: 6.12.2010
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата(Skipy @  8.12.2010,  13:36 Найти цитируемый пост)
Вынос обработки всех запросов в один поток - это не кувалда. Это Царь-бомба.  

и почему же?
реальное преимущество много поточности в производительности проявляется только при наличии частых остановок потоков на операции ввода-вывода.



PM   Вверх
LSD
Дата 8.12.2010, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15717
Регистрация: 24.3.2004
Где: Dublin

Репутация: 1
Всего: 537



Цитата(graycrocodile @  8.12.2010,  14:48 Найти цитируемый пост)
реальное преимущество много поточности в производительности проявляется только при наличии частых остановок потоков на операции ввода-вывода.

А многопроцессорные/многоядерные CPU?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
graycrocodile
Дата 8.12.2010, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 13
Регистрация: 6.12.2010
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата(LSD @  8.12.2010,  13:54 Найти цитируемый пост)
А многопроцессорные/многоядерные CPU? 

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

Небольшой UPD.
Игроков можно разделить на зоны, игрок в одной зоне не имеет контактов с другими зонами (нет междузональных общих данных), тогда кол-во потоков логики становится равным кол-у зон. Что уже будет выглядеть не так страшно.

Это сообщение отредактировал(а) graycrocodile - 8.12.2010, 14:04
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Design, Quality, Testing | Следующая тема »


 




[ Время генерации скрипта: 0.0885 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.