инвалидация кэша что это

Инвалидация кеша в РСУБД

инвалидация кэша что это. инвалидация кэша что это фото. картинка инвалидация кэша что это. смотреть фото инвалидация кэша что это. смотреть картинку инвалидация кэша что это.

не намного быстрее, чем сам запрос по ключу

Триггеры вполне работоспособны, если не отсылать слишком далеко и синхронно.

Ещё за много денег у оракля есть goldengate, парсящий его логи для залития изменения в другие места — может оно умеет в не-БД,

А ещё некоторые говорят, что архитектор засунул БД в систему слишком глубоко, и её полезно оттуда выковырять на периферию.

инвалидация кэша что это. инвалидация кэша что это фото. картинка инвалидация кэша что это. смотреть фото инвалидация кэша что это. смотреть картинку инвалидация кэша что это.

У постгреса есть LISTEN/NOTIFY, который работает асинхронно. Насколько мне известно, универсального решения нет, все варианты СУБД-специфичны

инвалидация кэша что это. инвалидация кэша что это фото. картинка инвалидация кэша что это. смотреть фото инвалидация кэша что это. смотреть картинку инвалидация кэша что это.

Печально, что сказать.

Можешь поменять архитектуру и сделать

source of truth (именно их писать в какую-нибудь базу, хоть постгрес, но можно и что-то специфичное), и отдельными сервисами — строить кэш и писать в твой постгрес/оракл для репортов, в лучших традициях event sourcing. Минусы: это — заметно менее гибкая архитектура с уймой подводных камней и требует понимания domain, с которым работаешь. Плюсы: любое изменение рано или поздно дойдёт и до БД, и до кэша и ты можешь управлять консистентностью и того, и другого. По сути РСУБД становится ещё одним как-бы-кэшем и твоему приложению становится фиолетово, что там в РСУБД поменялось.

инвалидация кэша что это. инвалидация кэша что это фото. картинка инвалидация кэша что это. смотреть фото инвалидация кэша что это. смотреть картинку инвалидация кэша что это.

инвалидация кэша что это. инвалидация кэша что это фото. картинка инвалидация кэша что это. смотреть фото инвалидация кэша что это. смотреть картинку инвалидация кэша что это.

А как выглядит исходная задача? Может таки эти уведомления стоит вытягивать с уровня СУБД на уровень выше?

инвалидация кэша что это. инвалидация кэша что это фото. картинка инвалидация кэша что это. смотреть фото инвалидация кэша что это. смотреть картинку инвалидация кэша что это.

Да всё банально. Есть таблица в бд, есть приложение которое тянет оттуда данные себе и кеширует. Конечно, бд лучше не дёргать лишний раз и надо какой-то механизм, чтобы по-быстрому узнать изменились наши данные или нет.
Как сделать вариантов на самом деле масса нужен какой-то универсальный механизм, но не уведомления, т.к. это слишком жирно (20 клиентов, 1м записей = 20м уведомлений. Уууу.)

Может таки эти уведомления стоит вытягивать с уровня СУБД на уровень выше?

Если уведомления, то это надо или триггеры, которые будут впадать в бешенство, когда кто-то будет заливать много или событие выставлять в апи (перед заливкой, например) а это сложно, тут уже много чего написано от этого уже голова начинает болеть, а я еще даже не думал, как это можно сделать.
В идеале что-то должно записываться в inmemory таблицу, откуда уже все кому надо читают, но это как-то внутри субд должно всё быть в виде какого-нибудь b-tree индекса. Можно конечно и сколхозить, но, опять же, надо триггеры везде выставлять руками и т.д.

инвалидация кэша что это. инвалидация кэша что это фото. картинка инвалидация кэша что это. смотреть фото инвалидация кэша что это. смотреть картинку инвалидация кэша что это.

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

просто факт изменения таблицы? как вариант можно затолкать таймштампу последнего изменения в какой-нибудь in-memory cache (тот же redis или memcached). и обновлять при инсерте (лучше не триггером, а бэкендом)

инвалидация кэша что это. инвалидация кэша что это фото. картинка инвалидация кэша что это. смотреть фото инвалидация кэша что это. смотреть картинку инвалидация кэша что это.

Ты про кешу процессора или про какую то ещё?

Если оно под онтопиком, то поидее можно штатный prof использовать или lttng. Кстати, если модуль который отвечает за эту самую инвалидацию нативный, не пострипанный и инструментированный то с помощью lttng о5 же можно вести лог вызова функций которые эту самую инвалидацию производят.

инвалидация кэша что это. инвалидация кэша что это фото. картинка инвалидация кэша что это. смотреть фото инвалидация кэша что это. смотреть картинку инвалидация кэша что это.

По-сути вы пытаетесь решить задачу обеспечения когерентности кэшей на клиентской стороне.

У меня для вас плохие новости, потому что это примерно = https://ru.wikipedia.org/wiki/MOESI

1. VersionVerify+Retry. Обновляющие запросы к БД реализуется через хранимки, которые одним из параметров получают версию закэшированных на клиенте данных. Соответственно хранимка проверяет и просит перечитать/повторить если клиентский кэш протух. Идея думаю понятна, а вариаций может быть масса.

2. Уведомления, но по мотивам MOESI/MESI (уведомления отправляются только когда у клиента в кэше есть обновляемая строка). Велосипедить достаточно сложно, но иногда вполне приемлемо. Из готового наверное http://www.alachisoft.com/ncache/ Ну и в богомезском ASP.NET что-то подобное вроде-бы было.

инвалидация кэша что это. инвалидация кэша что это фото. картинка инвалидация кэша что это. смотреть фото инвалидация кэша что это. смотреть картинку инвалидация кэша что это.

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

инвалидация кэша что это. инвалидация кэша что это фото. картинка инвалидация кэша что это. смотреть фото инвалидация кэша что это. смотреть картинку инвалидация кэша что это.

инвалидация кэша что это. инвалидация кэша что это фото. картинка инвалидация кэша что это. смотреть фото инвалидация кэша что это. смотреть картинку инвалидация кэша что это.

Там миллион записей, кто-то изменит одну не нужную => весь кеш невалидный.

инвалидация кэша что это. инвалидация кэша что это фото. картинка инвалидация кэша что это. смотреть фото инвалидация кэша что это. смотреть картинку инвалидация кэша что это.

Ты про кешу процессора или про какую то ещё?

Да не. База данных и приложение.

инвалидация кэша что это. инвалидация кэша что это фото. картинка инвалидация кэша что это. смотреть фото инвалидация кэша что это. смотреть картинку инвалидация кэша что это.

Дык хэштаблица из OIDов записей и платформозависимый механизм подписки на сообщение от БД? В postgres такое прокатывало.

инвалидация кэша что это. инвалидация кэша что это фото. картинка инвалидация кэша что это. смотреть фото инвалидация кэша что это. смотреть картинку инвалидация кэша что это.

Я прочитал тред и у меня на повестке только одна мысль, что придётся колхозить.

Источник

Кеширование в Laravel: основы плюс tips&tricks

Техника кеширования позволяет создавать более масштабируемые приложения, запоминания результаты некоторых запросов в быстрое in-memory хранилище. Однако, некорректно реализованное кеширование может сильно ухудшить впечатление пользователя о вашем приложении. Эта статья содержит некоторые базовые понятия о кешировании, различные правила и табу, которые я извлек из нескольких прошлых своих проектов.

Не используйте кеширование.

Ваш проект работает быстро и не имеет никаких проблем с производительностью?
Забудьте о кешировании. Серьезно 🙂

Оно сильно усложнит операции чтения из базы без каких-либо бенефитов.

Правда, Мохамед Саид в начале этой статьи делает некоторые вычисления и доказывает, что в некоторых случаях оптимизация приложения на миллисекунды способна сэкономить кучу денег на вашем AWS счету. Так что, если прогнозируемая экономия на вашем проекте больше, чем 1.86 долларов, возможно, реализация кеширования — неплохая идея.

Как это работает?

инвалидация кэша что это. инвалидация кэша что это фото. картинка инвалидация кэша что это. смотреть фото инвалидация кэша что это. смотреть картинку инвалидация кэша что это.

Сохранять это значение в кеше навсегда не самая лучшая идея, поскольку эту сущность Post могут обновить, но приложение всегда будет получать старое, закешированное, значение.
Поэтому функции кеширования обычно спрашивают какое время это значение хранить.

После истечения этого времени memcache или redis «забудут» про него и приложение возьмет свежее значение из базы.

Здесь я кладу сущность Post в кеш на 15 минут (начиная с версии 5.8 laravel использует секунды в этом параметре, раньше там были минуты). Фасад Cache также имеет удобный метод remember для этого случая. Этот код делает ровно тоже самое, что и предыдущий:

В документации Laravel есть глава Cache, которая обьясняет как установить необходимые драйверы для вашего приложения и главный функционал.

Данные в кеше

Все стандартные драйверы Laravel хранят данные как строки. Когда мы просим сохранить в кеше экземпляр модели Eloquent, оно использует функцию serialize, чтобы получить строку из обьекта. Функция unserialize восстанавливает состояние обьекта когда мы получаем его из кеша.

Почти любые данные могут быть закешированы. Числа, строки, массивы, обьекты (если они умеют корректно сериализоваться, смотрите описания функций по ссылкам ранее).

Сущности Eloquent и коллекции легко могут быть закешированы и являются самыми популярными значениями в кеше приложений Laravel. Однако, использование других типов тоже практикуется довольно широко. Метод Cache::increment популярен для реализации различных счетчиков. Также, атомарные локи весьма полезны когда разработчики сражаются с race conditions.

Что кешировать?

Первые кандидаты на кеширование — это запросы, которые выполняются очень часто, но их план выполнения не самый простой. Лучший пример — top-5 статей на главной странице, или последние новости. Кеширование таких значений способно сильно улучшить производительность главной страницы.

Инвалидация кеша

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

События Eloquent могут помочь, или если ваше приложение генерит специальные события, такие как PostPublished или UserBanned это может быть еще проще. Пример с событиями Eloquent. Сначала надо создать классы событий. Для удобства я буду использовать абстрактный класс для них:

Разумеется, по PSR-4, каждый класс должен лежать в своем файле. Настраиваем Post Eloquent класс (используя документацию):

Создаем слушатель этих событий:

Этот код будет удалять закешированные значения после каждого обновления или удаления сущностей Post. Инвалидация списков сущностей, таких как top-5 статей или последних новостей, будет чуток посложнее. Я видел три стратегии:

Стратегия «Не инвалидируем»

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

Стратегия «Найти и обезвредить»

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

Выглядит уродливо, зато работает.

Стратегия «хранить id»

Инвалидация кеша не зря названа одной из двух трудностей в програмировании и весьма трудно в некоторых случаях.

Кеширование отношений

Кеширование сущностей с отношениями требует повышенного внимания.

Первый запрос был закеширован, а второй — нет. Когда драйвер кеша записывает Post в кеш, comments еще не загружены. Если мы хотим кешировать и их тоже, то мы должны загрузить их вручную:

Теперь кешируются оба запроса, но мы должны инвалидировать значения ‘post_’.$id каждый раз когда добавляется комментарий. Это не очень эффективно, поэтому лучше хранить кеш комментариев отдельно:

Иногда сущность и отношение сильно связаны друг с другом и всегда используются вместе (заказ с деталями, публикация с переводом на нужный язык). В этом случае хранить их в одном кеше вполне нормально.

Single source of truth для ключей кеширования

Время жизни ключей также можно вынести в константы, ради лучшей читаемости. Эти 900 или 15*60 увеличивают когнитивную нагрузку при чтении кода.

Не используйте кеш в операциях записи

Пожалуйста, не делайте так. Значение в кеше может быть устаревшим, даже если инвалидация сделана корректно. Небольшой race condition и публикация потеряет изменения, сделанные другим пользователем. Оптимистические блокировки помогут хотя бы не потерять изменения, но количество ошибочных запросов может сильно возрасти.

Лучшее решение — использовать абсолютно разную логику выборки сущностей для операций чтения и записи (привет, CQRS). В операциях записи всегда нужно выбирать свежее значение из базы данных. И не забывать о блокировках (оптимистичных или пессимистичных) для важных данных.

Я думаю, это достаточно для вводной статьи. Кеширование весьма сложная и пространная тема, с ловушками для разработчиков, но прирост производительности иногда перевешивает все трудности.

Источник

Каскадная инвалидация кэша. Часть 1

Вот уже несколько лет, как почти каждая статья о передовых подходах к кэшированию рекомендует пользоваться в продакшне следующими методиками:

инвалидация кэша что это. инвалидация кэша что это фото. картинка инвалидация кэша что это. смотреть фото инвалидация кэша что это. смотреть картинку инвалидация кэша что это.

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

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

Эксперты в сфере производительности веб-проектов, кроме того, рекомендуют пользоваться методиками разделения кода. Эти методики позволяют разбивать JavaScript-код на отдельные бандлы. Такие бандлы могут быть загружены браузером параллельно, или даже лишь тогда, когда в них возникнет необходимость, по запросу браузера.
Одним из многих преимуществ разделения кода, в частности, имеющих отношение к передовым методикам кэширования, называют то, что изменения, внесённые в отдельный файл с исходным кодом, не приводят к инвалидации кэша всего бандла. Другими словами, если для npm-пакета, созданного разработчиком «X», вышло обновление безопасности, и при этом содержимое node_modules разбито на фрагменты по разработчикам, то изменить придётся только фрагмент, содержащий пакеты, созданные «X».
Проблема тут заключается в том, что если всё это скомбинировать, то подобное редко приводит к повышению эффективности долговременного кэширования данных.
На практике изменения одного из файлов исходного кода почти всегда приводят к инвалидации более чем одного выходного файла системы сборки пакетов. И это происходит именно из-за того, что к именам файлов были добавлены хэши, отражающие версии содержимого этих файлов.

Проблема, касающаяся версионирования имён файлов

инвалидация кэша что это. инвалидация кэша что это фото. картинка инвалидация кэша что это. смотреть фото инвалидация кэша что это. смотреть картинку инвалидация кэша что это.

import <. >from ‘/vendor-5e6f.mjs’;

-import <. >from ‘/vendor-5e6f.mjs’; +import <. >from ‘/vendor-d4a1.mjs’;

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

инвалидация кэша что это. инвалидация кэша что это фото. картинка инвалидация кэша что это. смотреть фото инвалидация кэша что это. смотреть картинку инвалидация кэша что это.

Модули в дереве зависимостей, на которые повлияло единственное изменение в коде одного из листовых узлов дерева
Из этого примера видно, как небольшое изменение кода, сделанное всего лишь в одном файле, привело к инвалидации кэша 80% фрагментов бандла.
Хотя и правда то, что не все изменения приводят к столь печальным последствиям (например, инвалидация кэша листового узла приводит к инвалидации кэша всех узлов вплоть до корневого, но инвалидация кэша корневого узла не вызывает каскадной инвалидации, доходящей до листовых улов), в идеальном мире нам не приходилось бы сталкиваться с любыми ненужными инвалидациями кэша.
Это приводит нас к следующему вопросу: «Можно ли получить преимущества, даваемые иммутабельными ресурсами и долговременным кэшированием, и при этом не страдать от каскадных инвалидаций кэша?».

Подходы к решению проблемы

Рассмотрим эти механизмы.

Подход №1: карты импорта

Карты импорта — это простейшее решение проблемы каскадной инвалидации кэшей. Кроме того, этот механизм легче всего реализовать. Но он, к сожалению, поддерживается лишь в Chrome (эту возможность, к тому же, нужно явным образом включать).
Несмотря на это я хочу начать именно с рассказа о картах импорта, так как уверен в том, что это решение станет в будущем наиболее распространённым. Кроме того, описание работы с картами импорта поможет объяснить и особенности других подходов к решению нашей проблемы.
Использование карт импорта для предотвращения каскадной инвалидации кэша состоит из трёх шагов.

▍Шаг 1

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

dep1.mjs dep2.mjs dep3.mjs main.mjs vendor.mjs

Команды импорта в соответствующих модулях тоже не будут включать в себя хэши:

import <. >from ‘/vendor.mjs’;

▍Шаг 2

Нужно воспользоваться инструментом, наподобие rev-hash, и сгенерировать с его помощью копию каждого файла, к имени которого добавлен хэш, указывающий на версию его содержимого.
После того, как эта часть работы выполнена, содержимое выходной директории должно будет выглядеть примерно так, как показано ниже (обратите внимание на то, что там теперь присутствует по два варианта каждого файла):

dep1-b2c3.mjs», dep1.mjs dep2-3c4d.mjs», dep2.mjs dep3-d4e5.mjs», dep3.mjs main-1a2b.mjs», main.mjs vendor-5e6f.mjs», vendor.mjs

▍Шаг 3

Нужно создать JSON-объект, хранящий сведения о соответствии каждого файла, в имени которого нет хэша, каждому файлу, в имени которого хэш есть. Этот объект нужно добавить в HTML-шаблоны.
Этот JSON-объект и является картой импорта. Вот как он может выглядеть:

Источник

Каскадная инвалидация кэша. Часть 1

Вот уже несколько лет, как почти каждая статья о передовых подходах к кэшированию рекомендует пользоваться в продакшне следующими методиками:

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

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

Эксперты в сфере производительности веб-проектов, кроме того, рекомендуют пользоваться методиками разделения кода. Эти методики позволяют разбивать JavaScript-код на отдельные бандлы. Такие бандлы могут быть загружены браузером параллельно, или даже лишь тогда, когда в них возникнет необходимость, по запросу браузера.

Одним из многих преимуществ разделения кода, в частности, имеющих отношение к передовым методикам кэширования, называют то, что изменения, внесённые в отдельный файл с исходным кодом, не приводят к инвалидации кэша всего бандла. Другими словами, если для npm-пакета, созданного разработчиком «X», вышло обновление безопасности, и при этом содержимое node_modules разбито на фрагменты по разработчикам, то изменить придётся только фрагмент, содержащий пакеты, созданные «X».

Проблема тут заключается в том, что если всё это скомбинировать, то подобное редко приводит к повышению эффективности долговременного кэширования данных.

На практике изменения одного из файлов исходного кода почти всегда приводят к инвалидации более чем одного выходного файла системы сборки пакетов. И это происходит именно из-за того, что к именам файлов были добавлены хэши, отражающие версии содержимого этих файлов.

Проблема, касающаяся версионирования имён файлов

Представьте, что вы создали и развернули веб-сайт. Вы воспользовались разделением кода, в результате большая часть JavaScript-кода вашего сайта загружается по запросу.

инвалидация кэша что это. инвалидация кэша что это фото. картинка инвалидация кэша что это. смотреть фото инвалидация кэша что это. смотреть картинку инвалидация кэша что это.

Типичное дерево зависимостей JavaScript-модуля

И наконец, так как содержимое файла main изменилось, имя этого файла тоже должно будет измениться.

Вот как теперь будет выглядеть диаграмма зависимостей.

инвалидация кэша что это. инвалидация кэша что это фото. картинка инвалидация кэша что это. смотреть фото инвалидация кэша что это. смотреть картинку инвалидация кэша что это.

Модули в дереве зависимостей, на которые повлияло единственное изменение в коде одного из листовых узлов дерева

Из этого примера видно, как небольшое изменение кода, сделанное всего лишь в одном файле, привело к инвалидации кэша 80% фрагментов бандла.

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

Это приводит нас к следующему вопросу: «Можно ли получить преимущества, даваемые иммутабельными ресурсами и долговременным кэшированием, и при этом не страдать от каскадных инвалидаций кэша?».

Подходы к решению проблемы

Проблема, касающаяся хэшей содержимого файлов, находящихся в именах файлов, с технической точки зрения, заключается не в том, что хэши находятся в именах. Она заключается в том, что эти хэши появляются и внутри других файлов. В результате кэш этих файлов инвалидируется при изменении хэшей в именах файлов, от которых они зависят.

Как оказалось, существует несколько способов достижения этой цели:

Подход №1: карты импорта

Карты импорта — это простейшее решение проблемы каскадной инвалидации кэшей. Кроме того, этот механизм легче всего реализовать. Но он, к сожалению, поддерживается лишь в Chrome (эту возможность, к тому же, нужно явным образом включать).

Несмотря на это я хочу начать именно с рассказа о картах импорта, так как уверен в том, что это решение станет в будущем наиболее распространённым. Кроме того, описание работы с картами импорта поможет объяснить и особенности других подходов к решению нашей проблемы.

Использование карт импорта для предотвращения каскадной инвалидации кэша состоит из трёх шагов.

▍Шаг 1

Нужно настроить бандлер так, чтобы он, при сборке проекта, не включал бы хэши содержимого файлов в их имена.

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

Команды импорта в соответствующих модулях тоже не будут включать в себя хэши:

▍Шаг 2

Нужно воспользоваться инструментом, наподобие rev-hash, и сгенерировать с его помощью копию каждого файла, к имени которого добавлен хэш, указывающий на версию его содержимого.
После того, как эта часть работы выполнена, содержимое выходной директории должно будет выглядеть примерно так, как показано ниже (обратите внимание на то, что там теперь присутствует по два варианта каждого файла):

▍Шаг 3

Нужно создать JSON-объект, хранящий сведения о соответствии каждого файла, в имени которого нет хэша, каждому файлу, в имени которого хэш есть. Этот объект нужно добавить в HTML-шаблоны.

Этот JSON-объект и является картой импорта. Вот как он может выглядеть:

После этого всякий раз, когда браузер увидит команду импорта файла, находящегося по адресу, соответствующему одному из ключей карты импорта, браузер импортирует тот файл, который соответствует значению ключа.

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

Возможно, вы сейчас задаётесь вопросом о том, почему я создал копию каждого файла вместо того, чтобы просто файлы переименовать. Это нужно для поддержки браузеров, которые не могут работать с картами импорта. В предыдущем примере подобные браузеры увидят лишь файл /vendor.mjs и просто загрузят этот файл, поступив так, как обычно поступают, встречая подобные конструкции. В результате и оказывается, что на сервере должны существовать оба файла.

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

Уважаемые читатели! Знакома ли вам проблема каскадной инвалидации кэша?

Источник

Инвалидация кэша что это

@tadatuta: сборка бандла технологии инвалидируется по суффиксам, от которых она зависит.

@tadatuta: в данном случае есть «обычная» зависимость от js и browser.js — изменение блоков в этих технологиях инвалидирует сборку бандла. плюс по depsByTech есть зависимость от bemhtml. и изменение блоков в технологии bemhtml сейчас пересборку не вызывает, поэтому приходится передавать force явно.

@zxqfox: очень часто слова хак и depsByTech встречаются рядом.

@tadatuta: так и есть. полноценную реализацию, которую начали делать в рамках bem-tools@v1 так и не довели до конца 🙁

@veged: дело не столько в depsByTech сколько в сшивании двух технологий в один файл и инвалидации кешей

@zxqfox: Честно говоря, проблема здесь не в бэме или технологиях, а в его конкретной реализации/оптимизациях.

@zxqfox: Насколько я помню, там сейчас есть небезбажный монолит APW. Это он о протухшем кеше не знает?

@veged: APW это абстрактная очень штука, она сама по себе ни о чём таком не может ни знать ни не знать — но да, это уже оффтопик

Хочется понять, что надо сделать, чтобы этой проблемы не было.

На мой взгляд вариантов два:

У кого-то еще есть желание что-то с этим сделать?

нужно всё нормально запрограммировать 😉 можно сделать это в bem-tools, вот только у нас рук нет 🙁

Нормально запрограммировать это как кнопка «сделать отличное нечто».

В свое время с архитектурой бем-тулзов я разбирался с неделю, и это были только поверхностные изыскания. В enb даж не знаю стоит ли лезть. Хотелось бы понять что конкретно делать-то надо. Обсуждалось же не раз, если я правильно понял. Может где-то что-то есть что почитать как это предполагалось сделать.

Есть еще такой момент, что часть людей переехало на enb, и с разработкой самих тулзов непонятки. Вот и непонятно теперь куда движемся.

не переживай, ничего особо конкретного не наобсуждалось 😉

@veged Окей, тогда у меня вопрос по сборщику, никто еще не начал?

@tadatuta Ой. Спасибо за подробности. Весьма кстати 😉

@veged @tadatuta Выложу свои мысли.

@zxqfox, сейчас активную разработку на ENB ведет @andrewblond. его стараниями появилась целая куча модулей: https://github.com/enb-bem так что задавай вопросы, форум он читает. ну и более хардкорные варианты тоже можно обсуждать с ним — он сейчас самый погруженный в контекст сборки участник команды.

@tadatuta я наверное не туда пишу, но пока везде молчит 😉

В общем, у меня такое ощущение, что:

Насколько я понимаю, енб-технологии от предполагаемых процессоров и тасков отличаются именно тем, что технологии, как бесспорно неплохое решение, решают немного другую задачу — они запускаются последовательно и делают что-то, теряется связь и тонкая настройка самого важного — бем-знаний об объектах. Я предлагаю его вынести за скобку в хранилище, или еще куда-то.

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

В такой схеме deps вполе легко вклинивается и используется дирижером, как task, или даже без напрямую. Равно как и levels.

p.s. Возможно, это похоже на небольшой рефакторинг enb.

если вы хотите задать вопрос команде, то ставьте еще и метку asktheteam 😉 спасибо!

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *