2010-11-15 45 views
13

Tôi đang triển khai mã đồng bộ đầu tiên của mình. Trong trường hợp của tôi, tôi sẽ có 2 loại máy khách iOS cho mỗi người dùng sẽ đồng bộ bản ghi với máy chủ bằng cách sử dụng lastSyncTimestamp, số nguyên 64 bit thể hiện kỷ nguyên Unix trong mili giây của lần đồng bộ hóa cuối cùng. Các bản ghi có thể được tạo trên máy chủ hoặc máy khách bất kỳ lúc nào và các bản ghi được trao đổi dưới dạng JSON qua HTTP.Những cạm bẫy phổ biến của đồng bộ hóa dựa trên dấu thời gian là gì?

Tôi không lo lắng về xung đột vì có vài cập nhật và luôn luôn từ cùng một người dùng. Tuy nhiên, tôi tự hỏi nếu có những điều phổ biến mà tôi cần phải nhận thức được rằng có thể đi sai với một phương pháp dựa trên dấu thời gian như đồng bộ hóa trong thời gian tiết kiệm ánh sáng ban ngày, đồng bộ xung đột với nhau hoặc gotchas khác.

Tôi biết rằng git và một số hệ thống điều khiển phiên bản khác sẽ đồng bộ hóa với dấu thời gian cho một phương pháp tiếp cận đồng bộ hóa thương lượng dựa trên nội dung. Tôi cũng có thể tưởng tượng một cách tiếp cận cho các ứng dụng của mình, khi sử dụng các đối tượng uuid hoặc hash của các đối tượng, cả hai đều thông báo đối tượng nào họ sở hữu và sau đó trao đổi chúng cho đến khi cả hai cùng có cùng tập hợp.

Nếu ai biết bất kỳ ưu điểm hay nhược điểm nào của đồng bộ hóa dựa trên nội dung so với đồng bộ dựa trên dấu thời gian nói chung cũng sẽ hữu ích.

Chỉnh sửa - Dưới đây là một số ưu điểm/nhược điểm mà tôi đã đưa ra để xác định thời gian và đồng bộ hóa nội dung. Hãy thử thách/chính xác.

Lưu ý - Tôi đang xác định đồng bộ dựa trên nội dung như cách đàm phán đơn giản 2 bộ đối tượng chẳng hạn như cách 2 đứa trẻ trao đổi thẻ nếu bạn cho mỗi phần của một đống lộn xộn nói với họ rằng khi họ nhìn qua họ để công bố và bàn giao bất kỳ bản sao họ tìm thấy cho người khác cho đến khi cả hai đều có bộ giống hệt nhau.

  • Johnny - "Tôi nhận được thẻ này".
  • Davey - "Tôi đã nhận được một loạt thẻ. Hãy cho tôi thẻ đó."
  • Johnny - "Đây là thẻ của bạn. Ghim loạt thẻ đó đi."
  • Davey - "Đây là nhóm thẻ của bạn".
  • ....
  • Cả hai - "Chúng tôi đang thực hiện"

Ưu điểm của dấu thời gian dựa trên đồng bộ

  • dễ dàng để thực hiện
  • tài sản đơn sử dụng cho đồng bộ.

Nhược điểm của dấu thời gian dựa trên đồng bộ

  • Thời gian là một khái niệm tương đối với người quan sát và đồng hồ máy khác nhau có thể không được đồng bộ. Có một vài cách để giải quyết vấn đề này. Tạo dấu thời gian trên một máy tính duy nhất, không quy mô tốt và đại diện cho một điểm lỗi. Hoặc sử dụng các đồng hồ logic như đồng hồ vectơ. Đối với các nhà phát triển trung bình xây dựng hệ thống riêng của họ, đồng hồ vector có thể quá phức tạp để thực hiện.
  • Đồng bộ hóa dựa trên dấu thời gian hoạt động để máy khách đồng bộ hóa chính nhưng không hoạt động tốt cho đồng bộ ngang hàng hoặc đồng bộ hóa có thể xảy ra với 2 chủ.
  • Lỗi đơn lẻ, bất kỳ điều gì tạo dấu thời gian.
  • Thời gian không thực sự liên quan đến nội dung của những gì đang được đồng bộ hóa.

Ưu điểm của nội dung dựa trên đồng bộ

  • Không per peer timestamp cần phải được duy trì. 2 đồng nghiệp có thể bắt đầu phiên đồng bộ hóa và bắt đầu đồng bộ hóa dựa trên nội dung.
  • Điểm cuối được xác định rõ ràng để đồng bộ hóa - khi cả hai bên có bộ giống hệt nhau.
  • Cho phép kiến ​​trúc ngang hàng, nơi bất kỳ người ngang hàng nào có thể hoạt động như máy khách hoặc máy chủ, với điều kiện họ có thể lưu trữ máy chủ HTTP.
  • Đồng bộ hóa hoạt động với nội dung của bộ, chứ không phải với thời gian khái niệm trừu tượng.
  • Vì đồng bộ được xây dựng xung quanh nội dung, đồng bộ hóa có thể được sử dụng để xác minh nội dung nếu muốn. Ví dụ. một hàm băm SHA-1 có thể được tính toán trên nội dung và được sử dụng như uuid. Nó có thể được so sánh với những gì được gửi trong quá trình đồng bộ hóa.
  • Hơn nữa, hàm băm SHA-1 có thể dựa trên các băm trước để duy trì lịch sử nội dung nhất quán.

Nhược điểm của nội dung dựa trên đồng bộ

  • tính thêm vào đối tượng của bạn có thể cần thiết để thực hiện.
  • Nhiều logic hơn trên cả hai mặt so với đồng bộ hóa dựa trên dấu thời gian.
  • Giao thức trò chuyện nhiều hơn một chút (điều này có thể được điều chỉnh bằng cách đồng bộ hóa nội dung trong các cụm).

Trả lời

1

Tôi không biết nếu nó áp dụng trong môi trường của bạn, nhưng bạn có thể xem thời gian của họ là "đúng", khách hàng hoặc máy chủ (hoặc nếu nó quan trọng)? Nếu tất cả các máy khách và tất cả các máy chủ không được đồng bộ hóa với cùng một nguồn thời gian thì có thể có khả năng, tuy nhiên, một khách hàng sẽ nhận được kết quả không mong muốn khi đồng bộ hóa (hoặc từ) máy chủ bằng thời gian "hiện tại" của máy khách.

Tổ chức phát triển của chúng tôi thực sự gặp phải một số vấn đề với điều này vài năm trước. Các máy phát triển không được đồng bộ hóa với cùng một nguồn thời gian như máy chủ nơi SCM cư trú (và có thể không được đồng bộ hóa với bất kỳ nguồn thời gian nào, do đó thời gian máy của nhà phát triển có thể trôi dạt). Một máy phát triển có thể mất vài phút sau một vài tháng. Tôi không nhớ tất cả các vấn đề, nhưng nó có vẻ như quá trình xây dựng đã cố gắng để có được tất cả các tập tin sửa đổi kể từ một thời gian nhất định (xây dựng cuối cùng). Các tệp có thể đã được đăng ký, kể từ lần xây dựng cuối cùng, có thời gian sửa đổi (từ ứng dụng khách) đã xảy ra TRƯỚC lần xây dựng cuối cùng.

Có thể là các quy trình SCM của chúng tôi không tốt lắm, hoặc hệ thống SCM hoặc quá trình xây dựng của chúng tôi rất nhạy cảm với vấn đề này. Thậm chí ngày nay, tất cả các máy phát triển của chúng tôi đều phải đồng bộ thời gian với máy chủ có hệ thống SCM của chúng tôi trên đó.

Một lần nữa, đây là vài năm trước và tôi không thể nhớ lại chi tiết, nhưng tôi muốn đề cập đến nó về khả năng nó quan trọng trong trường hợp của bạn.

+0

Điểm tốt. Gotcha # 1, luôn sử dụng một máy tính để tính thời gian. Tôi đã không xem xét điều này nhưng tôi có lẽ nên luôn luôn sản xuất lastSyncTimestamp trên máy chủ. –

7

Một phần của vấn đề là thời gian không phải là một khái niệm tuyệt đối. Cho dù một cái gì đó xảy ra trước hoặc sau cái gì đó khác là vấn đề quan điểm, không phải là tuân thủ đồng hồ treo tường.

đọc lên một chút về relativity of simultaneity để hiểu tại sao mọi người đã ngừng cố gắng sử dụng thời gian tường cho tìm những điều này ra ngoài và đã chuyển sang các cấu trúc đại diện cho quan hệ nhân quả thực tế sử dụng vector clocks (hoặc ít nhất Lamport clocks).

Nếu bạn muốn sử dụng đồng hồ để đồng bộ hóa, đồng hồ logic sẽ phù hợp với bạn nhất. Bạn sẽ tránh tất cả các sự cố đồng bộ hóa đồng hồ và nội dung của bạn.

+0

+1 cho tham chiếu đồng hồ vectơ. Những điều tuyệt vời để biết! :-) –

+0

Cảm ơn Dustin, tôi nhận ra đồng hồ vectơ thường được sử dụng để đồng bộ hóa một bộ máy nhưng đồng hồ logic được sử dụng phổ biến cho việc đồng bộ hóa đơn giản vì các kịch bản dấu thời gian gần nhất giống như tôi đang xem xét? Bạn có biết bất kỳ ví dụ hoặc làm thế nào tôi sẽ làm điều đó? –

+0

Tôi sẽ tưởng tượng nếu máy chủ của bạn hoạt động như một sự thật trung tâm (tức là không phải đồng bộ ngang hàng), thời gian của nó có thể là vấn đề duy nhất quan trọng. Ví dụ: thời gian giao dịch cho một phiên đồng bộ hóa cụ thể đã hoàn thành. –

0

Bạn có thể xem unison. Nó dựa trên tập tin nhưng bạn có thể tìm thấy một số ý tưởng thú vị.

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