# P13. Noria: частично материализованный потоковый граф для веб-приложений - **Версия и дата проверки:** 1.1, 07.09.2026. - **Статус:** готово к назначению. ## Статья и исходные материалы - **Основная статья:** Jon Gjengset и соавт. — [Noria: Dynamic, Partially-Stateful Data-Flow for High-Performance Web Applications](https://www.usenix.org/conference/osdi18/presentation/gjengset). OSDI 2018. - **Кратко о статье:** Веб-приложениям нужны быстрые чтения производных представлений, но полная материализация всех результатов требует много памяти и усложняет обновления. Noria превращает запросы в потоковый граф, поддерживает результаты инкрементально и хранит состояние только там, где оно нужно текущим чтениям. В проекте сравниваются полная, частичная и отсутствующая материализация на изменяющейся нагрузке. - **Почему результат актуален:** исходный Noria больше не развивается, однако его практическим преемником стал [ReadySet](https://github.com/readysettech/readyset), продолжающий идею инкрементально поддерживаемого кэша SQL-запросов. У ReadySet действует Business Source License 1.1 с переходом указанной версии в открытую лицензию через четыре года; условия нужно проверить перед заимствованием кода. - **Артефакты и данные:** [mit-pdos/noria](https://github.com/mit-pdos/noria) под MIT/Apache-2.0, с сервером, встраиваемым примером, MySQL-интерфейсом и нагрузкой `vote` из статьи. Зафиксированные ревизии: `mit-pdos/noria@465184ee4b57` (MIT/Apache-2.0). - **Что уже предоставляет артефакт:** Noria предоставляет потоковый движок, частичную материализацию, интерфейсы и нагрузку `vote`. Их можно адаптировать для собственного сравнения либо использовать как эталон малого прототипа. ## Обязательный результат - **Проверяемый вопрос или утверждение:** частичная материализация позволяет сохранить быстрые чтения и инкрементальные обновления, расходуя меньше памяти, чем полная материализация результатов всех запросов. - **Технический результат:** Подготовить в Noria или собственном малом потоковом прототипе общий граф операторов с тремя режимами: без материализации, с полной и с частичной материализацией. Реализовать одинаковый генератор обновлений и чтений, автоматическую проверку эквивалентности результатов и учёт занятого и восстановленного состояния. - **Обязательное приращение команды:** Подготовить описанный общий граф с тремя режимами материализации, одинаковыми обновлениями и чтениями и собственной проверкой эквивалентности. Обеспечить сопоставимый учёт памяти и восстановления состояния и объяснить наблюдаемый компромисс. - **Эксперимент:** на локальном стенде или в собственном малом dataflow-прототипе сравнить отсутствие материализации, полную и частичную материализацию для read-heavy нагрузки; измерять задержку чтений и записей, память и стоимость восстановления вытесненного состояния. - **Границы выводов:** компромисс памяти и задержки проверяется на выбранном графе операторов и read-heavy-нагрузке; собственный прототип не подтверждает производительность полной реализации Noria и других классов запросов. - **Ресурсный профиль:** локально, CPU, 8–16 ГБ памяти. Исследовательский код использует старое Rust-окружение; если его сборка блокирует проект, команда независимо реализует ограниченный граф операторов и проверяет тот же механизм на синтетической и веб-нагрузке. ## Содержательные направления - генератор нагрузки и базовые варианты. - граф операторов и материализация. - политика памяти, инструментирование и динамические сценарии. ## Возможное продолжение Динамически добавить запрос, изменить долю популярных ключей, распределить граф между процессами либо предложить другую политику вытеснения и восстановления состояния.