This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2017-07-05
Channels
- # bangalore-clj (1)
- # beginners (50)
- # boot (72)
- # cider (53)
- # cljs-dev (303)
- # cljsrn (2)
- # clojure (403)
- # clojure-conj (3)
- # clojure-dev (7)
- # clojure-italy (18)
- # clojure-russia (129)
- # clojure-sg (1)
- # clojure-spec (44)
- # clojure-uk (25)
- # clojurescript (112)
- # core-async (4)
- # core-typed (3)
- # cursive (23)
- # datomic (114)
- # defnpodcast (1)
- # emacs (1)
- # figwheel (2)
- # graphql (18)
- # hoplon (110)
- # instaparse (6)
- # jobs (3)
- # jobs-discuss (10)
- # leiningen (5)
- # luminus (1)
- # lumo (151)
- # off-topic (22)
- # om (3)
- # om-next (3)
- # onyx (4)
- # parinfer (1)
- # pedestal (8)
- # precept (51)
- # re-frame (19)
- # reagent (3)
- # ring (1)
- # ring-swagger (5)
- # spacemacs (21)
- # sql (25)
- # test-check (2)
- # uncomplicate (8)
- # unrepl (33)
- # untangled (20)
- # yada (14)
это подхачка "поверх" https://github.com/tonsky/rum/blob/gh-pages/src/rum/core.clj#L203 https://github.com/tonsky/rum/blob/gh-pages/src/rum/derived_atom.cljc чтобы можно было: 1) выставлять эквалити чек не только на выходе, но и на входе; 2) дерайвить не только от рефа, но и от значения внутри рефа по пути (хотя это можно сделать в клиентской функции, но тогда не получится делать экволити чек по этому значению, потому что предыдущая версия значения недоступна)
конкретнее: 1) как можно кошернее if vector?
сделать, и 2) есть ли смысл ref-watch
и path-watch
объединить?
пытаюсь себе архитектуру заново выстроить и что-то пока не выходит каменный цветочек 😞
@asolovyov muse только для чтения/фетча, как и все подобные библиотеки
@roman01la а вы на фронте muse не юзаете?
так кеш per request, он и так дропается. Или у вас обновление данных во время чтения происходит?
@gsnewmark ну я ваще пошёл за уранией и там кэш ты сам делаешь )
не, свое
а на сервере ми делаем один muse record на запрос от клиента, кеш получается только в контексте определенного запроса
с уранией оч красиво складывается, если кэш юзать не один на реквест, а если юзать на реквест, то мне оно ваще совершенно бесполезно ))
легко, раз в минуту делаем запрос 😃
типа один и тот же запрос не повторяется чаще, чем раз в минуту, а иначе - повторяется?
да, по таймауту
херня, что никакая либа не пытается решить проблему не только с фетчем, но и апдейтом
у нас 60 сек вроде везде + батч запросы
типа если я сходил за чем-то на сервер, то для этого явно больше 60 сек ждать не нужно
ну в смысле юзкейс, я вообще пытаюсь заново придумать архитектуру приложения. Вот оно открылось, ты ходишь по страницам - и какие-то данные качаются, а существующие - нет
Вот попробовал через кэш урании - ну ничо, клево выходит, типа ты всегда делаешь запросы, но к серверу они идут только если их нет в кэше. Но стратегии инвалидации нет аще 🙂
пошёл почитал доки рефрейма, там такой же бесполезный хлам, как у меня, ток больше церемонии
в смысле вот она и не подходит, хотя было бы неплохо придумать, как к ней это присобачить
сделать инвалидатор руками, типа "а тут мы изменили товар номер 666, пожалуй инвалидируй его"
если только это не рест, который по глаголу теоретические может понять какой ресурс обновился
а, кстати, есть вторая проблема - урания, выходит, только про те данные, что пришли с сервера
а те, что у меня клиентские, типа "я щас редактирую товар номер такой-то, покажи мне форму", нужно хранить пока что непонятно где, но не рядом с ней
индид, но я себе пока что вот такую штуку сделал:
(rum/defcs Node
< (data/mixin :node #(data/->Node %))
где data/->Node - это ураниевская хрень. Этот миксин выполняет запрос (с накапливающимся кэшем) и ложит результаты в атом под названием :nodeно тогда мне надо эти DataSource'ы иметь те, которые ходят на сервер, и те, которые ходят к данным приложения
1) тяжело оптимизировать скорость 2) нетривиальные действия тотальный ад, типа с файлами даже не пытайся, грузи где-то параллельно
ну т.е. у тебя клиент получает клёвую тему - можно сразу все данные за 1 запрос получить
@asolovyov ну ты знаешь про naming & cache invalidation - @tonsky исследование делал - видел?
Я тоже об этом немного думал - нужно чтобы все было версионированно - желательно сквозным счетчиком
по сути это задача - репликации стэйта (в базах данных и распределенных системах более менее проработана)
есть вариант - кэшируешь с ревизией - кидаешь запрос передавая ревизию - если ничего не поменялось - тебе говорят с сервера - можешь свой кэш использовать - типа грузить не нада
ну а вот как определить “что ничего не поменялось” - для какогонить сложного запроса например - в общем виде скорее всего не разрешимо
Тут нужно придумать разумные ограничения на подписки и дизайн - тогда можно двигаться 🙂
предположим, у нас есть даталоговский квери. мы хотим на него “подписаться“. по-нормальному реактивным datalog делать никто не умеет. но мы умеем решать задачу достаточно эффективно , если запрос достаточно простой (нету сложных рулов, тока штуки вида [?e ?a ?v …]). Делая квери, мы строим набор “паттернов” [e a v] где на каждом месте стоит либо сет, либо константа, либо вайлдкард. эти паттерны мы индексируем, чтобы потом всю новелти через них прогонять. как только новый датом подходит под какой-либо паттерн, мы перевыполняем квери. posh умеет делать нечто вроде такого, тока как-то более умно. мы не разобрались как оно работает, поэтому не пользуемся. вот как сказать “что ничего ТОЧНО не поменялось” можно без особых проблем, но с фолс-негативами (иногда пойдешь кверять)
не знаю на сколько такой подход работает на нагруженном сервере, мы так делаем тока на клиенте с датаскриптом.
придется для каждого “реактивного квери” хранить паттерны. если их слишком много разных, процессинг новелти начнет тупить. но так по-моему с любой реактивностью. чем она более универсальная, тем медленнее разбираться кого дернуть.
чета я много написал, и возможно не по теме, но вроде Николай меня че-то про это спрашивал. @nicola
@nicola в связке датаскрипт/датомик - на каждом ки-велью есть номер транзакции – максимальная гранулярность. получать все апдейты можно тупо 1 запросом "давай всё, что там новенького начиная вот с этой транзакции (+ пара фильтров: права доступа, etc.)"
Миша, там засада что в базе все время что-то меняется, датомы все бегут и бегут, и если ты это помножишь на количество подписок да на количество клиентов онлайн может получиться дорого
т.е. каждый клиент не может каждый раз проверять всю novelty на предмет есть ли там что-то для него интересное
всё равно, с таким уровнем гранулярности и ивент логом решение проще что-ли смонстрить, как мне кажется. А как к такой же проблеме подойти, если на бэкэнде и на фронтенде всё в каких-то непонятных полудублированых, шлубоких хешмапах - я даже не представляю