Дилемма проектирования бизнес-уровня: память или ввод-вывод?

Проект, над которым я работаю, сталкивается с дилеммой дизайна: как получить объекты и коллекции объектов из базы данных. Иногда полезно буферизовать * все * объекты из базы данных с их свойствами в память, иногда полезно просто установить идентификатор объекта и запросить его свойства по запросу. (1 вызов на объект для получения всех свойств). И во многих случаях коллекции должны поддерживать как буферизацию объектов в памяти, так и инициализацию с минимальным количеством информации для доступа по запросу. В конце концов, не все можно буферизовать в памяти и не все можно прочитать по запросу. Это повсеместная проблема памяти и ввода-вывода.

Кому-нибудь приходилось сталкиваться с такой же проблемой? Как повлияло на ваш дизайн? Какие тяжелые уроки извлечены? Есть другие мысли и рекомендации?

РЕДАКТИРОВАТЬ: мой проект является классическим примером dll бизнес-уровня, используемого веб-приложением, веб-службами и настольным приложением. Когда для настольного приложения запрашивается список продуктов и отображается только по названию продукта, можно использовать следующую последовательность шагов для отображения всех продуктов (допустим, в базе данных миллион продуктов):
1. Один вызов БД для получения всех названий продуктов
2. Один вызов БД для получения всей информации о продукте, если пользователь нажимает на продукт, чтобы просмотреть подробности (доступ по запросу)

Однако, если этот же API будет использоваться веб-службой для отображения всех продуктов с подробной информацией, сетевой трафик станет болтливым. Лучшая последовательность в этом случае будет:
1. Какого черта, буферизировать все продукты и поля продуктов всего за один вызов базы данных (в этом случае буферизация 1 миллиона продуктов также выглядит пугающей)


person kateroh    schedule 08.02.2011    source источник


Ответы (2)


Это зависит от того, как часто меняются данные. Обычно кэшируются статические и почти статические данные (обычно с окном истечения срока действия кеша).

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

Вы ознакомились с некоторыми доступными технологиями кэширования?

person Mitch Wheat    schedule 08.02.2011
comment
Спасибо за ссылки! Читать статью о Velocity было довольно приятно ... Статические данные уже кэшированы в нашем внутреннем кэше. Другие данные, которые не являются статическими, вообще не кэшируются и даже не считываются полностью в память (доступ к полям осуществляется по запросу, см. Правку). В случае динамических данных сложно решить, следует ли их полностью или частично считать в память. - person kateroh; 08.02.2011

Это не популярная позиция, но избегайте кэширования, если только это не абсолютно необходимо или если вы сразу уверены, что вам понадобится «масштабирование в Интернете». Пытался масштабировать многоуровневый кеш поверх базы данных? Собираетесь ли вы выполнять запись через кеш и только читать или ждать, пока объект LRU запишет изменения? что происходит, когда другой уровень приложений или веб-сервисов располагается поверх БД и получает несогласованные чтения?

Большинство современных баз данных уже имеют кеш и, вероятно, могут реализовать их лучше, чем вы, просто определите, хотите ли вы подключаться к сети БД каждый раз, когда вам что-то нужно. В подавляющем большинстве случаев БД будет работать нормально, и вы сохраните согласованность. О теории BASE и CAP приятно и весело говорить и вообразить, но иногда вы просто не можете превзойти рыночную стоимость простого обращения к старой доброй базе данных. Стресс-тест и определение ваших горячих точек, при необходимости консервативно реализуйте свой кеш.

person Jé Queue    schedule 08.02.2011
comment
Спасибо за совет. исходная проблема заключается не только в кешировании и обращениях к базе данных (в проекте уже есть кеш для менее часто меняющихся объектов). это также вопрос о том, должны ли методы get-all считывать все данные в память вместо того, чтобы просто получать минимум данных и возвращать остальные по запросу (также меньше шансов на то, что данные устарели) - person kateroh; 08.02.2011
comment
@kateroh - Вы снова возвращаетесь к той же проблеме с кешем, которая заключается в том, что все может быть хорошо, если вы ВСЕГДА просматриваете кеш. Если есть другие уровни, которые делают надежные данные без недействительности кеша, вы получите противоречивые результаты. Интернет, который (в основном) не имеет состояния, часто несовместим с транзакционными системами, подобными этой, но меня слишком много раз сжигали из-за несогласованности кеша и накладных расходов на согласованность. - person Jé Queue; 08.02.2011
comment
@kateroh - Лично я ПОЦЕЛУЙ его и при необходимости запроси свою БД. - person Jé Queue; 08.02.2011