2010-08-20 34 views
5

Tôi đang làm việc trên một cái gì đó tương tự như pastebin (vâng, nó là rằng chung) nhưng cho phép chỉnh sửa nhiều người dùng. Vấn đề rõ ràng là nhiều người dùng đang cố chỉnh sửa cùng một tệp. Tôi đang suy nghĩ dọc theo các dòng khóa xuống khi một người dùng đang làm việc trên nó (nó không phải là giải pháp tốt nhất, nhưng tôi không cần bất cứ điều gì quá phức tạp), nhưng để ngăn chặn/cảnh báo người dùng tôi rõ ràng sẽ cần hệ thống để theo dõi các phiên chỉnh sửa của mỗi người dùng. Làm việc với cơ sở dữ liệu và ajax, tôi đang nghĩ đến hai giải pháp.Theo dõi các phiên của người dùng để ngăn chặn việc sửa đổi xung đột

Đầu tiên sẽ có trang chỉnh sửa ping máy chủ tại một khoảng thời gian tùy ý, nói một phút và nó sẽ cập nhật mục nhập phiên chỉnh sửa trong db. Sau đó, lần tiếp theo yêu cầu chỉnh sửa tập lệnh, nó sẽ kiểm tra ping gần đây nhất và nếu gần đây nhất là một thời gian tùy ý khác, hãy nói năm phút, sau đó chúng tôi giả định rằng người dùng trước đó đã bỏ và tệp có thể được chỉnh sửa lại. Tất nhiên, vấn đề với phương pháp này là giả định rằng người dùng trước đó đã bỏ qua chỉ đơn giản là một giả định. Anh ta có thể có kết nối wi-fi không ổn định và chỉ bỏ ra mười phút, tất cả thời gian với cửa sổ vẫn mở.

Tất nhiên, để xử lý vấn đề này, chúng tôi phải yêu cầu máy chủ phản hồi yêu cầu mới từ các phiên đã đóng trước đó với lỗi, yêu cầu phía khách hàng chỉ ra cho người dùng biết rằng phiên của anh ấy đã kết thúc , và sau đó đối phó với nó bằng cách, tiết kiệm nó như là một tập tin trên máy chủ và yêu cầu người dùng tự kết hợp nó, vv Nó đi mà không nói rằng điều này là khá khủng khiếp cho người dùng cuối.

Vì vậy, tôi đã nghĩ đến một giải pháp khác. Cũng có thể có sự kiện unload để kích hoạt khi phiên của người dùng kết thúc, nhưng tôi không thể chắc chắn liệu điều này có hoạt động đáng tin cậy hay không.

Có ai có giải pháp nào khác, thanh lịch hơn cho vấn đề này không?

Trả lời

6

Nếu bạn mong đợi số lần chỉnh sửa đồng thời cho tệp nhỏ, bạn chỉ có thể lưu số phiên bản cho tệp trong db và khi người dùng tải tệp xuống trình duyệt của họ, họ cũng nhận được số phiên bản. Họ chỉ được phép tải lên các thay đổi của họ nếu số phiên bản phù hợp. Người đầu tiên tải lên chiến thắng. Khi phát hiện xung đột, bạn nên gửi lại tệp mới nhất và các thay đổi của người dùng để người dùng có thể hợp nhất thủ công các thay đổi. Ưu điểm là công cụ này hoạt động ngay cả khi cùng một người dùng thực hiện hai chỉnh sửa đồng thời. Nếu tính năng này kết thúc thường xuyên được sử dụng, bạn có thể thêm việc hợp nhất phía máy khách tương tự như những gì một công cụ khác sử dụng (nhưng bạn có thể cần phải giữ lại các bản sửa đổi cũ trong trường hợp đó).

2

Có lẽ bạn nên sử dụng giải pháp "hợp nhất". Sử dụng phương pháp này, bạn chỉ cần kiểm tra các thay đổi khi người dùng đăng tài liệu của họ lên máy chủ.

Cách tiếp cận cơ bản sẽ là: 1. Một người dùng nhận được tài liệu để chỉnh sửa, tài liệu đang ở phiên bản 1 2. Người dùng B nhận được tài liệu để chỉnh sửa, tài liệu đang ở phiên bản 1 3. Người dùng B viết một số thay đổi , bao gồm số phiên bản cơ sở của 1 4. Máy chủ cập nhật tài liệu, tài liệu ngay tại phiên bản 2 5. Người dùng B đăng một số thay đổi, bao gồm số phiên bản cơ sở của 1 6. Máy chủ trả lời rằng tài liệu đã thay đổi kể từ khi người dùng bắt đầu chỉnh sửa và gửi cho người dùng tài liệu mới và phiên bản của họ - người dùng sau đó sẽ cần thực hiện bất kỳ việc hợp nhất các thay đổi nào của họ vào phiên bản tài liệu 2 và đăng lại máy chủ. Người dùng chủ yếu đang chỉnh sửa tài liệu phiên bản 2 7. Người dùng A đăng một số thay đổi, bao gồm số phiên bản của 2 8. Máy chủ cập nhật tài liệu, hiện đang ở phiên bản 3

Bạn vẫn có thể thực hiện "ping" mọi phút, để có được số phiên bản hiện tại - bạn đã biết phiên bản nào họ đang chỉnh sửa, vì vậy nếu có phiên bản mới, bạn có thể cho họ biết và cho phép họ tải xuống phiên bản mới nhất để thực hiện thay đổi.

Lợi ích chính của phương pháp này là người dùng không bao giờ khóa tệp, vì vậy bạn không cần bất kỳ "thời gian chờ" tùy ý nào.

+0

Đó là một câu trả lời tuyệt vời, nhưng thực sự không phải những gì tôi đang tìm kiếm: phần chỉnh sửa cộng tác thực sự nhỏ đối với phần chia sẻ, xin lỗi nếu tôi không làm rõ điều đó. Việc áp dụng giải pháp này sẽ làm cho mọi thứ trở nên phức tạp hơn * phức tạp hơn - quá phức tạp cho một ứng dụng chia sẻ văn bản/mã đơn giản. Số lượng các trường hợp rìa tôi cần phải xem xét sẽ là ... khá không thể cho sự phức tạp của tương tác người dùng ở đây. Tuy nhiên, câu trả lời tuyệt vời, và đã cho tôi một cái gì đó để mull trong khi tôi chờ đợi cho câu trả lời tiếp theo ... –

0

Tôi có thể nói bạn đang đi đúng hướng.Tôi có lẽ sẽ thực hiện một giải pháp lai:

Có một bảng duy nhất được gọi là "active_edits" hoặc một cái gì đó tương tự với cột cho document_id, người dùng và last_update_time. Giả sử thời gian ping của bạn là 1 phút và thời gian chờ của bạn là 5 phút. Vì vậy, trường hợp sử dụng sẽ giống như sau:

Bob sẽ mở một tài liệu. Nó kiểm tra last_update_time. Nếu nó cách đây hơn 5 phút, hãy cập nhật bảng với Bob và thời gian hiện tại. Nếu không, ai đó đang làm việc trên tài liệu, vì vậy hãy đưa ra một thông báo lỗi. Giả sử nó không được chỉnh sửa, Bob làm việc trên tài liệu trong một thời gian và khách hàng ping một thời gian cập nhật mỗi phút.

Tôi có thể nói do bao gồm nút "chỉnh sửa hoàn tất" và trình xử lý onunload. Onunload, từ những gì tôi hiểu có thể bị lung lay, nhưng cũng có thể thêm nó. Cả hai sẽ gửi một bài gửi duy nhất đến máy chủ nói rằng Bob đã hoàn thành. Ngay cả khi Bob không nhấn "hoàn thành chỉnh sửa" và onunload flakes ra, trường hợp xấu nhất là người dùng khác sẽ phải chờ thêm 5 phút để chỉnh sửa. Ưu điểm là nếu những công việc này bình thường (một giả định hợp lý) thì hệ thống hoạt động tốt hơn một chút.

Trong trường hợp bạn mô tả nơi Bob đang ở trên kết nối không dây kém hoặc nghỉ ngơi: Tôi sẽ nói đây không phải là vấn đề lớn. Chức năng ping của bạn phải đảm bảo rằng tài liệu chưa được người khác tiếp quản kể từ lần ping cuối cùng của Bob. Nếu có, chỉ cần cung cấp cho Bob một thông báo rằng "ai đó khác đã bắt đầu làm việc trên tài liệu" và cung cấp cho họ tùy chọn tải lại.

EDIT: Ngoài ra, tôi sẽ xem xét window.onbeforeunload, không onunload. Tôi tin rằng nó thực hiện trước đó. Tôi tin rằng đây là trang web chức năng (slashdot bao gồm) sử dụng để cho phép bạn xác nhận rằng bạn thực sự muốn rời khỏi trang. Tôi nghĩ nó hoạt động trong các trình duyệt chính ngoại trừ Opera.

0

Như với câu hỏi SO này How do you manage concurrent access to forms?, tôi sẽ không cố gắng thực hiện khóa bi quan. Nó chỉ đơn giản là quá khó khăn để có được làm việc đáng tin cậy trong một môi trường không quốc tịch. Thay vào đó, tôi sẽ sử dụng khóa lạc quan. Tuy nhiên, trong trường hợp này tôi sử dụng một cái gì đó giống như một băm SHA của tập tin để xác định nếu tập tin đã thay đổi kể từ khi người dùng đọc lần cuối từ tập tin. Đối với mỗi yêu cầu thay đổi tệp, bạn sẽ chạy hàm băm SHA của byte tệp và so sánh nó với phiên bản bạn đã kéo khi bạn đọc dữ liệu lần đầu tiên. Nếu đã thay đổi, bạn từ chối thay đổi và buộc người dùng phải thực hiện lại các chỉnh sửa của họ (kéo bản sao mới của nội dung tệp) hoặc bạn cung cấp giải pháp xung đột tốt hơn.

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