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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Concurrency, singletons и синхронизация в EJB 3.0, (Jboss 4.3 - 6) 
:(
    Опции темы
chief39
Дата 23.8.2012, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


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

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



Ситуация такая:

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

Счетчик будет выглядеть как ConcurrencyHashMap c AtomicInteger и обновляться по CAS'у

Возник вопрос где этот счетчик единообразно хранить. 

- Синглетон, конечно, хорош. 
И даже будет до определенного момента работать. Но как только класслоадеры расползутся - швах.
Шедулер стянет инфу счетчика из своего класслоадера и все. Остальные потеряются. 
Идей как пересчитать все класслоадеры, все счетчики в них и посчитывать данные - нету.
Вернее, выглядят они абсолютно безумными с т.з. ЕЕ (имхо)

- Есть отличная, шикарная вещь в 3.1 @Singleton
А именно bean management concurrency 
Но джибосс ее поддерживает начиная с 7-го :(
Мы мигрируем, но только на 6-й максимум :(

- Есть сугубо джибоссовская аннотация @Service для синглетона (интуитивно понятное название, не правда ли? smile )
В доке ничего о конкарренси не сказано. Инет пестрит индусскими выводами "раз он синглетон - значит конкарренси ручками, ручками"

Заимплементил с ней пример.
Сотня клиентов, каждый валит по тысяче вызовов, порядочный классец должен был бы сломаться после двух параллельных counter++;
И побежать к плюс бесконечности.
Хрена с два. Строгие нолики на выходе.
Эта тварюка все-таки thread safe.

Код

@Service
@Local(CounterServiceLocal.class)
@Stateless(name = "CounterService")
public class CounterServiceBean implements CounterServiceLocal{

    private int counter = 0;

    public void count(String invoker) {
        System.out.println("+1 " + invoker + " count=" + counter);
        
        counter++;
        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        if(counter == 1 )counter--;
        System.out.println("-1 " + invoker + " count=" + counter);
    }

    public Integer getCount() {
        return counter;
    }



Итого :(
@Service мне вроде подходит. Но это будет преступлением практически все залочить на один классец с такой прямолинейной синхронизацией на одном мониторе.
Шаг влево-вправо - и вместо подсчета скорости мы получим обвал скорости и затык.

Рассматриваю варианты:

http://docs.jboss.org/ejb3/docs/reference/...extensions.html 
(поиском Test asynchTest = org.jboss.ejb3.asynchronous.Asynch.getAsynchronousProxy(test); )

Сунул асинхронный count - и забыл про него.


И второй вариант, стремный, но красивый:
Заюзать @Service и полагаться на то, что это никак не аукнется в ближайшее время (систему все равно никто еще не оптимизировал пока - страх и ужас начиная с отсутствия индексов).
Со временем, с выходом JBoss SOA 6  с JBoss AS 7 внутри - поднять вопрос о срочной миграции на него и засунуть @Singleton вместо @Service со своей синхронизацией.


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


ЗЫ: Самое паршивое что с еджиби работал года так 4 назад, ничего не помню, да и монструозность с очевидностью, особенно джибоссовская, вызывает приступы немотивированной агрессии  smile 



Может я уткнулся в мысленный тупик? Посоветуйте незамутненным разумом что-то, а? smile





Это сообщение отредактировал(а) chief39 - 23.8.2012, 19:09


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

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


Эксперт
***


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

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



Если совсем не получается, то может следует использовать UUID?


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
chief39
Дата 23.8.2012, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


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

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



Цитата(Stolzen @  23.8.2012,  23:19 Найти цитируемый пост)
Если совсем не получается, то может следует использовать UUID? 

Эммм.. если бы я сказал что понял, я бы соврал smile

Как, что и куда прикручивать? smile


ЗЫ: Напутал с версиями, вроде бы будет 5 жбосс. Но гарантированно Ежибяки 3.0, не больше :(

Это сообщение отредактировал(а) chief39 - 23.8.2012, 23:39


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
Stolzen
Дата 24.8.2012, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(chief39 @  24.8.2012,  00:37 Найти цитируемый пост)
Как, что и куда прикручивать? smile

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

UUID.randomUUID().toString()



--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
chief39
Дата 26.8.2012, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


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

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



Так мне считать надо, а не случайные числа генерить smile


Вопрос решился бутылкой пива и мыслью "гляну-ка я еще разок":

Код

@Service
@Local(CounterServiceLocal.class)
@Stateless(name = "CounterService")

должно выглядеть вот так
Код

@Service(name = "CounterService")
@Local(CounterServiceLocal.class)


Я умудрился оставить стейтлесс и списать это на контейнерную конкарренси.

Теперь все отлично, кантер моментально сходит с ума при сотне клиентов smile

Это сообщение отредактировал(а) chief39 - 26.8.2012, 00:23


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




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


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

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