Lev
... ну монги то как то синкаются между собой
yopp
точнее так: это _очень_ трудно
yopp
ха
yopp
initialsync это вообще черная магия
Lev
не, ща вот совсем... не весело
Lev
Накой тогда этот change stream рекламировать
yopp
я вам вполне серьёзно говорю — вы этого не сделаете
Lev
Окэ... тогда вот такой прием:
yopp
change stream не для точного синхронизации состояний
yopp
это система уведомления об изменениях
yopp
а не протокол репликации
Lev
Ок, но изначально то надо проинициализировать... иначе не понятно что обновлять
yopp
если вы хотите реплицировать монгу в другое хранилище, это уже другой класс задач
yopp
и ещё раз
Lev
... но оно ж оплог читает. На оплоге же синкаются бд.
yopp
помоему в монге у initialsync около 15 шагов
yopp
это в вопросу «изначально проинициализировать»
yopp
это _очень непросто_ сделать на работающей базе
yopp
если вы можете остановить запись в базу, то вы можете выдернуть из неё дамп
yopp
если вы её остановить не можете, я вам рекомендую использовать монгу напрямую
yopp
без перекладывания в какое-то ещё хранилище
yopp
это безумно дорого
Lev
Так я только часть бд перетащу. Я ж говорил - несколько запросов.
yopp
зачем?
Lev
Мне нужна только часть бд
yopp
так читайте из бд
Lev
Я не хочу ВСЮ монгу в inmemory
yopp
зачем вам куда-то ещё синхроинизровать состояние
Lev
Ну... монга не вся, но эта часть - приличная, там десятки тыс объектов и если пересчет интерфейса запускать на этой ораве это куча времени. Но если на несколько объектов из changestream - то все ок
Lev
Я уже проворачивал это в обход монги, ручками. Но это костыли, а тут бд сама это умеет.
yopp
«куча времени» это сколько?
Lev
Секунд... 5-10
yopp
и что занимает 5-10 секунд?
yopp
я не понимаю что у вас за интерфейс
yopp
но вообще https://db-ai.co, приходите, мы с вами поговорим о вашем кейсе
yopp
мне кажется вы пытаетесь забить гвоздь ускорителем частиц
Lev
Интерфейс тяжелый. Пересчет всего интерфейса на основе всех данных. На основе части данных - несколько мс.
Lev
Хорошо. Я понимаю что вы хотите мне сказать и понимаю, что в реальной бд это не фигня собачья. С другой стороны, в моем случае это inmemory хранилище очень просто и точно не имеет всего функционала монги. Тогда вот такой вариант (): 1. Замеряю время 2. Читаю данные с бд. 3. Как закончил читать - я запускаю оплог с того времени, что замерял ранее. Тогда, оплог между 1 и 2 может повторится после снапшота, но конечное состояние не побьет, потому что удалит и так удаленное, создаст и так созданное, изменит и так измененное. А т.к. на этом основан декларативный код - ничего не изменится. ну моргнет там окошко какое нить и все
yopp
в change stream есть resume
yopp
но я всё ещё не могу понять что вы делаете
yopp
что из себя представляют эти десятки тысяч документов?
yopp
интерфейс как GUI или как API?
yopp
зачем пересчитывать десятки тысяч документов?
Lev
интерфейс - GUI с картой на тысячи объектов, состояний объектов.
Lev
Там еще графоний поверх карты. Это SCADA система, следит за областной электросетью.
Lev
Там еще всякие упрощения сети... эмуляции потока электроэнергии.... с нуля пересчитать - это куча времени. А показывать надо почти-онлайн. Ну иначе... не круто.
yopp
обожаю скады
yopp
вобщем-то я в монгу вляпался, когда мы проектировали аналитический фроентенд для скады :)
Lev
А... теперь я ссылку открыл. То есть просто так вы не скажете? ))
yopp
так просто вам ничего не ответить
Lev
Да, у моей конторы хватит денег) Но это будет... через несколько дней, а мне печет, я хочу сейчас %)
Lev
Я выше предложил три шага. Я пока не могу найти вариант когда они дадут не валидный inmemory, после того, как оплог догонит результат запроса, а это очень быстро.
Lev
То есть да, при загрузке и так и так ждать 10 сек, но это будет загрузка сервера. А не клиента.
yopp
по вашим отрывочным обрывкам потока мыслей очень тяжело понять где лежит ваша проблема :)
yopp
и если вам надо просто на карте лампочками мигать, я не понимаю зачем для этого надо тащить всё в память
yopp
почему нельзя пробрасывать события из монги сразу на клиента
Lev
Я так делал, на телефончике виснет.
Lev
Вынес мозги интерфейса на бекенд.
Lev
Так или иначе, где бы расчет интерфейса не находился - надо его как то проинициализировать. Это inmemory должно быть проинициализировано.
yopp
ответ на ваш вопрос зависит от требуемых гарантий
yopp
если я правильно понимаю задачу, вам нужно point-in-time получить снепшот состояние ряда документов (уже задача) и потом гарантированно получить изменения этих документов с точки снепшота
Lev
Ну, за несколько секунд после инициализации оно должно прийти к состоянию, отображающему состояние монги в ближайшем прошлом (ну со скоростью доставки оплога)
yopp
я не понимаю что такое «валидное состояние»
yopp
в монге не бывает невалидного состояния :)
Lev
Вот, поправил.
Lev
если я правильно понимаю задачу, вам нужно point-in-time получить снепшот состояние ряда документов (уже задача) и потом гарантированно получить изменения этих документов с точки снепшота
Да Снапшот вроде бы не доставляет проблем на данный момент. Просто запросы. Я думал, проблема как начать слушать оплог так, чтобы стапшот корректно обновлялся и данные не потерялись
Nick
Хера вы тут понаписали)
yopp
«просто запросы» это уже гарантированно неверный способ :)
yopp
если вы это без транзакции делаете
Lev
оО А что ж там не так то? А.. типа... данные устареют, пока я из запрашиваю.
Lev
Без транзакции
Lev
данные устареют, пока я их запрашиваю?
Lev
Я предполагал, что если после снятия такого кривого снапшота, я начну слушать оплог с точки, предшествующей снапшоту, тогда этот оплог в конце концов вернет состояние в согласованный вид и далее будет поддерживать его
Nick
Хорошо. Я понимаю что вы хотите мне сказать и понимаю, что в реальной бд это не фигня собачья. С другой стороны, в моем случае это inmemory хранилище очень просто и точно не имеет всего функционала монги. Тогда вот такой вариант (): 1. Замеряю время 2. Читаю данные с бд. 3. Как закончил читать - я запускаю оплог с того времени, что замерял ранее. Тогда, оплог между 1 и 2 может повторится после снапшота, но конечное состояние не побьет, потому что удалит и так удаленное, создаст и так созданное, изменит и так измененное. А т.к. на этом основан декларативный код - ничего не изменится. ну моргнет там окошко какое нить и все
вы не рассматриваете вариант, что пока вы будете заливать снепшот оплог может прокрутиться, если изменений досточно много? но похоже у вас нет особых требований к тому, что данные должны быть реально теми которые сейчас в бд, поэтмуо вообще можно забить на все и делать как сейчас делаете
Lev
"должны быть реально теми которые сейчас в бд", допускается отставание от бд. Можно даже на секунду опаздывать, я думаю это и так много.
Lev
"оплог может прокрутиться" - то есть "начало" оплога затрется?
Nick
да