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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритм/тонкости разбора огромной очереди из собы 
:(
    Опции темы
valvet
Дата 6.7.2018, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.10.2016

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



Добрый день.
Суть и проблема в следующем
Есть задания которые могут выполняться от одной секунды до суток
Когда время вышло нужно выполнить некоторые действия(обновить данные в БД к примеру)
Проблема в том, что таких заданий может быть выше 400-500К
Как их обрабатывать? даже если взять таймером то будет 500К экзэмпляров объектов. 
Время критичный фактор, если задание длится 2 секунды, то оно должно быть гарантировано выполнено через 2 секунды. Исключения делается для заданий которые несколько часов длятся, там +/- 5сек не сильно важно.

Можно использовать всякие слушатели/observer но это всеравно в памяти держать объекты). Можно в БД хранить (хотя и так будет храниться) id, start, ended и раз в секунду вытаскивать все у которых ended>=now(); но тут оверхед на запрос, пока он выполнится и пока я все это потом обработаю. Возможно для хранения этих данных юзать NoSQL или что-то вроде этого, но как потом это с сервером(сервисом) состыковывать и с основной БД, не понятно! 

Причем может быть еще и очередь, т.е. одно строится 2-10 ждут очереди

Вообщем жду любой помощи. Заранее благодарен.

P.S. Для чего мне это и почему так много заданий спросите вы, все просто игра в которой можно строить что либо, каждая стройка занимает время, объектов для строительства =  кол-во игроков * ~50-100(так надо, у одного игрока может быть стока активных мест для одновременного строительства),

P.S.S Помимо заданий на здания есть еще всякие другие события которые так-же длятся N времени(стройка юнитов и т.д.), т.е. 500К можно и превысить


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


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.10.2016

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



Ни  и кого мыслей нет, или проблема описанная мной не понятна?


Это сообщение отредактировал(а) valvet - 9.7.2018, 06:16
PM MAIL   Вверх
LSD
Дата 9.7.2018, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(valvet @  6.7.2018,  10:50 Найти цитируемый пост)
игра в которой можно строить что либо, каждая стройка занимает время, объектов для строительства =  кол-во игроков * ~50-100(так надо, у одного игрока может быть стока активных мест для одновременного строительства),

Там же не постоянно надо что-то делать, там просто есть стадии типа:
1. Начали строительство
2. Построили на 50%
3. Закончили строительство

Т.е. по факту тебе нужны просто таски которые по таймеру будут менять статус объекта: фаза 1 -> фаза 2, фаза 2 -> фаза 3 и сохранять новый статус в базу.
Тот же ScheduledExecutorService может эффективно обслуживать большое количество подобных задач.


--------------------
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   Вверх
valvet
Дата 9.7.2018, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.10.2016

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



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

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


Leprechaun Software Developer
****


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

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



Цитата(valvet @  9.7.2018,  13:25 Найти цитируемый пост)
Не совсем понятно в памяти (сервере) хранить это не нужно будет, а раз в секунду заглядывать в базу и менять статус.
Или все хранить в памяти и при смене статуса, обновлять БД, только зачем, если и так будет понятно построилось или нет, хватит время начало и время окончания.

В БД по любому хранить надо будет: на случай падения сервера, для того чтобы синхронизировать состояние кластера. В принципе это может быть не классическая СУБД, а in memory data grid с persistence (типа Apache Ignite).


Но можно схитрить: помещаем объект в специальное состояние: ожидает изменения, и логикой этого изменения (типа, через 5 секунд в фазу 2, через 10 в фазу 3). И тот обработчик которому сейчас понадобилось состояние объекта: просто актуализирует его по заданной логике. Но тут могут быть проблемы: если у тебя 10 строек, они все потребляют ресурсы по мере стройки и их надо актуализировать и останавливать стройку, по мере того как ресурсы закончатся, обновлять какие нибудь глобальные настройки (прирост существ, ресурсов, мораль и т.п.). Такие вещи проще делать сразу по мере перехода из одной фазы в другую. Плюс нет проблемы с одновременным доступом к объекту, ситуация когда 2 обработчика пытаются обновить "ожидаемые изменения".


--------------------
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   Вверх
valvet
Дата 10.7.2018, 05:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.10.2016

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



LSD, спасибо, буду тогда через ScheduledExecutorService  реализовывать алгоритм, просто у меня были сомнения что с ним можно нормально обрабатывать свыше 500К объектов(заданий)
PM MAIL   Вверх
LSD
Дата 10.7.2018, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(valvet @  10.7.2018,  06:03 Найти цитируемый пост)
у меня были сомнения что с ним можно нормально обрабатывать свыше 500К объектов(заданий)

Количество само по себе, значение не имеет - они просто лежат в очереди. Вопрос только в том, сколько одновременно выполняется.



--------------------
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   Вверх
valvet
Дата 10.7.2018, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.10.2016

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



Цитата(LSD @  10.7.2018,  11:01 Найти цитируемый пост)
Количество само по себе, значение не имеет - они просто лежат в очереди. Вопрос только в том, сколько одновременно выполняется.

Так вот в том то и дело, что одновременно (для всех игроков, без разнице онлайн или нет) будет такое число построек

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


Leprechaun Software Developer
****


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

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



Цитата(valvet @  10.7.2018,  12:14 Найти цитируемый пост)
Так вот в том то и дело, что одновременно (для всех игроков, без разнице онлайн или нет) будет такое число построек

Количество построек, это количество задач в очереди, а не количество одновременных задач. Я уже писал почему.


--------------------
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   Вверх
valvet
Дата 11.7.2018, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.10.2016

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



Цитата(LSD @  11.7.2018,  11:21 Найти цитируемый пост)
Количество построек, это количество задач в очереди, а не количество одновременных задач. Я уже писал почему.

Нет, вы не поняли, смотрите, 50К игроков к примеру, каждый игрок может поставить стройку на ~10 площадках одновременно, это те стройки которые идут, активные, вот уже и 500К одновременно строящихся объектов. 

Или я вас недопонимаю)
PM MAIL   Вверх
LSD
Дата 11.7.2018, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(LSD @  9.7.2018,  13:12 Найти цитируемый пост)
Там же не постоянно надо что-то делать, там просто есть стадии типа:
1. Начали строительство
2. Построили на 50%
3. Закончили строительство

Т.е. по факту тебе нужны просто таски которые по таймеру будут менять статус объекта: фаза 1 -> фаза 2, фаза 2 -> фаза 3




--------------------
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   Вверх
valvet
Дата 12.7.2018, 04:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 25.10.2016

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



LSD, это я понял
Но видимо мы о разном говорим
Если таким вариантом делать, то нужно раз в секунду обращаться к базе и вытаскивать постройки которые закончились, и что-то с ними делать. Но это не приемлемо, запрос просто не успеет в секунду завершиться)
PM MAIL   Вверх
LSD
Дата 12.7.2018, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(valvet @  12.7.2018,  05:12 Найти цитируемый пост)
Если таким вариантом делать, то нужно раз в секунду обращаться к базе и вытаскивать постройки которые закончились, и что-то с ними делать. Но это не приемлемо, запрос просто не успеет в секунду завершиться)

Если постройка строиться быстро (за пару секунд), то по идее она еще должна быть в кеше. Если же она строить день, то интервалы между обновлениями будут большие и там +- 1 секунда роли не играет.


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

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

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


 




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


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

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