Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Доброго дня
Прошу всех специалистов в теме highload помочь со следующим заданием:
1) Задача: на базе PHP+MySQL нужно реализовать сервис приёма статистики игровых данных.
Структура:
- ID игрока
- игровое время события
- ID устройства ( строка , 64 символа )
- платформа устройства (iPad, iPhone)
- набор произвольных данных (например, устройство отсылает событие с параметрами Event=Start, Money=15444 и т.д.)
2) Требования:
- сервис должен выдерживать приём 20 млн обращений в сутки.
- необходимо предусмотреть возможность выборки и удаления данных за предыдущий день ( например, 10 -го числа забираются и удаляются данные за 9 -е)
- сервис должен отвечать клиенту, что приём прошёл удачно либо неудачно
Свои идеи:
1. Структура БД
Т.к. данные будет писаться часто и много, а удаляться и читаться редко то вижу два варианта структуры БД:
1.1 Каждый день кроном (cron) создавать таблицу на следующий день - куда будут складываться данные.
Тогда удаление и чтение данных не будет оказывать влияния на вновь записываемые данные.
Неактивен
Игровой сервер выдает порциями (объем?) или по одной?
Неактивен
klow написал:
Игровой сервер выдает порциями (объем?) или по одной?
ММММ
Не совсем понятен вопрос.
Это клиенты конектятся к серверу и ложат на него данные порциями но очень часто.
Отредактированно alex-zzx (06.11.2017 12:29:32)
Неактивен
Вопрос, как правильно сохранять эти данные. Если порции достаточно большие, то рекомендую через "LOAD DATA". Это может существенно ускорить загрузку по сравнению с обычным инсерт.
Неактивен
klow написал:
Вопрос, как правильно сохранять эти данные. Если порции достаточно большие, то рекомендую через "LOAD DATA". Это может существенно ускорить загрузку по сравнению с обычным инсерт.
Знаю про "LOAD DATA" - но в данном случае скорее всего это не то. "LOAD DATA" - грузит данные из файлов в БД.
В задаче ситуация другая:
Клиент с мобильного устройства подключился к серверу - оставил на нём данные и ушёл. И таких клиенты могут делать 230 инсертов в базу в секунду.
Неактивен
Эта задача может решатся как и инсерт так и Load (предварительно сохранив в файл), но время выполнения задачи может быть разное (во много раз). Например, клиент скинул 200 тыс. записей. Если будешь инсертом загонять в базу (даже используя групповую вставку), это, думаю, будет существенно медленнее чем использовать Load. Но если будет только несколько записей, то Load (без накопления), скорее всего, будет в проигрыше. Думаю, время и, соответственно, нагрузка на БД при таком количестве данных имеет важное значение.
Неактивен
klow написал:
Эта задача может решатся как и инсерт так и Load (предварительно сохранив в файл), но время выполнения задачи может быть разное (во много раз). Например, клиент скинул 200 тыс. записей. Если будешь инсертом загонять в базу (даже используя групповую вставку), это, думаю, будет существенно медленнее чем использовать Load. Но если будет только несколько записей, то Load (без накопления), скорее всего, будет в проигрыше. Думаю, время и, соответственно, нагрузка на БД при таком количестве данных имеет важное значение.
Спасибо за ответы.
Но вероятно мы не совсем понимаем друг друга.
Это не 1 клиент скидывает записи на сервер.
Множество разных клиентов пишут данные на сервер одновременно. Исходя из нагрузки в 20млн в сутки - множество разных клиентов может делать по 230 записей в секунду.
Если все эти клиенты будут писать в файл одновременно - то файл будет блочится каждым клиентом под себя а остальные будут вынуждены ждать пока файл не разблочится - в результате будут огромные задержки - разве нет?
С другой стороны, если можно напрямую писать в файл(без over задержек и подвисаний) - то вообще можно уйти от Mysql - и сразу писать данные в csv файлы по дням. А потом выдавать список дней по которым можно скачать статистику.
Но в задаче стоит условие - сохранять данные именно в БД чтобы потом их скачать.
По изначально предложенной структуре БД, идеии разделения на партициям - можете что-то подсказать?
Неактивен
Похоже не совсем понимаем друг друга. Давайте будем уточнять.
1.Я не говорил про один файл. Файлы (временные) должны быть разные, один файл - на одну порцию данных (сессию). Подключился клиент, сохранили его данные в файл. Загрузили (Load) файл. Удалили файл. Ответили клиенту, что все нормально.
Если порция данных достаточно большая, то выигрыш (нагрузка, время) может быть существенный.
2. Сохранять данные всех клиентов в один файл (или один файл на клиента), а потом его грузить в БД один раз в день или периодически, например, 1 раз в час? Думаю, это неправильно. Мне это решение не очень нравиться.
3. Замечаний, предложений по структуре БД нет. Вроде, все логично.
Неактивен
klow написал:
1.Я не говорил про один файл. Файлы (временные) должны быть разные, один файл - на одну порцию данных (сессию). Подключился клиент, сохранили его данные в файл. Загрузили (Load) файл. Удалили файл. Ответили клиенту, что все нормально.
Если порция данных достаточно большая, то выигрыш (нагрузка, время) может быть существенный.
Как вариант да, но пока он кажется не особо оптимальным.
klow написал:
2. Сохранять данные всех клиентов в один файл (или один файл на клиента), а потом его грузить в БД один раз в день или периодически, например, 1 раз в час? Думаю, это неправильно. Мне это решение не очень нравиться.
Здесь скорее имелась ввиду идея хранить данные по всем событиям за день в 1 csv файле и потом просто скачивать его.
klow написал:
3. Замечаний, предложений по структуре БД нет. Вроде, все логично.
Спасибо
Неактивен
1. Все зависит от количества записей в одной порции данных. Проверь реализовав и то и то решение и увидишь разницу. Я был удивлен насколько Load быстрее Insert. В моем случае это было в сотни раз, но не факт, что в данном случае это будет быстрее.
2. Писать в один файл с разных источников в одно и тоже время - могут быть проблемы с реализацией. Кроме того, не факт, что этот файл после успешно загрузиться, а клиента уже проинформировал, что все ок.
Неактивен
klow написал:
1. Все зависит от количества записей в одной порции данных. Проверь реализовав и то и то решение и увидишь разницу. Я был удивлен насколько Load быстрее Insert. В моем случае это было в сотни раз, но не факт, что в данном случае это будет быстрее.
2. Писать в один файл с разных источников в одно и тоже время - могут быть проблемы с реализацией. Кроме того, не факт, что этот файл после успешно загрузиться, а клиента уже проинформировал, что все ок.
1. Представляю разницу между Load и Insert. Разница как между восстановлением БД через phpMyAdmin и через консоль командой source
2. Тоже так думаю
Неактивен
Страниц: 1