Tôi nghĩ rằng bạn có thể có một quy trình người dùng để thực hiện không khớp ở đây.
Đầu tiên: người dùng có thực sự muốn thực hiện đồng thời nhiều thay đổi cho một tệp không? Việc đổi tên (có thể bao gồm hoặc không bao gồm thay đổi đường dẫn?), Thay đổi quyền sở hữu và có thể thay đổi nội dung tệp (vì lý do tranh luận) có vẻ như là các hành động riêng biệt.
Hãy xem trường hợp câu trả lời là "có" - người dùng của bạn thực sự muốn thực hiện những thay đổi này cùng một lúc.
Trong trường hợp đó, tôi mạnh mẽ khuyên bạn chống lại bất kỳ thực hiện mà gửi nhiều sự kiện - RenameFileCommand
, MoveFileCommand
, ChangeOwnerCommand
- đại diện này đơn mục đích sử dụng.
Tại sao? Bởi vì các sự kiện có thể thất bại. Có thể nó cực kỳ hiếm, nhưng người dùng của bạn đã gửi một hoạt động trông có vẻ nguyên tử - nếu một trong những sự kiện xuôi dòng không thành công, thì trạng thái ứng dụng của bạn hiện không hợp lệ.
Bạn cũng đang mời các mối nguy hiểm chủng tộc trên một tài nguyên được chia sẻ rõ ràng giữa mỗi người xử lý sự kiện. Bạn sẽ cần phải viết "ChangeOwnerCommand" theo cách mà tên tệp và đường dẫn tệp không quan trọng, vì chúng có thể bị lỗi thời trước khi nhận được lệnh.
Khi triển khai một hệ thống nghỉ ngơi không do sự kiện điều khiển với việc di chuyển và đổi tên tệp, tôi thích đảm bảo tính nhất quán bằng cách sử dụng một cái gì đó giống như hệ thống eTag - đảm bảo rằng phiên bản của tài nguyên đang được chỉnh sửa là phiên bản mà người dùng truy xuất lần cuối và thất bại nếu nó đã được sửa đổi kể từ đó. Nhưng nếu bạn đang gửi nhiều lệnh cho thao tác người dùng này, bạn sẽ cần tăng phiên bản tài nguyên của mình sau mỗi lệnh - vì vậy bạn không có cách nào để biết rằng tài nguyên mà người dùng đang chỉnh sửa thực sự là phiên bản giống như tài nguyên họ đọc lần cuối .
Điều tôi muốn nói là - nếu người khác thực hiện một thao tác khác trên tệp gần như cùng một lúc. 6 lệnh có thể xếp chồng lên nhau theo bất kỳ thứ tự nào. Nếu chúng ta chỉ có 2 lệnh nguyên tử, lệnh trước đó có thể thành công và lệnh sau có thể thất bại "tài nguyên đã bị sửa đổi kể từ lần lấy cuối cùng". Nhưng không có sự bảo vệ chống lại điều này khi các lệnh không phải là nguyên tử, do đó tính nhất quán của hệ thống bị vi phạm.
Điều thú vị là có một phong trào hướng tới một cái gì đó giống như kiến trúc dựa trên sự kiện trong REST, được gọi là "Nghỉ ngơi mà không cần PUT", được đề xuất trong radar công nghệ Th Thinkworks, tháng 1 năm 2015 . Có một blog dài hơn đáng kể về Nghỉ ngơi mà không cần PUT ở đây .
Về cơ bản, ý tưởng là POST, PUT, DELETE và GET đều tốt cho các ứng dụng nhỏ, nhưng khi bạn cần bắt đầu giả định cách đặt và đăng và xóa có thể được diễn giải ở đầu kia, bạn giới thiệu khớp nối. (ví dụ: "khi tôi XÓA tài nguyên được liên kết với tài khoản ngân hàng của mình, tài khoản sẽ bị đóng") Và giải pháp được đề xuất là xử lý REST theo cách có nguồn gốc Sự kiện hơn. tức là cho phép POST mục đích của người dùng dưới dạng một tài nguyên sự kiện.
Các trường hợp khác là đơn giản hơn. Nếu người dùng của bạn không muốn thực hiện tất cả các hoạt động đó cùng một lúc, đừng để họ. POST một sự kiện cho mỗi ý định người dùng. Bây giờ bạn có thể sử dụng phiên bản etag trên tài nguyên của bạn.
Đối với các ứng dụng khác đang sử dụng API rất khác với tài nguyên của bạn. Điều đó có mùi như rắc rối. Bạn có thể xây dựng một mặt tiền của API cũ trên đầu API RESTful của bạn và chỉ chúng ở mặt tiền không? tức là phơi bày một dịch vụ thực hiện nhiều cập nhật cho một tệp theo trình tự thông qua máy chủ REST?
Nếu bạn không xây dựng giao diện RESTful trên đầu giải pháp cũ, cũng không xây dựng mặt tiền của giao diện cũ trên đầu giải pháp REST và cố gắng duy trì cả hai API trỏ vào tài nguyên dữ liệu dùng chung, bạn sẽ gặp phải những vấn đề đau đầu.