Tài nguyên ở đâu và là gì?
REST là tất cả về việc giải quyết các tài nguyên theo cách không trạng thái, có thể khám phá. Nó không phải được triển khai qua HTTP, cũng không phải dựa vào JSON hoặc XML, mặc dù chúng tôi khuyến nghị sử dụng định dạng dữ liệu hypermedia (xem nguyên tắc HATEOAS ) vì các liên kết và id là mong muốn.
Vì vậy, câu hỏi trở thành: Làm thế nào một người nghĩ về đồng bộ hóa về tài nguyên?
Đồng bộ hai chiều là gì? **
Đồng bộ hai chiều là quá trình cập nhật các tài nguyên có trên biểu đồ các nút để khi kết thúc quá trình, tất cả các nút đã cập nhật tài nguyên của chúng theo các quy tắc chi phối các tài nguyên đó. Thông thường, điều này được hiểu là tất cả các nút sẽ có phiên bản mới nhất của tài nguyên như hiện diện trong biểu đồ. Trong trường hợp đơn giản nhất, đồ thị bao gồm hai nút: cục bộ và từ xa. Địa phương bắt đầu đồng bộ.
Vì vậy, tài nguyên chính cần được xử lý là nhật ký giao dịch và do đó, quy trình đồng bộ hóa có thể giống như thế này đối với bộ sưu tập "vật phẩm" trong HTTP:
Bước 1 - Lấy địa chỉ nhật ký giao dịch
Địa phương: GET /remotehost/items/transactions?earliest=2000-01-01T12:34:56.789Z
Từ xa: 200 OK với phần thân chứa nhật ký giao dịch chứa các trường tương tự như thế này.
itemId
- UUID để cung cấp khóa chính được chia sẻ
updatedAt
- dấu thời gian để cung cấp điểm phối hợp khi dữ liệu được cập nhật lần cuối (giả sử rằng không cần lịch sử sửa đổi)
fingerprint
- hàm băm SHA1 của nội dung dữ liệu để so sánh nhanh nếu hết updateAt
vài giây
itemURI
- một URI đầy đủ cho mục để cho phép truy xuất sau
Bước 2 - Local so sánh nhật ký giao dịch từ xa với nhật ký giao dịch từ xa
Đây là ứng dụng của các quy tắc kinh doanh về cách đồng bộ hóa. Thông thường, itemId
sẽ xác định tài nguyên cục bộ, sau đó so sánh dấu vân tay. Nếu có một sự khác biệt thì một so sánh updatedAt
được thực hiện. Nếu chúng quá gần để gọi thì sẽ cần đưa ra quyết định để kéo dựa trên nút khác (có lẽ nó quan trọng hơn) hoặc đẩy sang nút khác (nút này quan trọng hơn). Nếu tài nguyên từ xa không có mặt cục bộ thì một mục đẩy được thực hiện (phần này chứa dữ liệu thực tế để chèn / cập nhật). Bất kỳ tài nguyên cục bộ nào không có trong nhật ký giao dịch từ xa được coi là không thay đổi.
Các yêu cầu kéo được thực hiện đối với nút từ xa để dữ liệu tồn tại cục bộ bằng cách sử dụng itemURI
. Chúng không được áp dụng tại địa phương cho đến sau này.
Bước 3 - Đẩy nhật ký giao dịch đồng bộ cục bộ vào từ xa
Local: PUT /remotehost/items/transactions
với phần thân chứa nhật ký giao dịch đồng bộ cục bộ.
Nút từ xa có thể xử lý việc này một cách đồng bộ (nếu nhỏ và nhanh) hoặc không đồng bộ (nghĩ 202 CHẤP NHẬN ) nếu nó có thể phải chịu nhiều chi phí. Giả sử một hoạt động đồng bộ, thì kết quả sẽ là 200 OK hoặc 409 CONFLICT tùy thuộc vào thành công hay thất bại. Trong trường hợp 409 CONFLICT , sau đó quá trình phải được bắt đầu lại do đã xảy ra lỗi khóa lạc quan tại nút từ xa (ai đó đã thay đổi dữ liệu trong quá trình đồng bộ hóa). Các cập nhật từ xa được xử lý theo giao dịch ứng dụng riêng của họ.
Bước 4 - Cập nhật cục bộ
Dữ liệu được kéo trong Bước 2 được áp dụng cục bộ theo giao dịch ứng dụng.
Mặc dù ở trên là không hoàn hảo (có một số tình huống mà cục bộ và từ xa có thể gặp rắc rối và có dữ liệu kéo từ xa cục bộ có thể hiệu quả hơn so với việc nhét nó vào một PUT lớn), nó chứng minh làm thế nào REST có thể được sử dụng trong một bi- quy trình đồng bộ hóa định hướng.