- PVSM.RU - https://www.pvsm.ru -

В этой статье описаны последние события, связанные с Derby. Так же поделюсь мыслями и полезными ссылками.
Lever [1] — компания, создавшая Derby, прошла очередной (второй ли, третий ли?) раунд инвестиций и обеспечила себе стабильное существование, как минимум, на ближайшие два года. С чем их и поздравляем.
Так же, после того, как вышла Derby 0.6, Lever прикладывает определенные усилия к продвижению фреймворка:
Derby переехал в новую группу [13]. Это связанно с тем, что в старой накопилось много хлама и название Codeparty не отображало суть.
Активная часть сообщества создала свою группу [14], где потихоньку пилятся модули.
Lever тоже выкладывает свои наработки [15]. Еще стоит обратить внимание на наработки компании Decision Mapper [16].
Сообщество медленно, но верно прибывает. Часто путь выглядит так: клиентский фреймворк (AngularJS, Ember и тп) -> Meteor [17] -> Derby. Метеор хорошо помогает проникнуться концепциями realtime, full-stack, бд на клиенте, изоморфность и тп, но не удовлетворяет всех в силу тех или иных причин. Вообще, вот тут [18] Нэйт очень интересно рассказал про основные фреймворки.
Недавно создали чат на Gitter [19].
Есть несколько мыслей, по поводу того, что можно добавить или изменить в Derby:
В текущей реализации livedb [21] события на изменение документов ловятся за счёт Redis pub-sub (для одного node процесса, можно без Redis). И это часть функциональности является встроенной. Для хранения лога операций (oplog) и текущих версий документов (snapshots) используется внешний драйвер, который можно написать, в общем, для любой бд, например, для Mongo [22].
Проблемы в текущей реализации:
— использование двух бд, вместо одной.
— использование последовательного выполнения однопоточных Lua-скриптов в качестве альтернативы транзакциям, приводит к тому, что Redis потенциально становится узким местом (хотя пока никто с этим не столкнулся). Так же теоретически, при высокой коллаборации (много клиентов, обслуживающиеся разными node процессами, изменяют один документ) Redis'у потребуется значительно больше, чем одна попытка применить операцию к данным, так как текущая версия данных будет меняться от операциий других node процессов, что может повлиять на производительность (тут тоже проблем ни у кого пока не было).
— для случаев, когда клиент подписан на отсортированный запрос к коллекции (Query), нету возможности дешево понять как изменение очередного документа повлияет на его положение в данной query. В данный момент это делается довольно топорным способом: запрос применяется к коллекции, достаются все документы для этого запроса, высчитывается разница и отправляется на клиент (для приложений с большим количеством таких запросов это вызывает проблемы с производительностью). В данном случае проблема могла бы быть решена с помощью событий на изменение индекса в бд. К сожалению, бд с событиями на изменение индекса нет (если знаете, поделитесь). Наверно это не так трудно добавить в большинство бд, но никогда не было нужды (как вариант, можно попросить добавить это в Монгу).
FoundationDB имеет Pub-Sub и может заменить и Redis, и Mongo. Наличие встроенных транзакций упростит логику применение операций.
Также поверх FoundationDB можно написать свой Document Model слой, например fowl [23], в котором реализовать события на изменения индексов. Такой адаптер решит проблему отсортированных query.
Минусы FoundationDB — закрытость исходников, не бесплатность.
Джозеф уже наваял livedb-foundation [24]. Дело за адаптером.
Идея Offline веб-приложений подразумевает, что клиент хранит у себя данные, загруженные с сервера, даже когда приложение не запущено. И использует этот кэш, если нет возможности соединиться с сервером. Также клиент хранит изменения данных и при соединении с сервером синхронизирует данные в клиентском кэше с данными в бд, при этом конфликтные ситуации разрешаются. В идеале, пользователь должен иметь возможность открыть приложение без соединения с интернетом, поработать в нем, закрыть его и быть уверенным, что когда он в следующий раз откроет приложение и будет доступ к интернету, все результаты его работы попадут на сервер.
Derby/ShareJS представляется хорошей платформой для этого. Всё что нужно синхронизировать данные в модели с IndexedDB, научить Derby сначала искать данные в клиентском кэше, а потом (если доступен сервер) запрашивать с него разницу (новые версии). Также нужно при офлайне хранить операции в IndexedDB, и отправлять их на сервер при появлении соединения.
Первый модуль access-control — racer-access [25] имеет уязвимости с доступом по queries и в данный момент не рекомендован к использованию. В данный момент рекомендуется осуществлять контроль доступа на уровне ShareJS вручную [26] или с помощью модуля share-access [27].
Есть идея совместить модуль валидации и access-control, добавив в схемы racer-schema [28] подобие Firebase Security [29].
Всем, у кого есть вопросы по Derby/Racer/ShareJS, пишите мне на скайп vmakhaev.
Не пропустите Open Hours меньше, чем через час. Удачи!
Автор: vmakhaev
Источник [30]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/news/69407
Ссылки в тексте:
[1] Lever: http://lever.co
[2] google groups рассылке: https://groups.google.com/forum/#!forum/derbyjs
[3] Ian: https://github.com/enjalot
[4] Nate: https://github.com/nateps
[5] Joseph: https://github.com/josephg
[6] блоге Левер: https://blog.lever.co/
[7] сайта: http://derbyjs.com/
[8] документация 0.5: http://derbyjs.com/0.5/model
[9] zag2art: http://habrahabr.ru/users/zag2art/
[10] этой: http://habrahabr.ru/post/221027/
[11] ForwardJS: http://forwardjs.com/2014/speakers/#agnostic-rendering
[12] JS встрече: https://blog.lever.co/building-lever-with-derbyjs-components/
[13] группу: https://github.com/derbyjs
[14] группу: https://github.com/derbyparty
[15] наработки: https://github.com/lever
[16] Decision Mapper: https://github.com/dmapper
[17] Meteor: https://www.meteor.com/
[18] тут: https://blog.lever.co/open-source-office-hours-718/
[19] Gitter: https://gitter.im/derbyjs/derby
[20] FoundationDB: https://foundationdb.com/
[21] livedb: https://github.com/share/livedb
[22] Mongo: https://github.com/share/livedb-mongo
[23] fowl: https://github.com/OptimalBits/fowl
[24] livedb-foundation: https://github.com/josephg/livedb-foundation
[25] racer-access: https://github.com/codeparty/racer-access
[26] вручную: https://gist.github.com/nateps/02d0b0293880905476bd
[27] share-access: https://github.com/dmapper/share-access
[28] racer-schema: https://github.com/derbyparty/racer-schema
[29] Firebase Security: https://www.firebase.com/docs/security/guide.html
[30] Источник: http://habrahabr.ru/post/236529/
Нажмите здесь для печати.