Вот мое понимание некоторых плюсов и минусов двух.
Плюсы для заполнения пн goose
- Никаких дополнительных настроек для кэша (более простая инфраструктура)
- Может глубоко заполнять (заполнять на нескольких уровнях)
- Может заполнять из нескольких баз данных.
- Это простой чистый синтаксис
- Синхронизация не требуется между кэшированием и базой данных, потому что это «единственный» источник правды.
Минусы для заполнения понедельника goose
- База данных работает для каждого заполнения и запроса вместо вашего сервера или слоя кэширования. Если в одном и том же экземпляре много записей, это повлияет на производительность некоторых операций записи, если необходимо пересчитать индекс или выполнить запрос с интенсивным использованием процессора.
- Положитесь на внутреннюю работу базы данных mon goose и базы данных MongoDB.
- Требуется контроль, так как глубокое заполнение может выйти из-под контроля с несколькими уровнями.
Плюсы для кэширования слоя
- Может быть несколько уровней кэширования. Некоторые на сервер и глобальное кеширование.
- Используйте спецификацию c силы механизма кеширования.
- Перенесите часть работы в кеш и, возможно, в базу данных.
Минусы для уровня кэширования
- Необходимо синхронизировать c состояние между кэшем и базой данных
- Больше инфраструктуры.
- Больше кода (если вы хотите чистая абстракция)
В целом, чтобы ответить на ваши подвопросы, 1. Заполнить может быть полезно в некоторых приложениях hight traffi c для чего-то, что не может быть кешировано и должно быть активным или выполненным не очень часто.
Использовать заполнение поверх кэширования проще, меньше инфраструктуры, меньше кода, без синхронизации.
По моему опыту, я бы go для кэширования, потому что это будет быстрее на большой базе данных. При масштабировании базы данных, как правило, требуется больше ресурсов процессора и больше денег. Кэширование с другой стороны обходится дешевле и масштабирует скважины. Кроме того, можно кешировать для каждого экземпляра. т. е. мой сервер имеет локальный кеш, прежде чем ударить удаленный кеш. Это делает производительность очень быстрой, но это может повлиять на производительность сервера в зависимости от хостинга.
Я не нахожусь в большой компании, но наш продукт требует транзакционной информации и фиксированного состояния. Заполнить можно использовать для этого случая, потому что база данных является единственным источником правды, и мы не хотим иметь неправильное состояние. Из-за репликации нашей базы данных, это не единственный источник, но, по крайней мере, мы были бы близки к базе данных. Везде, где мы используем кеширование. У нас есть несколько баз данных и несколько типов баз данных, а кэширование повышает производительность. Наша архитектура, ориентированная на микроуслуги, также много выигрывает от кеширования и гарантирует, что данные не все находятся в одной базе данных, но все еще имеют быстрый доступ.
Да, смешивание - хороший вариант в зависимости от варианта использования. Общий совет будет состоять в том, чтобы понять потенциальную горячую точку и попытаться распределить рабочую нагрузку вокруг, чтобы убедиться, что одна часть инфраструктуры не является узким местом.
Последний совет: В случае сомнений убедитесь, что сохранить интерфейс кода между уровнем данных и уровнем кода. Эта абстракция очень полезна, если нужно использовать ElasticSearch вместо Redis или любого другого сервиса кэширования. Интерфейс кода откладывает необходимость принятия обязательства.
Пример: вместо использования App.populate
непосредственно в фрагменте кода добавление метода getFullApp()
в вашу схему, которая вызывает this.populate()
const AppSchema = new mongoose.Schema({...});
AppSchema.static({
getFullApp(query) {
return this.find(query).populate()
}
})
module.exports = mongoose.model("App", AppSchema);
Если вы хотите избавиться от заполнителя, есть только одно место, чтобы изменить его или избавиться от mon goose getFullApp
- это функция интерфейса вашего кода.