Гость
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Стратегия синхронизации данных между frontEnd и backEnd / 25 сообщений из 66, страница 1 из 3
23.09.2020, 15:10
    #40001714
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стратегия синхронизации данных между frontEnd и backEnd
Всем привет, пишу приложение состоящее из 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",
      "children":[
         {
            "childID":"1"
         },
         {
            "childID":"2"
         },
         {
            "childID":"3"
         }
      ]
   },
   {
      "parentID":"2",
      "children":[
         {
            "childID":"4"
         },
         {
            "childID":"5"
         },
         {
            "childID":"6"
         }
      ]
   }
]



Изменение модели заключается в добавлении/удалении из массива корневых элементов ({"parentID":1...}), добавление/удаление дочерних элементов внутри родительских({"childID":"4"}). Я хочу сделать теневое сохранение результатов работы пользователя на BackEnd - по таймеру будет считываться данные с клиента и отправляться на бэкэнд для сохранения.
Соответственно я столкнулся с выбором стратегии сохранения данных.
1) Каждый раз отправляем полностью объект с данными для сохранения- на бэкэнде старый стираем, поверх него записываем новый.
+:
простота
отсутствие промежуточных состояний данных
-:
передача избыточных данных- они не поменялись, но все равно их сохраняем
2)На front храним предыдущую версию отправленных данных и отправляем только в том случае, если есть хоть одно отличие в сравнении с текущей
+:
Отбрасываем отправку дублирующих запросов
-:
Появляется хранение промежуточного состояния-уязвимая точка приложения, при падении которой происходит потеря последней версии данных
3)Создание на front логики, которая будет сравнивать текущее состояние данных и предыдущее сохранение и выделять конкретные группы изменений:
*созданные корневые ({"parentID":1...}) записи
*удаленные корневые записи
*редактированные корневые записи(изменения в массиве children)
на бэкэнд отправляется что-то вроде
Код: javascript
1.
2.
3.
4.
5.
{
  created:[],
  deleted:[],
  updates:[]
}

и на бэкэнде делается соответствующие команды для редактирования данных.
+:
минимально объем отправленных данных- отправляется только то, что действительно изменилось
-:
довольно сложная реализация
много этапов, на котором что-то может пойти не так и исказит данные
4)Дублируем каждое действие на front. То есть пользователь добавил корневой элемент- отправляем http-запрос сделать аналогичную команду с данными на бэкэнде, удалил, отредактировал- аналогично.
+:
не нужно хранить промежуточных состояний на front
несложная логика реализации
-:постоянный спам беэенда мелкими запросами, необходимость для пользовательского UI ждать, пока backend вернет ответ, что запрос прошел успешно.

Соответственно вопрос, возможно есть решение, которое лежит вне той плоскости, где выбирается между избыточностью отправляемых данных, простотой и минимально необходимым количеством http-запростов, но сложностью.
Какие есть best-practice для подобных ситуаций именно в архитектурном плане?Спасибо
...
Рейтинг: 0 / 0
23.09.2020, 18:37
    #40001834
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стратегия синхронизации данных между frontEnd и backEnd
vb_sub,

и как часто эту вашу модель вообще редактировать будут?
если один раз отредактируют и забудут на месяц, то вариант 1 вполне себе подходит
...
Рейтинг: 0 / 0
24.09.2020, 01:02
    #40001919
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стратегия синхронизации данных между frontEnd и backEnd
vb_sub
Соответственно вопрос, возможно есть решение, которое лежит вне той плоскости, где выбирается между избыточностью отправляемых данных, простотой и минимально необходимым количеством http-запростов, но сложностью.


Можете как-то по-точнее выразить задачу?
Что конкретно нужно?

vb_sub
Какие есть best-practice для подобных ситуаций именно в архитектурном плане?Спасибо


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

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

Без конкретики сложно о чём-то говорить.
...
Рейтинг: 0 / 0
24.09.2020, 09:26
    #40001967
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стратегия синхронизации данных между frontEnd и backEnd
skyANA,
частота редактирования в пике-1 изменение в 3 секунды.
Объем редактированной информации-1 родительский объект({"parentID":1...}) или 1 дочерний внутри какого-либо родительского("childID":"4"}).
...
Рейтинг: 0 / 0
24.09.2020, 09:37
    #40001971
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стратегия синхронизации данных между frontEnd и backEnd
hVostt,
все приведенные мной практики- компромиссные то есть улучшая какую-либо одну характеристику, приходится делать хуже другую.
Если кратко о задаче- то нужно чтобы на frontend и на backend был один и тот же объект данных, но редактирование этого объекта можно осуществлять только с frontend.
Сейчас рассматриваю возможность попробовать 4-й вариант, только не через http, а через webSocket соединение.
...
Рейтинг: 0 / 0
24.09.2020, 13:55
    #40002135
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стратегия синхронизации данных между frontEnd и backEnd
Сюрприз, но уэб-сокет это обёртка над хттп.
...
Рейтинг: 0 / 0
24.09.2020, 14:29
    #40002150
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стратегия синхронизации данных между frontEnd и backEnd
Dimitry Sibiryakov,
но судя по бенчмаркам и тестам на размер передаваемых данных сокеты лучше подходят для частой пересылки данных малыми объемами. Ну а что сюрприз, это да, я ожидал что сокеты будут пониже уровнем, чем http.
...
Рейтинг: 0 / 0
24.09.2020, 14:37
    #40002152
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стратегия синхронизации данных между frontEnd и backEnd
vb_sub
skyANA,
частота редактирования в пике-1 изменение в 3 секунды.
Объем редактированной информации-1 родительский объект({"parentID":1...}) или 1 дочерний внутри какого-либо родительского("childID":"4"}).

Это типа пользователь раз в месяц зашёл и тут ткнул, через 3 секунды там ткнул, ещё через 3 сям?
А потом нажал "Сохранить"?
...
Рейтинг: 0 / 0
24.09.2020, 15:07
    #40002170
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стратегия синхронизации данных между frontEnd и backEnd
skyANA,
пользователю каждый день приходит список ориентировочно на 300 элементов( {"childID":"1"} ... {"childID":"300"}) и он начинает их drag-and-drop'ом растаскивать по группам({parentID:"1","children":'список элементов, содержащихся в этой группе'}). Растаскивает до тех пор, пока каждый элемент не будет в какой-либо группе и может элементы между группами перекидывать.
Я хочу избавиться от кнопки "Сохранить", хочу чтобы это было автоматически. Ведь как приятно, что в Visual Studio не надо жать эту кнопку сохранения. И соответственно хочу перенести этот позитивный опыт в свое приложение.
...
Рейтинг: 0 / 0
25.09.2020, 13:51
    #40002531
OoCc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стратегия синхронизации данных между frontEnd и backEnd
vb_sub
skyANA,
пользователю каждый день приходит список ориентировочно на 300 элементов( {"childID":"1"} ... {"childID":"300"}) и он начинает их drag-and-drop'ом растаскивать по группам({parentID:"1","children":'список элементов, содержащихся в этой группе'}). Растаскивает до тех пор, пока каждый элемент не будет в какой-либо группе и может элементы между группами перекидывать.
Я хочу избавиться от кнопки "Сохранить", хочу чтобы это было автоматически. Ведь как приятно, что в Visual Studio не надо жать эту кнопку сохранения. И соответственно хочу перенести этот позитивный опыт в свое приложение.

Я бы запускал XMLHttpRequest при каждом дропе.
...
Рейтинг: 0 / 0
26.09.2020, 13:31
    #40002843
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стратегия синхронизации данных между frontEnd и backEnd
Dimitry Sibiryakov
Сюрприз, но уэб-сокет это обёртка над хттп.

vb_sub
Ну а что сюрприз, это да, я ожидал что сокеты будут пониже уровнем, чем http.


Websocket это не обертка над HTTP.
HTTP просто позволяет переключиться на Websocket из HTTP не разрывая соединение.
Как только переключение произошло то протокол больше не имеет ничего общего с HTTP, он даже уже не текстовый, а бинарный.
...
Рейтинг: 0 / 0
26.09.2020, 14:00
    #40002856
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стратегия синхронизации данных между frontEnd и backEnd
Если после HTTP заголовка начать посылать бинарные данные, то это получится уже совершенно другой протокол? Ню-ню...
...
Рейтинг: 0 / 0
26.09.2020, 18:56
    #40002926
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стратегия синхронизации данных между frontEnd и backEnd
Dimitry Sibiryakov
Если после HTTP заголовка начать посылать бинарные данные, то это получится уже совершенно другой протокол? Ню-ню..

Если бы только сервер посылал данные, то еще с натяжкой можно считать что это тело HTTP ответа (хотя ответ 101 в по стандарту HTTP не должен иметь тела, т.е. это уже не HTTP).
Но в вебсокете в обе стороны идут бинарные данные. Это 100% не HTTP.
...
Рейтинг: 0 / 0
26.09.2020, 20:09
    #40002941
Стратегия синхронизации данных между frontEnd и backEnd
Код: javascript
1.
2.
3.
4.
5.
6.
7.
ws = new WebSocket("ws://localhost:8888/dh");
var formdata = $('eventForm').serialize();
ws.onopen = function()
{
    ws.send(formdata);
};
// на сервер придёт строка, которую парсит url_parse()
...
Рейтинг: 0 / 0
26.09.2020, 20:39
    #40002946
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стратегия синхронизации данных между frontEnd и backEnd
Anatoly Moskovsky
Но в вебсокете в обе стороны идут бинарные данные. Это 100% не HTTP.
Метод POST позволяет отправить и получить бинарные данные. Это "100% не HTTP"?
...
Рейтинг: 0 / 0
26.09.2020, 21:24
    #40002958
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стратегия синхронизации данных между frontEnd и backEnd
Basil A. Sidorov
Метод POST позволяет отправить и получить бинарные данные. Это "100% не HTTP"?

В вебсокете нет HTTP заголовков, нет ни POST ни GET. Он в принципе не может быть оберткой над HTTP.
Если взять HTTP прокси который не знает про вебсокет, то он не сможет ретранслировать вебсокет - он вернет ошибку клиенту на первом же байте данных после переключения протокола.
Что еще не понятно-то?
...
Рейтинг: 0 / 0
26.09.2020, 23:54
    #40002972
Стратегия синхронизации данных между frontEnd и backEnd
а AJAX это HTTP ?
...
Рейтинг: 0 / 0
27.09.2020, 11:14
    #40003016
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стратегия синхронизации данных между frontEnd и backEnd
vb_sub
skyANA,
пользователю каждый день приходит список ориентировочно на 300 элементов( {"childID":"1"} ... {"childID":"300"}) и он начинает их drag-and-drop'ом растаскивать по группам({parentID:"1","children":'список элементов, содержащихся в этой группе'}). Растаскивает до тех пор, пока каждый элемент не будет в какой-либо группе и может элементы между группами перекидывать.
Я хочу избавиться от кнопки "Сохранить", хочу чтобы это было автоматически. Ведь как приятно, что в Visual Studio не надо жать эту кнопку сохранения. И соответственно хочу перенести этот позитивный опыт в свое приложение.

Тут подходит цепочка команд: добавить в группу такого-то родителя такой-то элемент, переместить его в группе перед таким-то элементом, после такого-то элемента.
Про удалить ничего не сказано, но может тоже понадобится.

Цепочку можно накапливать на клиенте и отправлять на сервер пачку команд, а можно и по одной.
...
Рейтинг: 0 / 0
27.09.2020, 11:18
    #40003017
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стратегия синхронизации данных между frontEnd и backEnd
WebSocket - протокол поверх TCP.

Читайте спецификацию: https://tools.ietf.org/html/rfc6455
...
Рейтинг: 0 / 0
27.09.2020, 11:47
    #40003021
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стратегия синхронизации данных между frontEnd и backEnd
Алексей Роза 2020
а AJAX это HTTP ?

Нет. Это вообще не протокол, а API ))
...
Рейтинг: 0 / 0
27.09.2020, 12:01
    #40003027
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стратегия синхронизации данных между frontEnd и backEnd
Anatoly Moskovsky
Алексей Роза 2020
а AJAX это HTTP ?

Нет. Это вообще не протокол, а API ))

AJAX - это любое общение с сервером без перезагрузки страницы, организованное при помощи JavaScript.

К примеру создать iframe - это самый древний способ AJAX-запроса
...
Рейтинг: 0 / 0
27.09.2020, 13:50
    #40003051
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стратегия синхронизации данных между frontEnd и backEnd
Anatoly Moskovsky
Но в вебсокете в обе стороны идут бинарные данные. Это 100% не HTTP.

Они так делают со времён появления в HTTP протоколе запроса CONNECT. Так что это не повод уэб-сокеты объявлять чем-то принципиально новым.
...
Рейтинг: 0 / 0
27.09.2020, 13:58
    #40003055
Стратегия синхронизации данных между frontEnd и backEnd
Anatoly Moskovsky
Нет. Это вообще не протокол, а API ))

у ws тоже API есть:
авторОбъект WebSocket предоставляет API для создания и управления вебсокет-подключения к серверу, а также для отправки и получения данных в этом подключении.
А у AJAX тоже есть свой XMLHTTPRequest... почти протокол
...
Рейтинг: 0 / 0
27.09.2020, 16:37
    #40003095
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стратегия синхронизации данных между frontEnd и backEnd
Dimitry Sibiryakov
Они так делают со времён появления в HTTP протоколе запроса CONNECT. Так что это не повод уэб-сокеты объявлять чем-то принципиально новым.

Все правильно. Со времен изобретения байтов ничего принципиально нового не придумано
...
Рейтинг: 0 / 0
27.09.2020, 22:02
    #40003149
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стратегия синхронизации данных между frontEnd и backEnd
Поэтому разбудите меня когда JS через этот ваш уэб-сокет сможет подключаться прямо к серверу IRC, не требуя чтобы кто-то для него работал как прокси.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Стратегия синхронизации данных между frontEnd и backEnd / 25 сообщений из 66, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]