|
Стратегия синхронизации данных между frontEnd и backEnd
|
|||
---|---|---|---|
#18+
Всем привет, пишу приложение состоящее из frontEnd (NuxtJS) и BackEnd (Asp Core) части. В результате работы пользователя происходит редактирование данных укрупненно представленных в виде следующей модели: Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
Изменение модели заключается в добавлении/удалении из массива корневых элементов ({"parentID":1...}), добавление/удаление дочерних элементов внутри родительских({"childID":"4"}). Я хочу сделать теневое сохранение результатов работы пользователя на BackEnd - по таймеру будет считываться данные с клиента и отправляться на бэкэнд для сохранения. Соответственно я столкнулся с выбором стратегии сохранения данных. 1) Каждый раз отправляем полностью объект с данными для сохранения- на бэкэнде старый стираем, поверх него записываем новый. +: простота отсутствие промежуточных состояний данных -: передача избыточных данных- они не поменялись, но все равно их сохраняем 2)На front храним предыдущую версию отправленных данных и отправляем только в том случае, если есть хоть одно отличие в сравнении с текущей +: Отбрасываем отправку дублирующих запросов -: Появляется хранение промежуточного состояния-уязвимая точка приложения, при падении которой происходит потеря последней версии данных 3)Создание на front логики, которая будет сравнивать текущее состояние данных и предыдущее сохранение и выделять конкретные группы изменений: *созданные корневые ({"parentID":1...}) записи *удаленные корневые записи *редактированные корневые записи(изменения в массиве children) на бэкэнд отправляется что-то вроде Код: javascript 1. 2. 3. 4. 5.
и на бэкэнде делается соответствующие команды для редактирования данных. +: минимально объем отправленных данных- отправляется только то, что действительно изменилось -: довольно сложная реализация много этапов, на котором что-то может пойти не так и исказит данные 4)Дублируем каждое действие на front. То есть пользователь добавил корневой элемент- отправляем http-запрос сделать аналогичную команду с данными на бэкэнде, удалил, отредактировал- аналогично. +: не нужно хранить промежуточных состояний на front несложная логика реализации -:постоянный спам беэенда мелкими запросами, необходимость для пользовательского UI ждать, пока backend вернет ответ, что запрос прошел успешно. Соответственно вопрос, возможно есть решение, которое лежит вне той плоскости, где выбирается между избыточностью отправляемых данных, простотой и минимально необходимым количеством http-запростов, но сложностью. Какие есть best-practice для подобных ситуаций именно в архитектурном плане?Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 15:10 |
|
Стратегия синхронизации данных между frontEnd и backEnd
|
|||
---|---|---|---|
#18+
vb_sub, и как часто эту вашу модель вообще редактировать будут? если один раз отредактируют и забудут на месяц, то вариант 1 вполне себе подходит ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 18:37 |
|
Стратегия синхронизации данных между frontEnd и backEnd
|
|||
---|---|---|---|
#18+
vb_sub Соответственно вопрос, возможно есть решение, которое лежит вне той плоскости, где выбирается между избыточностью отправляемых данных, простотой и минимально необходимым количеством http-запростов, но сложностью. Можете как-то по-точнее выразить задачу? Что конкретно нужно? vb_sub Какие есть best-practice для подобных ситуаций именно в архитектурном плане?Спасибо Лучшие практики применяются к задачам для достижения вполне определённых и конкретных результатов. Вы чего хотите в итоге? Ведь вы сейчас можете выбрать любой вариант реализации, который в итоге называется "как сумел", и получите соответствующий результат "так получилось". Без конкретики сложно о чём-то говорить. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 01:02 |
|
Стратегия синхронизации данных между frontEnd и backEnd
|
|||
---|---|---|---|
#18+
skyANA, частота редактирования в пике-1 изменение в 3 секунды. Объем редактированной информации-1 родительский объект({"parentID":1...}) или 1 дочерний внутри какого-либо родительского("childID":"4"}). ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 09:26 |
|
Стратегия синхронизации данных между frontEnd и backEnd
|
|||
---|---|---|---|
#18+
hVostt, все приведенные мной практики- компромиссные то есть улучшая какую-либо одну характеристику, приходится делать хуже другую. Если кратко о задаче- то нужно чтобы на frontend и на backend был один и тот же объект данных, но редактирование этого объекта можно осуществлять только с frontend. Сейчас рассматриваю возможность попробовать 4-й вариант, только не через http, а через webSocket соединение. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 09:37 |
|
Стратегия синхронизации данных между frontEnd и backEnd
|
|||
---|---|---|---|
#18+
Сюрприз, но уэб-сокет это обёртка над хттп. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 13:55 |
|
Стратегия синхронизации данных между frontEnd и backEnd
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, но судя по бенчмаркам и тестам на размер передаваемых данных сокеты лучше подходят для частой пересылки данных малыми объемами. Ну а что сюрприз, это да, я ожидал что сокеты будут пониже уровнем, чем http. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 14:29 |
|
Стратегия синхронизации данных между frontEnd и backEnd
|
|||
---|---|---|---|
#18+
vb_sub skyANA, частота редактирования в пике-1 изменение в 3 секунды. Объем редактированной информации-1 родительский объект({"parentID":1...}) или 1 дочерний внутри какого-либо родительского("childID":"4"}). Это типа пользователь раз в месяц зашёл и тут ткнул, через 3 секунды там ткнул, ещё через 3 сям? А потом нажал "Сохранить"? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 14:37 |
|
Стратегия синхронизации данных между frontEnd и backEnd
|
|||
---|---|---|---|
#18+
skyANA, пользователю каждый день приходит список ориентировочно на 300 элементов( {"childID":"1"} ... {"childID":"300"}) и он начинает их drag-and-drop'ом растаскивать по группам({parentID:"1","children":'список элементов, содержащихся в этой группе'}). Растаскивает до тех пор, пока каждый элемент не будет в какой-либо группе и может элементы между группами перекидывать. Я хочу избавиться от кнопки "Сохранить", хочу чтобы это было автоматически. Ведь как приятно, что в Visual Studio не надо жать эту кнопку сохранения. И соответственно хочу перенести этот позитивный опыт в свое приложение. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 15:07 |
|
Стратегия синхронизации данных между frontEnd и backEnd
|
|||
---|---|---|---|
#18+
vb_sub skyANA, пользователю каждый день приходит список ориентировочно на 300 элементов( {"childID":"1"} ... {"childID":"300"}) и он начинает их drag-and-drop'ом растаскивать по группам({parentID:"1","children":'список элементов, содержащихся в этой группе'}). Растаскивает до тех пор, пока каждый элемент не будет в какой-либо группе и может элементы между группами перекидывать. Я хочу избавиться от кнопки "Сохранить", хочу чтобы это было автоматически. Ведь как приятно, что в Visual Studio не надо жать эту кнопку сохранения. И соответственно хочу перенести этот позитивный опыт в свое приложение. Я бы запускал XMLHttpRequest при каждом дропе. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2020, 13:51 |
|
Стратегия синхронизации данных между frontEnd и backEnd
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Сюрприз, но уэб-сокет это обёртка над хттп. vb_sub Ну а что сюрприз, это да, я ожидал что сокеты будут пониже уровнем, чем http. Websocket это не обертка над HTTP. HTTP просто позволяет переключиться на Websocket из HTTP не разрывая соединение. Как только переключение произошло то протокол больше не имеет ничего общего с HTTP, он даже уже не текстовый, а бинарный. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 13:31 |
|
Стратегия синхронизации данных между frontEnd и backEnd
|
|||
---|---|---|---|
#18+
Если после HTTP заголовка начать посылать бинарные данные, то это получится уже совершенно другой протокол? Ню-ню... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 14:00 |
|
Стратегия синхронизации данных между frontEnd и backEnd
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Если после HTTP заголовка начать посылать бинарные данные, то это получится уже совершенно другой протокол? Ню-ню.. Если бы только сервер посылал данные, то еще с натяжкой можно считать что это тело HTTP ответа (хотя ответ 101 в по стандарту HTTP не должен иметь тела, т.е. это уже не HTTP). Но в вебсокете в обе стороны идут бинарные данные. Это 100% не HTTP. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 18:56 |
|
Стратегия синхронизации данных между frontEnd и backEnd
|
|||
---|---|---|---|
#18+
Код: javascript 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 20:09 |
|
Стратегия синхронизации данных между frontEnd и backEnd
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky Но в вебсокете в обе стороны идут бинарные данные. Это 100% не HTTP. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 20:39 |
|
Стратегия синхронизации данных между frontEnd и backEnd
|
|||
---|---|---|---|
#18+
Basil A. Sidorov Метод POST позволяет отправить и получить бинарные данные. Это "100% не HTTP"? В вебсокете нет HTTP заголовков, нет ни POST ни GET. Он в принципе не может быть оберткой над HTTP. Если взять HTTP прокси который не знает про вебсокет, то он не сможет ретранслировать вебсокет - он вернет ошибку клиенту на первом же байте данных после переключения протокола. Что еще не понятно-то? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 21:24 |
|
Стратегия синхронизации данных между frontEnd и backEnd
|
|||
---|---|---|---|
#18+
а AJAX это HTTP ? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2020, 23:54 |
|
Стратегия синхронизации данных между frontEnd и backEnd
|
|||
---|---|---|---|
#18+
vb_sub skyANA, пользователю каждый день приходит список ориентировочно на 300 элементов( {"childID":"1"} ... {"childID":"300"}) и он начинает их drag-and-drop'ом растаскивать по группам({parentID:"1","children":'список элементов, содержащихся в этой группе'}). Растаскивает до тех пор, пока каждый элемент не будет в какой-либо группе и может элементы между группами перекидывать. Я хочу избавиться от кнопки "Сохранить", хочу чтобы это было автоматически. Ведь как приятно, что в Visual Studio не надо жать эту кнопку сохранения. И соответственно хочу перенести этот позитивный опыт в свое приложение. Тут подходит цепочка команд: добавить в группу такого-то родителя такой-то элемент, переместить его в группе перед таким-то элементом, после такого-то элемента. Про удалить ничего не сказано, но может тоже понадобится. Цепочку можно накапливать на клиенте и отправлять на сервер пачку команд, а можно и по одной. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2020, 11:14 |
|
Стратегия синхронизации данных между frontEnd и backEnd
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2020, 11:18 |
|
Стратегия синхронизации данных между frontEnd и backEnd
|
|||
---|---|---|---|
#18+
Алексей Роза 2020 а AJAX это HTTP ? Нет. Это вообще не протокол, а API )) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2020, 11:47 |
|
Стратегия синхронизации данных между frontEnd и backEnd
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky Алексей Роза 2020 а AJAX это HTTP ? Нет. Это вообще не протокол, а API )) AJAX - это любое общение с сервером без перезагрузки страницы, организованное при помощи JavaScript. К примеру создать iframe - это самый древний способ AJAX-запроса ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2020, 12:01 |
|
Стратегия синхронизации данных между frontEnd и backEnd
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky Но в вебсокете в обе стороны идут бинарные данные. Это 100% не HTTP. Они так делают со времён появления в HTTP протоколе запроса CONNECT. Так что это не повод уэб-сокеты объявлять чем-то принципиально новым. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2020, 13:50 |
|
Стратегия синхронизации данных между frontEnd и backEnd
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky Нет. Это вообще не протокол, а API )) у ws тоже API есть: авторОбъект WebSocket предоставляет API для создания и управления вебсокет-подключения к серверу, а также для отправки и получения данных в этом подключении. А у AJAX тоже есть свой XMLHTTPRequest... почти протокол ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2020, 13:58 |
|
Стратегия синхронизации данных между frontEnd и backEnd
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Они так делают со времён появления в HTTP протоколе запроса CONNECT. Так что это не повод уэб-сокеты объявлять чем-то принципиально новым. Все правильно. Со времен изобретения байтов ничего принципиально нового не придумано ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2020, 16:37 |
|
|
start [/forum/topic.php?fid=16&fpage=4&tid=1339735]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
others: | 316ms |
total: | 457ms |
0 / 0 |