Fork me on GitHub
#clojure-russia
<
2017-07-05
>
razum2um05:07:52

небольшой опрос - как часто вы начинаете новый проект aka lein/boot new?

niquola05:07:22

Где-то раз в месяц получается

misha09:07:55

господа, будьте добры, поревьювьте кода:

misha09:07:43

это подхачка "поверх" 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) дерайвить не только от рефа, но и от значения внутри рефа по пути (хотя это можно сделать в клиентской функции, но тогда не получится делать экволити чек по этому значению, потому что предыдущая версия значения недоступна)

misha09:07:15

конкретнее: 1) как можно кошернее if vector? сделать, и 2) есть ли смысл ref-watch и path-watch объединить?

niquola09:07:18

Кто делал на clj http 2 streaming?

akond12:07:42

@nicola у нас не так давно была сессия про рефрейм

akond12:07:10

докладчик собирался написать статью про то, как они его готовят.

akond12:07:39

он таки написал её? ты не в курсе?

asolovyov12:07:09

привет! а никто тут не пытался использовать muse или urania?

asolovyov12:07:13

пытаюсь себе архитектуру заново выстроить и что-то пока не выходит каменный цветочек 😞

akond13:07:42

я видел тестовое задание чье-то в аттендифай на muse

asolovyov13:07:02

это Игорь писал, и там только фетч, и мы с ним вживую уже говорили

asolovyov13:07:05

мы вместе работаем сейчас 🙂

akond13:07:12

а, ну да )

asolovyov13:07:32

там трабла в том, что и muse, и urania дают историю про фетч

asolovyov13:07:51

но непонятно, что делать, когда тебе надо отправить данные

asolovyov13:07:55

а еще лучше - тебе надо поменять данные

asolovyov13:07:04

ты их отправил на сервер, а теперь бы обновить на клиенте, и чо?

asolovyov13:07:08

в кэше херня )

akond13:07:44

может спросить у автора muse? )

akond13:07:12

он там не сильно далеко от вас сидит

gsnewmark13:07:23

@asolovyov muse только для чтения/фетча, как и все подобные библиотеки

asolovyov13:07:35

логично, но что делать, когда надо обновить? Кэш ему дропать?

asolovyov13:07:50

@akond мож, но вдруг кто-нить тут уже игрался и с подобными проблемами сталкивался

asolovyov13:07:59

@roman01la а вы на фронте muse не юзаете?

gsnewmark13:07:17

так кеш per request, он и так дропается. Или у вас обновление данных во время чтения происходит?

asolovyov13:07:53

а чо у вас на фронте?

asolovyov13:07:57

просто руками xhr?

asolovyov13:07:35

@gsnewmark ну я ваще пошёл за уранией и там кэш ты сам делаешь )

gsnewmark13:07:49

недомонады поверх core.async у нас на фронте 😄

gsnewmark13:07:45

а на сервере ми делаем один muse record на запрос от клиента, кеш получается только в контексте определенного запроса

asolovyov13:07:02

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

asolovyov13:07:57

а как вы определяете, надо ли загружать данные или нет?

asolovyov13:07:14

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

asolovyov13:07:18

потому что меня наша схема не оч радует

Roman Liutikov13:07:51

легко, раз в минуту делаем запрос 😃

asolovyov13:07:09

типа один и тот же запрос не повторяется чаще, чем раз в минуту, а иначе - повторяется?

Roman Liutikov13:07:54

да, по таймауту

asolovyov13:07:23

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

asolovyov13:07:53

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

asolovyov13:07:01

это конечно вообще не цель muse, но всё равно

Roman Liutikov13:07:06

у нас 60 сек вроде везде + батч запросы

asolovyov13:07:22

типа если я сходил за чем-то на сервер, то для этого явно больше 60 сек ждать не нужно

asolovyov13:07:30

я его хочу асап обновить

misha13:07:48

А что за юзкейс-то?

misha13:07:56

А то может и мне надо, а я и не знаю об этом

asolovyov14:07:41

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

asolovyov14:07:16

Вот попробовал через кэш урании - ну ничо, клево выходит, типа ты всегда делаешь запросы, но к серверу они идут только если их нет в кэше. Но стратегии инвалидации нет аще 🙂

asolovyov14:07:20

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

akond14:07:52

а разве урания может знать по какому из запросов инвалидировать что?

asolovyov14:07:06

не может, но это и печаль 🙂

asolovyov14:07:22

в смысле вот она и не подходит, хотя было бы неплохо придумать, как к ней это присобачить

asolovyov14:07:32

ну т.е. теоретиииически я могу это сделать, да?

akond14:07:51

расширить интерфейс её работы с кешом не так сложно.

asolovyov14:07:53

сделать инвалидатор руками, типа "а тут мы изменили товар номер 666, пожалуй инвалидируй его"

asolovyov14:07:00

ну типа того, да

asolovyov14:07:37

это наверное будет какой-то вызов типа (refresh! (->Product 666)), ну и ладно

akond14:07:58

если только это не рест, который по глаголу теоретические может понять какой ресурс обновился

asolovyov14:07:13

я бы на это не завязывался

asolovyov14:07:19

сильно много от сервера тогда требований

asolovyov14:07:25

и, опять же, руки связывает

akond14:07:36

да, это скользкая дорога

asolovyov14:07:53

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

asolovyov14:07:18

а те, что у меня клиентские, типа "я щас редактирую товар номер такой-то, покажи мне форму", нужно хранить пока что непонятно где, но не рядом с ней

asolovyov14:07:28

но тут наверное надо попробовать поделать что-то, чтоб понять, а что нужно-то %)

akond14:07:05

урания это механизм доставки. его конечно же от слоя приложения нужно отделить

akond14:07:18

т.е. не должна ничего знать про то, что выше

akond14:07:34

кстати, а вы у себя с графкюэл не экспериментировали еще?

asolovyov14:07:34

индид, но я себе пока что вот такую штуку сделал:

(rum/defcs Node
  < (data/mixin :node #(data/->Node %))
где data/->Node - это ураниевская хрень. Этот миксин выполняет запрос (с накапливающимся кэшем) и ложит результаты в атом под названием :node

asolovyov14:07:45

и выходит что это у меня фактически DAL

asolovyov14:07:07

но тогда мне надо эти DataSource'ы иметь те, которые ходят на сервер, и те, которые ходят к данным приложения

asolovyov14:07:21

типа, раз уже DAL, то пускай сразу всё?

asolovyov14:07:17

не, с graphql не пробовали

asolovyov14:07:24

но судя по отзывам, с ним не всё хорошо

asolovyov14:07:46

по отзывам окружающих, не интернет

akond14:07:53

понятно, что не всё, но может быть в некоторых ситуациях он даёт выигрыш

asolovyov14:07:10

1) тяжело оптимизировать скорость 2) нетривиальные действия тотальный ад, типа с файлами даже не пытайся, грузи где-то параллельно

asolovyov14:07:35

а меня скорость не просто беспокоит, это один из главных факторов 🙂

akond14:07:52

про скорость не понял.

akond14:07:04

скорость чего?

asolovyov14:07:10

ответов, етц

asolovyov14:07:19

тормозит

asolovyov14:07:31

ну т.е. у тебя клиент получает клёвую тему - можно сразу все данные за 1 запрос получить

asolovyov14:07:45

а что там в базу пойдёт и как это сойдётся вместе - всем пофиг

akond14:07:20

а, в смысле начнут злоупротреблять?

asolovyov14:07:45

в смысле там иногда даже N+1 запросов в базу плохо решается 🙂

akond14:07:11

а кеширование и DAL я бы разделил

asolovyov14:07:26

та похоже шо вариантов нет, но тогда мне с урании толку оч мало

akond14:07:50

но она же очень простой инструмент

akond14:07:13

ты хочешь тулзу которая будет все делать сама?

akond14:07:33

или уже готовый набор тулзеней?

niquola20:07:04

@asolovyov ну ты знаешь про naming & cache invalidation - @tonsky исследование делал - видел?

niquola20:07:50

Я тоже об этом немного думал - нужно чтобы все было версионированно - желательно сквозным счетчиком

niquola20:07:23

Нужен механизм подписок на изменения начиная с какой-то ревизии

niquola20:07:01

по сути это задача - репликации стэйта (в базах данных и распределенных системах более менее проработана)

niquola20:07:07

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

niquola20:07:18

i.e. переносим проблему на сервер

niquola20:07:18

ну а вот как определить “что ничего не поменялось” - для какогонить сложного запроса например - в общем виде скорее всего не разрешимо

niquola20:07:26

Тут нужно придумать разумные ограничения на подписки и дизайн - тогда можно двигаться 🙂

niquola20:07:57

@tonsky @jetzajac может хэнгаут на эту тему сделаем?

jetzajac21:07:50

предположим, у нас есть даталоговский квери. мы хотим на него “подписаться“. по-нормальному реактивным datalog делать никто не умеет. но мы умеем решать задачу достаточно эффективно , если запрос достаточно простой (нету сложных рулов, тока штуки вида [?e ?a ?v …]). Делая квери, мы строим набор “паттернов” [e a v] где на каждом месте стоит либо сет, либо константа, либо вайлдкард. эти паттерны мы индексируем, чтобы потом всю новелти через них прогонять. как только новый датом подходит под какой-либо паттерн, мы перевыполняем квери. posh умеет делать нечто вроде такого, тока как-то более умно. мы не разобрались как оно работает, поэтому не пользуемся. вот как сказать “что ничего ТОЧНО не поменялось” можно без особых проблем, но с фолс-негативами (иногда пойдешь кверять)

jetzajac21:07:09

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

jetzajac21:07:06

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

jetzajac21:07:59

чета я много написал, и возможно не по теме, но вроде Николай меня че-то про это спрашивал. @nicola

misha21:07:14

@nicola в связке датаскрипт/датомик - на каждом ки-велью есть номер транзакции – максимальная гранулярность. получать все апдейты можно тупо 1 запросом "давай всё, что там новенького начиная вот с этой транзакции (+ пара фильтров: права доступа, etc.)"

misha21:07:37

остается только (kappa) договориться об айди транзакций между клиентами и сервером

Niki21:07:05

хэнгаут, на котором все разводят руками и чешут репу?

Niki21:07:27

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

Niki21:07:58

т.е. каждый клиент не может каждый раз проверять всю novelty на предмет есть ли там что-то для него интересное

Niki22:07:40

тут скорее нужен дринкаут, но вы же в этом, как его, Питере :)

jetzajac22:07:19

@tonsky дринкаут точно нужен. когда приедешь?

Niki22:07:38

Думаю как раз :)

jetzajac22:07:19

@tonsky было бы хорошо если после 15-го. а то я в праге.

Niki22:07:02

Ну как там в Праге? Хорошо

jetzajac22:07:35

тут хорошо.

misha22:07:43

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

Niki22:07:50

Надо куда-нить как-нить будет собраться, а то Шенген дали, а я не пользую

Niki22:07:09

Миша — это да

Niki22:07:35

Сорри гайз, спать зовут, до завтра

jetzajac22:07:35

@misha да, чтобы об этом рассуждать нужна нормализация и схема. С Датомами хоть что-то можно придумать. с произвольным стэйтом в мапах - нет

niquola22:07:19

@jetzajac @tonsky +1 за дринкаут

niquola22:07:51

@tonsky поехали в берлин на еврокложу

niquola22:07:36

репу почесать в прямом эфире тоже полезно будет