Как обеспечить непротиворечивость данных в клиент серверном приложении?
Добрый вечер. Хотелось бы получить ответ на один вопрос. Допустим есть какое-то веб приложение, где клиент общается с сервером посредством REST (Например связка Spring mvc и angularjs). Допустим с клиентской части были отосланы на сервер какие-то данные для обработки и сохранения в БД например. И вот тут вопрос. Что должен возвращать сервер в качестве ответа при успешной обработке? Должен ли он вернуть обработанные данные, или просто статус SUCCESS 200? Если он возвращает обработанные данные, то целостность и непротиворечивость гарантируется, но если количество данных влияет на скорость выполнения запроса, то тут спорно. Если же он возвращает SUCCESS, то все ту же обработку можно сделать и на клиенте, но непротиворечивость уже не гарантируется. Так кто же мне подскажет, какие best practices применяются в таких случаях? Надеюсь, что вопрос мой ясен. Спасибо!
Непротиворечивость данных обеспечивается исполнением модели гарантий ACID. Если каждая REST - операция выполняется в рамках отдельной транзакции, удовлетворяющей ACID, данные остаются непротиворечивыми между любыми транзакциями. Таким образом, достаточно из каждого вызова REST возвращать уведомление о том, что транзакция фиксирована.
Т.е. данные, которые были сохранены и преобразованы в результате выполненной транзакции на сервере, обратно отдавать на клиент не обязательно? Клиент может тогда сам на основе ответа сервера делать все те же преобразования, чтобы получить ту же версию данных, что и на сервере, так?
Имхо, для достижения 100% успеха во всех 100% операциях - тяжело будет найти какое-то единственное правильное решение. То есть, каждую Вашу операцию нужно будет согласовывать с сервером, на предмет непротиворечивости данных, в контексте требований к скорости работы приложения.
Другими словами, там где требуется скорость - вы на клиенте "доводите" данные до нужного состояние "непротиворечивости" с данными от сервера, но не выкачиваете их (и не генерируете), в других местах, где скорость не так важна - смело берете данные с сервера.
В общем случае:
Если клиенту нужно отправить данные для обработки и показать уже обработанные данные то очевидно их стоит вернуть.
Если клиенту не нужны данные, а нужно только совершить какое то действие, то он отправляет данные необходимые для этого действия и в ответ получает только статус.
Случай на которым вы акцентируете внимание, когда большой объём сырых данных обрабатывается и сохраняется на сервере, а потом в обработанном виде отображает на клиенте. Тут нужно смотреть по ситуации, клиент может быть слабый по производительности и скорости интернета, а может и нет, соответственно на сервер можно ждать обработанные данные с сервера, а можно на него отправлять уже обработанные.