Làm cách nào để cấu trúc dữ liệu được gửi từ máy chủ đến người dùng?
Sử dụng mẫu tin nhắn . Chà, bạn đã sử dụng một giao thức nhắn tin, nhưng ý tôi là cấu trúc các thay đổi dưới dạng tin nhắn ... cụ thể là các sự kiện. Khi phía máy chủ thay đổi, điều đó dẫn đến các sự kiện kinh doanh. Trong kịch bản của bạn, quan điểm khách hàng của bạn quan tâm đến những sự kiện này. Các sự kiện nên chứa tất cả dữ liệu liên quan đến thay đổi đó (không nhất thiết là tất cả dữ liệu xem). Trang khách sau đó sẽ cập nhật các phần của chế độ xem mà nó đang duy trì với dữ liệu sự kiện.
Ví dụ: nếu bạn đang cập nhật mã chứng khoán và AAPL đã thay đổi, bạn sẽ không muốn đẩy tất cả giá cổ phiếu xuống hoặc thậm chí tất cả dữ liệu về AAPL (tên, mô tả, v.v.). Bạn sẽ chỉ đẩy AAPL, đồng bằng và giá mới. Trên máy khách, sau đó bạn sẽ chỉ cập nhật giá cổ phiếu đó trên chế độ xem.
Tôi có nên chỉ gửi các sự kiện như "tài nguyên này đã được cập nhật và bạn nên tải lại thông qua cuộc gọi AJAX" hoặc đẩy dữ liệu cập nhật và thay thế dữ liệu trước đó được tải qua các cuộc gọi AJAX ban đầu?
Tôi cũng không nói. Nếu bạn đang gửi sự kiện, hãy tiếp tục và gửi dữ liệu có liên quan với nó (không phải toàn bộ dữ liệu của đối tượng). Đặt tên cho loại sự kiện này. (Việc đặt tên và dữ liệu nào có liên quan đến sự kiện đó nằm ngoài phạm vi hoạt động cơ học của hệ thống. Điều này có liên quan nhiều hơn đến cách logic kinh doanh được mô hình hóa.) Trình cập nhật chế độ xem của bạn cần biết cách dịch từng sự kiện cụ thể vào thay đổi chế độ xem chính xác (nghĩa là chỉ cập nhật những gì đã thay đổi).
Làm thế nào để xác định một bộ xương mạch lạc và có thể mở rộng để dữ liệu được gửi? Đây có phải là thông báo cập nhật mô hình hay thông báo "có lỗi với blahblahblah"
Tôi muốn nói rằng đây là một câu hỏi lớn, kết thúc mở nên được chia thành nhiều câu hỏi khác và được đăng riêng.
Nhìn chung, hệ thống back end của bạn sẽ tạo và gửi các sự kiện cho những sự kiện quan trọng đến doanh nghiệp của bạn. Những người có thể đến từ nguồn cấp dữ liệu bên ngoài hoặc từ hoạt động trong chính back-end.
Làm thế nào để không gửi dữ liệu về mọi thứ từ bất cứ đâu trong phụ trợ?
Sử dụng xuất bản / đăng ký . Khi SPA của bạn tải một trang mới quan tâm đến việc nhận các cập nhật theo thời gian thực, trang sẽ chỉ đăng ký những sự kiện mà nó có thể sử dụng và gọi logic cập nhật chế độ xem khi các sự kiện đó đến. Bạn có thể sẽ cần logic pub / sub máy chủ để giảm tải mạng. Các thư viện tồn tại cho quán rượu / phụ Websocket, nhưng tôi không chắc những thứ đó trong hệ sinh thái Rails.
Làm thế nào để giảm trùng lặp logic nghiệp vụ cả trên máy chủ và phía máy khách?
Có vẻ như bạn phải cập nhật dữ liệu xem trên cả máy khách và máy chủ. Tôi đoán là bạn cần dữ liệu xem phía máy chủ để bạn có ảnh chụp nhanh để bắt đầu ứng dụng khách thời gian thực. Do có hai ngôn ngữ / nền tảng liên quan (Ruby và Javascript), logic cập nhật khung nhìn sẽ phải được viết bằng cả hai. Ngoài việc dịch mã (có vấn đề riêng), tôi không thấy cách nào khác.
Điểm kỹ thuật: Thao tác dữ liệu (xem cập nhật) không phải là logic nghiệp vụ. Nếu bạn có nghĩa là xác thực trường hợp sử dụng, thì điều đó dường như là không thể tránh khỏi vì việc xác thực của khách hàng là cần thiết cho trải nghiệm người dùng tốt, nhưng cuối cùng không thể được máy chủ tin cậy.
Đây là cách tôi thấy một điều như vậy có cấu trúc tốt.
Lượt xem của khách hàng:
- Yêu cầu ảnh chụp nhanh và số sự kiện nhìn thấy lần cuối của chế độ xem
- Điều này sẽ chuẩn bị trước khung nhìn để khách hàng không phải xây dựng từ đầu.
- Có thể vượt qua HTTP GET để đơn giản
- Tạo kết nối websocket và đăng ký các sự kiện cụ thể, bắt đầu từ số sự kiện cuối cùng của chế độ xem.
- Nhận các sự kiện qua websocket và cập nhật chế độ xem dựa trên loại / dữ liệu sự kiện.
Các lệnh của khách hàng:
- Yêu cầu thay đổi dữ liệu (HTTP PUT / POST / DELETE)
- Phản hồi chỉ là thành công hay thất bại + lỗi
- (Các sự kiện được tạo bởi thay đổi sẽ xuất hiện trên websocket và kích hoạt cập nhật chế độ xem.)
Phía máy chủ thực sự có thể được chia thành nhiều thành phần với trách nhiệm hạn chế. Một trong đó chỉ xử lý các yêu cầu đến và tạo sự kiện. Một người khác có thể quản lý đăng ký của khách hàng, lắng nghe các sự kiện (nói trong quá trình) và chuyển tiếp các sự kiện phù hợp cho người đăng ký. Bạn có thể có một phần ba lắng nghe các sự kiện và cập nhật các chế độ xem phía máy chủ - có thể điều này thậm chí xảy ra trước khi người đăng ký nhận được các sự kiện.
Những gì tôi đã mô tả là một hình thức nhắn tin CQRS + và một chiến lược điển hình để giải quyết các loại vấn đề bạn đang gặp phải.
Tôi đã không đưa Nguồn sự kiện vào mô tả này vì tôi không chắc đó là thứ gì đó bạn muốn đảm nhận hay nếu bạn cần nó. Nhưng nó là một mô hình liên quan.