2009-01-02 39 views
35

Nếu có tài nguyên REST mà tôi muốn theo dõi các thay đổi hoặc sửa đổi từ các ứng dụng khách khác, cách tốt nhất (và hầu hết là RESTful) là làm như thế nào?Cách RESTful để theo dõi một tài nguyên REST cho các thay đổi là gì?

Một ý tưởng tôi đã có để làm như vậy là cung cấp các tài nguyên cụ thể sẽ giữ kết nối mở thay vì quay trở lại ngay lập tức nếu tài nguyên chưa tồn tại. Ví dụ: được cung cấp tài nguyên:

/game/17/playerToMove 

một "GET" trên tài nguyên này có thể cho tôi biết đến lượt của đối thủ di chuyển. Thay vì liên tục bỏ phiếu tài nguyên này để tìm hiểu khi đến lượt tôi phải di chuyển, tôi có thể lưu ý số lượng di chuyển (ví dụ 5) và cố gắng để lấy lại di chuyển tiếp theo:

/game/17/move/5 

Trong một mô hình còn lại "bình thường", nó dường như yêu cầu GET cho URL này sẽ trả về lỗi 404 (không tìm thấy). Tuy nhiên, nếu thay vào đó, máy chủ sẽ giữ kết nối mở cho đến khi đối thủ của tôi thực hiện di chuyển của mình, nghĩa là:

thì máy chủ có thể trả lại nội dung mà đối thủ PUT của tôi vào tài nguyên đó. Cả hai điều này sẽ cung cấp cho tôi dữ liệu tôi cần, cũng như một loại thông báo khi đối thủ của tôi đã di chuyển mà không yêu cầu bỏ phiếu.

Đây có phải là loại lược đồ RESTful không? Hoặc nó vi phạm một số loại nguyên tắc REST?

+1

"Cách _rest_ để làm điều này là gì, Scrappy?" –

+0

Bạn có thể sử dụng tính năng bỏ phiếu dài hoặc kết hợp REST với dịch vụ websocket, gửi các sự kiện tới máy khách. – inf3rno

Trả lời

24

Giải pháp được đề xuất của bạn có vẻ như long polling, có thể hoạt động thực sự tốt.

Bạn sẽ yêu cầu /game/17/move/5 và máy chủ sẽ không gửi bất kỳ dữ liệu nào cho đến khi di chuyển 5 đã được hoàn tất. Nếu kết nối bị ngắt hoặc bạn có thời gian chờ, bạn chỉ cần kết nối lại cho đến khi bạn nhận được phản hồi hợp lệ.

Lợi ích của việc này là rất nhanh - ngay khi máy chủ có dữ liệu mới, khách hàng sẽ nhận được dữ liệu đó. Nó cũng có khả năng phục hồi các kết nối bị ngắt và hoạt động nếu máy khách bị ngắt kết nối trong một thời gian (bạn có thể yêu cầu /game/17/move/5 một giờ sau khi được di chuyển và nhận dữ liệu ngay lập tức, sau đó di chuyển lên move/6/ và cứ thế)

Vấn đề với thời gian dài bỏ phiếu là mỗi "thăm dò ý kiến" quan hệ một chủ đề máy chủ, mà nhanh chóng phá vỡ các máy chủ như Apache (vì nó chạy ra khỏi chủ đề công nhân, vì vậy không thể chấp nhận các yêu cầu khác). Bạn cần một máy chủ web chuyên dụng để phục vụ các yêu cầu bỏ phiếu dài .. Mô-đun Python twisted (một "công cụ kết nối theo hướng sự kiện") là điều tuyệt vời cho việc này, nhưng nó hoạt động nhiều hơn bình thường ..

Trả lời nhận xét của bạn về Jetty/Tomcat, tôi không có kinh nghiệm với Java, nhưng có vẻ như cả hai đều sử dụng hệ thống luồng công việc-chủ đề tương tự với Apache, vì vậy nó sẽ có cùng một vấn đề . Tôi đã tìm thấy this post dường như giải quyết chính xác vấn đề này (đối với Tomcat)

+0

Tôi đang sử dụng Jetty làm Java thùng chứa servlet. Dường như nó hoạt động tốt cho "cuộc bỏ phiếu dài". Liệu nó có cùng một vấn đề với Apache (cụ thể là, chạy ra khỏi các chuỗi công việc)? Còn Tomcat thì sao? – Ross

+0

Để tránh buộc các luồng, bạn có thể sử dụng trình xử lý HTTP không đồng bộ asp.net. Điều này cho phép các chủ đề trở lại hồ bơi thread. –

2

Tôi tìm thấy this article đề xuất tiêu đề HTTP mới, "Khi được sửa đổi-sau", về cơ bản thực hiện tương tự - máy chủ đợi và giữ kết nối mở cho đến khi tài nguyên được sửa đổi.

Tôi thích phương pháp dựa trên phiên bản hơn là phương pháp dựa trên dấu thời gian vì nó ít dễ bị điều kiện chủng tộc và cung cấp cho bạn thêm một chút thông tin về nội dung bạn đang truy xuất. Bất kỳ suy nghĩ nào về cách tiếp cận này?

+0

Cách tiếp cận dựa trên phiên bản sẽ sử dụng tiêu đề HTTP ETag. http://en.wikipedia.org/wiki/HTTP_ETag – Chase

2

Tôi muốn đề xuất 404, nếu khách hàng dự định của bạn là trình duyệt web, vì việc giữ kết nối mở có thể chủ động chặn các yêu cầu của trình duyệt trong ứng dụng đến cùng một miền. Đó là tùy thuộc vào khách hàng thường xuyên như thế nào để thăm dò ý kiến.

+0

Đó là loại lạm dụng sai sót (cách bạn phát hiện 404 thực tế vì bạn đã yêu cầu/game/x14 không/game/14) .. Trả về {'error' : 'không có nội dung mới'} hoặc nội dung nào đó sẽ ít vấn đề hơn .. – dbr

+3

không, bởi vì cho đến khi bước 14 được thực hiện, tài nguyên không tồn tại ... đó là một 404 thích hợp. – Tracker1

Các vấn đề liên quan