|
Модераторы: LSD, AntonSaburov |
|
valvet |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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К можно и превысить |
|||
|
||||
valvet |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 25.10.2016 Репутация: нет Всего: нет |
Ни и кого мыслей нет, или проблема описанная мной не понятна?
Это сообщение отредактировал(а) valvet - 9.7.2018, 06:16 |
|||
|
||||
LSD |
|
|||
Leprechaun Software Developer Профиль Группа: Модератор Сообщений: 15709 Регистрация: 24.3.2004 Репутация: 209 Всего: 537 |
Там же не постоянно надо что-то делать, там просто есть стадии типа: 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. |
|||
|
||||
valvet |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 25.10.2016 Репутация: нет Всего: нет |
Спасибо за ответ.
Не совсем понятно в памяти (сервере) хранить это не нужно будет, а раз в секунду заглядывать в базу и менять статус. Или все хранить в памяти и при смене статуса, обновлять БД, только зачем, если и так будет понятно построилось или нет, хватит время начало и время окончания |
|||
|
||||
LSD |
|
|||
Leprechaun Software Developer Профиль Группа: Модератор Сообщений: 15709 Регистрация: 24.3.2004 Репутация: 209 Всего: 537 |
В БД по любому хранить надо будет: на случай падения сервера, для того чтобы синхронизировать состояние кластера. В принципе это может быть не классическая СУБД, а 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. |
|||
|
||||
valvet |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 25.10.2016 Репутация: нет Всего: нет |
LSD, спасибо, буду тогда через ScheduledExecutorService реализовывать алгоритм, просто у меня были сомнения что с ним можно нормально обрабатывать свыше 500К объектов(заданий)
|
|||
|
||||
LSD |
|
|||
Leprechaun Software Developer Профиль Группа: Модератор Сообщений: 15709 Регистрация: 24.3.2004 Репутация: 209 Всего: 537 |
Количество само по себе, значение не имеет - они просто лежат в очереди. Вопрос только в том, сколько одновременно выполняется. -------------------- 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. |
|||
|
||||
valvet |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 25.10.2016 Репутация: нет Всего: нет |
||||
|
||||
LSD |
|
|||
Leprechaun Software Developer Профиль Группа: Модератор Сообщений: 15709 Регистрация: 24.3.2004 Репутация: 209 Всего: 537 |
Количество построек, это количество задач в очереди, а не количество одновременных задач. Я уже писал почему. -------------------- 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. |
|||
|
||||
valvet |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 25.10.2016 Репутация: нет Всего: нет |
Нет, вы не поняли, смотрите, 50К игроков к примеру, каждый игрок может поставить стройку на ~10 площадках одновременно, это те стройки которые идут, активные, вот уже и 500К одновременно строящихся объектов. Или я вас недопонимаю) |
|||
|
||||
LSD |
|
|||
Leprechaun Software Developer Профиль Группа: Модератор Сообщений: 15709 Регистрация: 24.3.2004 Репутация: 209 Всего: 537 |
-------------------- 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. |
|||
|
||||
valvet |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 25.10.2016 Репутация: нет Всего: нет |
LSD, это я понял
Но видимо мы о разном говорим Если таким вариантом делать, то нужно раз в секунду обращаться к базе и вытаскивать постройки которые закончились, и что-то с ними делать. Но это не приемлемо, запрос просто не успеет в секунду завершиться) |
|||
|
||||
LSD |
|
|||
Leprechaun Software Developer Профиль Группа: Модератор Сообщений: 15709 Регистрация: 24.3.2004 Репутация: 209 Всего: 537 |
Если постройка строиться быстро (за пару секунд), то по идее она еще должна быть в кеше. Если же она строить день, то интервалы между обновлениями будут большие и там +- 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. |
|||
|
||||
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |