2011-09-24 4 views
1

На контейнерном один Java имени РИМЕНЕНИЯ как ВРМБЫ deployed.On верх ее 3 других приложения Java развертываются скажет A, B и C.Ищет реальное время Решения: Эффективное взаимодействие DB

Теперь приложение A, B и C используют одно имя метода как Sing (id) приложения sbs, которое используется для воспроизведения сообщения.

петь (id) метод приложения sbs, попадает около 200 раз в секунду и воспроизводит сообщение для всех.

Моя проблема:

таблицы БД:

Play ID: Id игры

Count: Общее количество запросов для этой игры идентификатор

Дата последнего времени: последняя дата и время его воспроизведения

Pl ау ID: 1

Количество: Всего 66

Последнее время Дата: 10/8/2011 231145 (нечто)

Теперь обновить таблицу

Play ID: 1

Количество: Всего 92

Последнее время: 10/8/2011 231344 (что-то)

Я должен обновить эту таблицу, и, как я упоминал ранее, это поле меняется 200 раз в секунду. Важно знать, сколько раз этот проигрываемый проигрыватель был воспроизведен в это время.

Хо, я это делаю?

Невозможно ударить базу данных 200 раз в секунду. Так что я могу попасть в базу данных каждые 4-5 секунд (периодически) и обновлять состояние счета идентификатора воспроизведения. Как я могу сделать это приложение мудрым. увеличивать счетчик 200 раз в секунду и хранить значение где-то и обновлять базу данных ... что-то вроде этого .... наилучший эффективный подход ....

Сообщите мне, если у вас есть путаница

Ищете ценные входы. Заранее спасибо.

+0

- это сообщения, обновленные между ними - т. Е. Требуется ли все запрос для его извлечения из db или может быть кэширован каким-то образом? – Nrj

+0

даже я тоже не знаю .. потому что это логика медиа-сервера .... сценарий ... мое приложение ... мой сервер ... и еще один медиа-сервер. Я ограничен до мой сервер ... – VJS

+0

Думаю, вы можете это разъяснить. В противном случае я бы рекомендовал подумать о решении Андрея. – Nrj

ответ

3

В этой проблеме есть что-то довольно подозрительное. вы заявили:

  • Если допустимо только обновлять таблицу каждые 4 или 5 секунд, то вы неизбежно будете «недостающей» обновление, а значение count и last_date_time будет устареть, если вы спросили его.

  • Хуже все еще (возможно), если ваша система сработает через 4,9 секунды после последнего обновления, ваша система полностью потеряет несколько тиков счета.

Если эти аномалии материи, то у Вас нет никакого выбора, кроме как синхронно сохраняются значения count и last_date_time по каждому sing(...) запросу.

Но если они не имеют значения, зачем хранить эту информацию в базе данных? Почему бы вам просто не сохранить все это в памяти и признать, что счетчики сброшены, когда сервер аварийно завершает работу и перезагружается? Или, если вам нужно вести учет в целях учета, почему бы вам не писать события «play (id)» в специальный файл журнала и генерировать учетные записи при автономном сканировании журналов.


Кстати, 200 обновлений в секунду не является необоснованным, особенно если таблица мала, и вы сделать некоторые настройки.


я могу позволить себе задержку 4-5 секунд в Updation записей. .... Если сбой сервера, где приложение развернуто, тогда и мы можем поместить некоторую логику .. что-то вроде .... если значение счета равно нулю для конкретного идентификатора воспроизведения ... выберем последний счет из БД и затем увеличим его к одному.

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

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

Большой вопрос ... который вы не ответили ... это имеет ли, если вы не считать некоторых «играет» иногда.

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

Альтернатива (как я уже говорил) - настройка базы данных; например выберите наиболее подходящие типы/индексы базы данных/таблицы и настройте SQL или хранимую процедуру, используемую для обновления. 200 обновлений в секунду не чрезмерно дорого, если вы правильно настроили базу данных.


Если я сталкивался с раствором, в котором мое выступление не влияет много, то obeviously нет.

Если это (действительно) случай, то просто перейдите с подходом «сохранить каждые 5 секунд». Или если вам нужна более высокая производительность «5 минут» или «5 часов».

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

Позвольте мне ставить вопрос по-другому:

«Будет ли это повредить ваш бизнес, если подсчеты были неточны»?

+0

Спасибо за ваш вклад. Давайте обсуждать с учетом того, что 200 обновлений в секунду стоят дорого. Пункт 1: Производительность - моя единственная проблема. Я могу позволить себе задержка в 4-5 секунд при обновлении записей. Пункт 2: Мы будем использовать RAC DB, и мы не допускаем двойную терпимость к ошибкам. Если сервер сбой, где развертывается приложение, тогда мы можем поместить некоторую логику .. что-то вроде .... если значение счета равно нулю для конкретного идентификатора воспроизведения ... выберем последний счет из БД и затем увеличим его до единицы. – VJS

+0

Мы сохраняем эту информацию в базе данных, потому что по этим записям нам нужно забирать записи, например, сколько игрового идентификатора играли за этот штамп времени (что-то). 200 обновлений в секунду countinuesly ... не думаете, что он будет делать ставки на производительность на моей существующей системе ....... – VJS

+0

'Большой вопрос ... на который вы не ответили ...имеет ли значение, если вы иногда не считаете какие-то «пьесы». « Если я столкнулся с решением, в котором мое выступление не сильно повлияло, то с трудом не будет. – VJS

3

Ну, вы можете поразить свой дБ 200 раз в секунду или более, но в вашем сценарии здесь это не нужно. Вместо этого создайте синхронизированный счетчик в памяти (например, одноэлементный класс с атомным целым числом), который увеличивается при каждом воспроизведении песни, а затем обновляет значение счета в db каждые 30 секунд или что-то в этом роде. Я действительно сделал что-то похожее на это, он отлично работает.Просто убедитесь, что у вас есть один экземпляр счетчика класса для счетной сущности (песня, которую я думаю здесь), и что приращение значения счетчика является потокобезопасным (атомное целое должно позаботиться об этом)

+1

Да, я бы рекомендовал этот подход при условии, что сообщения не будут обновляться с перерывами. Также он может поместить некоторую логику кэширования, чтобы компенсировать использование памяти. – Nrj

+0

Выполнение кеша - отличное предложение, особенно если такое поведение необходимо во многих местах, и ручное кодирование потребует много времени. EhCache имеет простой простой API, который может помочь вам в этом: http://ehcache.org/documentation/user-guide/getting-started –

+0

Хорошо, спасибо, но у меня нет большого опыта .... я в своем обучении stage .... не могли бы вы дать мне 4-5 строк обзор кеша ... как он может решить мою проблему простыми словами ..... просто обзор ... так, что как только я прочитаю документ ... я смогу это получить ... Было бы замечательно ... – VJS

Смежные вопросы