Як структурувати дані, які надсилаються з сервера користувачеві?
Використовуйте шаблон обміну повідомленнями . Ну, ви вже використовуєте протокол обміну повідомленнями, але я маю на увазі структурування змін як повідомлень ... конкретно подій. Коли сервер змінюється, це призводить до ділових подій. У вашому сценарії, ці події ваших клієнтів зацікавлені в цих подіях. Події повинні містити всі дані, що стосуються цієї зміни (не обов'язково всі дані перегляду). Потім клієнтська сторінка повинна оновити частини перегляду, які вона підтримує, за допомогою даних події.
Наприклад, якщо ви оновлювали біржовий біржовий пакет і змінювали AAPL, ви не хочете знижувати всі ціни на акції або навіть усі дані про AAPL (ім'я, опис тощо). Ви б тільки натиснути AAPL, дельту та нову ціну. Тоді для клієнта ви б оновили лише цю ціну акцій у поданому вигляді.
Чи слід надсилати лише події на кшталт "цей ресурс оновлено, і ви повинні перезавантажити його через дзвінок AJAX" або натиснути оновлені дані та замінити попередні дані, завантажені за допомогою початкових дзвінків AJAX?
Я б не сказав жодного. Якщо ви надсилаєте подію, вперед і надсилайте разом із нею відповідні дані (а не дані всього об’єкта). Дайте йому назву для того, який тип події це. (Іменування та дані, що стосуються цієї події, виходять за межі механічної роботи системи. Це більше стосується способу моделювання ділової логіки.) Ваші оновники перегляду повинні знати, як перевести кожну конкретну подію в точна зміна перегляду (тобто оновити лише те, що змінилося).
Як визначити узгоджений та масштабований скелет за надісланими даними? це повідомлення про оновлення моделі чи повідомлення "сталася помилка з blahblahblah"
Я б сказав, що це велике, відкрите запитання, яке слід розбити на кілька інших питань і розмістити окремо.
В цілому, ваша система зворотного зв'язку повинна створювати та відправляти події для важливих подій у вашому бізнесі. Вони могли надходити із зовнішніх каналів або від активності в самій задній частині.
Як не надсилати дані про все з будь-якого місця бекенда?
Використовуйте шаблон публікації / підписки . Коли ваш SPA завантажує нову сторінку, яка зацікавлена отримувати оновлення в режимі реального часу, вона повинна підписатись лише на ті події, які вона може використовувати, і викликати логіку оновлення перегляду, коли ці події надходять. Можливо, вам потрібна логіка pub / sub сервер для зменшення навантаження на мережу. Бібліотеки існують для Websocket pub / sub, але я не впевнений, що це в екосистемі Rails.
Як зменшити дублювання ділової логіки як на сервері, так і на стороні клієнта?
Це здається, що вам доведеться оновити дані перегляду як на клієнті, так і на сервері. Думаю, вам потрібні дані перегляду на стороні сервера, щоб мати знімок, щоб запустити клієнта в реальному часі. Оскільки існують дві мови / платформи (Ruby та Javascript), логіку оновлення перегляду доведеться записати в обох. Окрім трансляції (у якої є свої проблеми), я не бачу цього шляху.
Технічний момент: Маніпулювання даними (оновлення перегляду) - це не бізнес-логіка. Якщо ви маєте на увазі використання перевірки регістру, то це здається неминучим, оскільки перевірки клієнта необхідні для хорошого користувальницького досвіду, але сервер не може довіряти їм.
Ось як я бачу таку річ структурованою.
Перегляди клієнта:
- Потрібно записувати знімок перегляду та номер останнього перегляду події перегляду
- Це дозволить популяризувати представлення даних, щоб клієнту не довелося будувати з нуля.
- Для простоти може бути більше HTTP GET
- Встановлює з'єднання через веб-розетку і підписується на конкретні події, починаючи з номера останньої події перегляду.
- Отримує події через websocket і оновлює його подання на основі типу / даних події.
Команди клієнта:
- Попросити зміни даних (HTTP PUT / POST / DELETE)
- Відповідь - це лише успіх чи невдача + помилка
- (Подія, породжена зміною, перейде через веб-розетку і спричинить оновлення перегляду.)
Сторона сервера насправді може бути розбита на кілька компонентів з обмеженими обов'язками. Той, який просто обробляє вхідні запити та створює події. Інший може керувати підписками клієнтів, слухати події (скажімо, під час роботи) та пересилати підписникам відповідні події. У вас може бути третина, яка слухає події та оновлює перегляди на стороні сервера - можливо, це трапляється навіть до того, як підписники отримають події.
Те, що я описав, - це форма CQRS + Messaging та типова стратегія вирішення типу проблем, з якими ви стикаєтесь.
Я не вніс події Sourcing в цей опис, оскільки я не впевнений, чи це ви хочете взяти на себе, чи вам це потрібно обов'язково. Але це пов'язана закономірність.