2009-03-11 30 views
6

Tôi đang làm việc đồng bộ hóa hai đối tượng kinh doanh giữa iPhone và trang Web bằng cách sử dụng tải trọng dựa trên XML và rất muốn thu hút một số ý tưởng cho một thói quen tối ưu. Tuy nhiên, bản chất của câu hỏi này là khá phổ biến và tôi có thể thấy nó có thể áp dụng cho nhiều hệ thống khác nhau cần đồng bộ các đối tượng kinh doanh giữa thực thể web và khách hàng (máy tính để bàn, điện thoại di động, v.v.)Đồng bộ hóa các đối tượng giữa hai hệ thống khác nhau, cách tiếp cận tốt nhất?

Các đối tượng kinh doanh có thể được chỉnh sửa, xóa và cập nhật ở cả hai bên. Cả hai bên có thể lưu trữ đối tượng cục bộ nhưng đồng bộ chỉ được bắt đầu ở phía iPhone để xem bị ngắt kết nối. Tất cả các đối tượng đều có một dấu thời gian updated_at và created_at và được hỗ trợ bởi một RDBMS trên cả hai mặt (SQLite ở bên iPhone và MySQL trên web ... một lần nữa tôi không nghĩ rằng vấn đề này nhiều) và điện thoại ghi lại lần cuối cùng đồng bộ đã được thử. Nếu không, không có dữ liệu nào khác được lưu trữ (tại thời điểm này).

Thuật toán nào bạn sẽ sử dụng để giảm thiểu cuộc trò chuyện mạng giữa các hệ thống để đồng bộ hóa? Làm thế nào bạn sẽ xử lý xóa nếu "xóa mềm" không phải là một lựa chọn? Bạn sẽ thêm những thay đổi về mô hình dữ liệu nào để tạo điều kiện thuận lợi cho điều này?

Trả lời

11

Cách tiếp cận đơn giản nhất: khi đồng bộ hóa, chuyển tất cả các bản ghi where updated_at >= @last_sync_at. Down side: cách tiếp cận này không chịu đựng đồng hồ nghiêng rất tốt ở tất cả. Có thể an toàn hơn để giữ một cột số phiên bản được tăng lên mỗi khi một hàng được cập nhật (để đồng hồ nghiêng không làm hỏng quá trình đồng bộ hóa của bạn) và số phiên bản được đồng bộ hóa cuối cùng (để các thay đổi có thể xung đột có thể Được xác định). Để làm cho hiệu quả băng thông này, hãy lưu bộ nhớ cache trong mỗi cơ sở dữ liệu của phiên bản cuối cùng được gửi tới mỗi bản sao ngang hàng sao cho chỉ các hàng được sửa đổi mới cần được truyền đi. Nếu đây là một cấu trúc liên kết hình sao, các lá có thể sử dụng giản đồ đơn giản, nơi phiên bản được đồng bộ hóa cuối cùng được lưu trữ trong mỗi bảng.

Một số hình thức xóa mềm là bắt buộc để hỗ trợ đồng bộ hóa các xóa, tuy nhiên điều này có thể dưới dạng bản ghi "bia mộ" chỉ chứa khóa của hàng đã xóa. Tombstones chỉ có thể được xóa một cách an toàn khi bạn chắc chắn rằng tất cả các bản sao đã xử lý chúng, nếu không nó có thể cho một bản sao đáng kinh ngạc để hồi sinh một bản ghi bạn nghĩ rằng đã bị xóa.

+0

Cảm ơn phản hồi của bạn. Tôi nghĩ rằng vấn đề bạn đã đưa ra về thời gian nghiêng là quan trọng. Niềm hy vọng ban đầu của tôi là giữa NTP trên máy chủ và các dịch vụ đồng bộ hóa thời gian của iPhone/Touch với nhà cung cấp dịch vụ/máy tính - các vấn đề thời gian lệch sẽ được giảm nhẹ. Giả định này có quá nguy hiểm không? – hyuan

+0

Thật mỏng manh theo nhiều cách - ví dụ, đồng hồ được đặt lại ngược có thể gây ra các cập nhật bị nhỡ, và các cập nhật bị mất có thể dẫn đến các xung đột chỉnh sửa không bị phát hiện. Sao chép đa chủ là một nhiệm vụ không cần thiết. –

+0

Cảm ơn lời khuyên tốt bụng. Hy vọng rằng trong một vài tuần, bạn sẽ có thể nhìn thấy những thành quả của sự khôn ngoan của bạn. Các trang web trong câu hỏi đã được lên (www.ayenotes.com) nhưng các ứng dụng iPhone là không. – hyuan

0

Vì vậy, tôi nghĩ tóm lại câu hỏi của bạn liên quan đến đồng bộ hóa bị ngắt kết nối.

Vì vậy, đây là những gì tôi nghĩ nên xảy ra:

Sync Initial Bạn lấy dữ liệu và các thông tin liên kết với nó (phiên bản liên tiếp, tổng kiểm tra tập tin vv). điều quan trọng là bạn lưu trữ thông tin này và để nó nguyên sơ cho đến khi đồng bộ hóa thành công tiếp theo. Các thay đổi phải được thực hiện trên COPY của dữ liệu này.

Theo dõi thay đổi Nếu bạn đang xử lý các hàng cơ sở dữ liệu, ý tưởng là, về cơ bản bạn phải theo dõi các hoạt động chèn, cập nhật và xóa. Nếu bạn đang đối phó với các tập tin văn bản như xml, sau đó nó hơi phức tạp hơn. Nếu có khả năng nhiều người dùng sẽ chỉnh sửa tệp này cùng một lúc, thì bạn sẽ phải có công cụ khác, do đó xung đột có thể được phát hiện ở cấp độ chi tiết hơn (thay vì toàn bộ tệp).

Kiểm tra xung đột Một lần nữa nếu bạn chỉ xử lý các hàng cơ sở dữ liệu, các xung đột dễ phát hiện. Bạn có thể có một cột khác tăng bất cứ khi nào hàng được cập nhật (tôi nghĩ rằng mssql có nội trang này không chắc chắn về mysql). Vì vậy, nếu bản sao bạn có một số khác với số trên máy chủ thì bạn có xung đột. Đối với các tệp hoặc chuỗi, tổng kiểm tra sẽ thực hiện công việc. Tôi cho rằng bạn cũng có thể sử dụng ngày sửa đổi nhưng hãy chắc chắn rằng bạn có một phép đo rất chính xác và chính xác để ngăn chặn việc bỏ lỡ.ví dụ: cho phép nói rằng tôi lấy một tập tin và bạn lưu nó ngay sau khi tôi lấy nó. Giả sử thời gian chênh lệch là 1 mili giây. Sau đó tôi thực hiện các thay đổi đối với tệp sau đó tôi cố gắng lưu nó. Nếu thời gian sửa đổi cuối cùng được ghi lại chỉ chính xác đến 10 mili giây, thì có khả năng tệp tôi đã truy xuất sẽ có ngày sửa đổi giống như ngày bạn đã lưu để chương trình cho rằng không có xung đột và ghi đè thay đổi của bạn. Vì vậy, tôi thường không sử dụng phương pháp này chỉ để được ở bên an toàn. Mặt khác cơ hội của một cuộc kiểm tra/băm va chạm sau khi một sửa đổi nhỏ là gần không.

Giải quyết xung đột Bây giờ đây là phần khó khăn. Nếu đây là một quá trình tự động, thì bạn sẽ phải đánh giá tình hình và quyết định xem bạn có muốn ghi đè các thay đổi, mất các thay đổi hoặc truy xuất lại dữ liệu từ máy chủ và cố gắng làm lại các thay đổi. May mắn cho bạn, có vẻ như sẽ có sự tương tác của con người. Nhưng nó vẫn còn rất nhiều đau đớn để mã. Nếu bạn đang xử lý các hàng cơ sở dữ liệu, bạn có thể kiểm tra từng cột riêng lẻ và so sánh nó với dữ liệu trong máy chủ và trình bày nó cho người dùng. Ý tưởng là trình bày xung đột với người dùng theo cách rất chi tiết để không bị áp đảo họ. Hầu hết các xung đột có sự khác biệt rất nhỏ ở nhiều nơi khác nhau để trình bày cho người dùng một sự khác biệt nhỏ tại một thời điểm. Vì vậy, cho các tập tin văn bản, nó gần như giống nhau nhưng nhiều hơn một trăm lần phức tạp hơn. Vì vậy, về cơ bản, bạn sẽ phải tạo hoặc sử dụng công cụ khác (So sánh văn bản là một chủ đề hoàn toàn khác và quá rộng để đề cập ở đây) cho phép bạn biết những thay đổi nhỏ trong tệp và vị trí của chúng giống như trong cơ sở dữ liệu: nơi văn bản được chèn, xóa hoặc chỉnh sửa. Sau đó, trình bày cho người dùng theo cùng một cách. về cơ bản đối với mỗi xung đột nhỏ, người dùng sẽ phải chọn loại bỏ các thay đổi của họ, ghi đè các thay đổi trong máy chủ hoặc thực hiện chỉnh sửa thủ công trước khi gửi đến máy chủ.

Vì vậy, nếu bạn đã làm đúng, người dùng sẽ được cung cấp danh sách các xung đột nếu có. Những xung đột này nên đủ chi tiết để người dùng quyết định nhanh chóng. Vì vậy, ví dụ, xung đột là sự thay đổi chính tả, người dùng sẽ dễ dàng chọn từ cách viết ngược lại để cho người dùng toàn bộ đoạn văn và nói với anh ta rằng có sự thay đổi và họ phải quyết định phải làm gì , người dùng sau đó sẽ phải tìm kiếm lỗi chính tả nhỏ này.

Cân nhắc khác: Xác thực dữ liệu - hãy nhớ rằng bạn phải thực hiện xác thực sau khi giải quyết xung đột vì dữ liệu có thể đã thay đổi So sánh văn bản - như tôi đã nói, đây là chủ đề lớn. vì vậy google nó! Đồng bộ hóa bị ngắt kết nối - Tôi nghĩ có một số bài viết ngoài đó.

Nguồn: https://softwareengineering.stackexchange.com/questions/94634/synchronization-web-service-methodologies-or-papers

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