CoverCouch 0.1
Feb. 1st, 2015 07:05 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
https://github.com/ermouth/covercouch – пре-бета, raw and dirty. Попробовал выложить на npm, но что-то там не гладко, сделал unpublish. Через гит клон норм всё взлетает.
Теперь надо всё это в модуль превратить, чтоб можно было как express.js middleware включать, ну и демо написать совмещённое с полным тест-сьютом по всему CouchDB API.
10 дней, ~1500 строк, заимплементил практически все фичи, что задумал.
Придумался интересный подход, который я никогда до этого явно не применял. CoverCouch в зависимости от типа запроса и входных параметров выбирает одну из двух стратегий – fetch/resend или pipe.
Fetch/resend – это когда делается запрос к базе с переданными параметрами, выгребается JSON-ответ целиком, парсится, фильтруется и отдаётся пользователю уже только то, что он имеет право видеть.
Pipe – это когда делается запрос к базе, но её ответ не собирается целиком, а сразу перекидывается клиенту. Прямо чанками-кусочками, которыми отдаёт ответ CouchDB, просто часть этих кусочков по пути фильтруется и до пользователя не доходит.
Обычно в одном проекте я использовал какой-то один подход. Тут нужны оба.
Пайп нужен потому, что к CouchDB можно запросто сформировать запрос, который отдаст, например, гигабайт данных. Разбирать гигабайтный JSON – занятие в бою неосмотрительное как минимум. Ну плюс есть long-poll запросы – например, push-уведомления клиенту, что данные обновились. Их просто не сделать без пайпа вообще.
Fetch/resend хорош, когда запрос потенциально небольшой и не требует пайпа. Проверка всех айтемов сразу становится синхронной (без лишних длинных цепочек коллбэков, как с пайпом) и ответ можно отдать хорошо упакованным. Ну и ответ гораздо меньше фрагментирован, чем исходный ответ CouchDB.
Кто знаком с XML-технологиями – это в некотором смысле как DOM/XPath и SAX.
В результате этих оптимизаций CoverCouch в большинстве случаев доставляет данные быстрее, а по некоторым типам запросов – кратно быстрее, чем CouchDB. Чисто за счёт свойств сети – просто уменьшается фрагментация и избыточность.
Вообще, всё многопоточное, непадучее (а при падении – рестартует), защищено от утечек памяти, от over capacity, ну и всякое такое. С прицелом на боевое использование, не просто побаловаться делал.
Надо вот сделать, чтобы reduce нормально работал. Это геморройно, но понятно, как.
Такие дела.
no subject
Date: 2015-02-01 05:36 pm (UTC)no subject
Date: 2015-02-01 06:02 pm (UTC)И потом, я бы не сказал, что прямо напрягаюсь – меня прёт от всех этих дел нереально есчо.
Но если это было предложение, то да, можно как-нибудь таки пересечься – года три, поди, не виделись.