2008-12-23 79 views
13

Tôi đang tìm cách viết một khả năng đồng bộ hóa đơn giản vào ứng dụng của tôi và một trong những mối quan tâm đã nảy sinh là đồng bộ hóa thời gian giữa hai máy tính từ xa. cụ thể liên quan đến ngày sửa đổi tệp/đối tượng). Tôi chắc chắn có rất nhiều nghiên cứu đã được thực hiện về chủ đề này và không muốn quá lý thuyết, nhưng tôi tự hỏi liệu có bất kỳ phương pháp hay nhất nào được chấp nhận để giảm thiểu chênh lệch thời gian giữa các đồng hồ từ xa không? Không. Ví dụ: bắt đầu luôn sử dụng giờ quốc tế (UTC) để tránh các vấn đề về múi giờ, nhưng không đảm bảo rằng hai máy tính sẽ có cùng thời gian hệ thống giống nhau. May mắn thay, công việc tôi đang làm không phải là rất tốt, vì vậy nó không phải là một mối quan tâm khủng khiếp quan trọng, nhưng tôi vẫn còn tò mò.Đồng bộ hóa (đồng hồ) giữa hai máy tính từ xa

Một giải pháp sẽ là luôn sử dụng cùng một đồng hồ trên cả hai đầu, chẳng hạn như máy chủ thời gian toàn cầu, thay vì đồng hồ hệ thống cục bộ. Có lẽ điều này (kết hợp với khóa tài nguyên được chia sẻ) có thể đảm bảo không trùng lặp ngẫu nhiên thời gian được đồng bộ hóa, nhưng nó không thực tế lắm.

Một ý nghĩ chỉ xuất hiện trong đầu của tôi là đồng bộ hóa từng nút (mỗi khách hàng) với giá trị được tính toán tại một thời điểm trước đó, có thể bằng cách tính toán độ lệch của đồng hồ hệ thống với máy chủ thời gian toàn cầu. Điều này sẽ chỉ cần được thực hiện đôi khi bản thân bù đắp sẽ không có khả năng thay đổi đáng kể trong một khoảng thời gian ngắn.

Cập nhật: Hãy để tôi chỉ thêm rằng tôi không quan tâm đến việc thực sự đồng bộ hóa đồng hồ hệ thống của hai máy tính - Tôi cho rằng hệ điều hành sẽ xử lý điều này trong hầu hết các trường hợp. Đây chỉ là một câu hỏi làm thế nào để đảm bảo hai trường hợp của một ứng dụng đang sử dụng thời gian đồng bộ, mặc dù trong ngày và tuổi này, tôi cho rằng đồng hồ hệ thống gần như chắc chắn sẽ được đồng bộ hóa trong một số vùng đồng bằng rất nhỏ.

Trả lời

18

Dựa vào NTP cho ứng dụng của bạn như những người khác đã đề xuất là sự dễ dàng. Cách tiếp cận chính xác là sử dụng thuật toán đồng bộ hóa phân phối của Lamport. Nó được giải thích trong giấy cổ điển 1978 Time, clocks, and the ordering of events in a distributed system của ông.

+1

Tôi nhìn lên giấy của Lamport, và nó dường như được trích dẫn rộng rãi trong các cuộc thảo luận về đồng bộ hóa đồng hồ .. Thật không may, [có vẻ như] (http://www.amazon.com/Distributed-Systems-Principles-Paradigms-2nd/dp/0132392275) thuật toán này không phù hợp với các ứng dụng thời gian thực (như được thảo luận ở đây] (http://stackoverflow.com/questions/12760388/how-to-set-a-variable-that-represents-a- time-in-the-future-in-the-absolute-terms-obj)) .. bất kỳ lời khuyên nào về các thuật toán đồng bộ hóa đồng hồ thời gian thực không phụ thuộc vào NTP? – abbood

3

Đồng bộ hóa chúng với NTP Giao thức thời gian mạng.

Bạn đang sử dụng nền tảng nào?

Với NTP, bạn có thể đồng bộ hóa thời gian của máy tính với đồng hồ nguyên tử và sử dụng thời gian chính thức của thế giới.

+0

.NET, nhưng đó là câu hỏi lý thuyết nhiều hơn bất kỳ điều gì. – devios1

3

Thay vì viết mã để đồng bộ hóa đồng hồ, bạn sẽ không thể chạy một máy khách ntp trên cả hai máy? Ngoài ra, nếu không thể nói trên và ứng dụng của bạn đang chạy với đủ đặc quyền để đặt thời gian, tôi sẽ bị cám dỗ triển khai một ứng dụng NTP tối thiểu ngay trong ứng dụng và cố gắng đồng bộ hóa nó với máy chủ công cộng. Chỉ cần không mã hóa máy chủ cá nhân của ai đó trong ...

+0

Tôi không quan tâm đến việc thay đổi đồng hồ hệ thống của người dùng. – devios1

0

mọi máy được nối mạng đều nên sử dụng NTP. tất cả các hệ thống hiện đại bao gồm một cách dễ dàng để thiết lập điều này. vấn đề duy nhất nên chọn một máy chủ cụ thể, nếu bạn cần thêm một chút chính xác; nhưng nó đã ở trong phạm vi mili giây, vì vậy tôi không quan tâm và thường chỉ trỏ đến pool.ntp.org

2

Một điều chúng ta làm cơ bản là giảm tải tất cả các hoạt động định thời đến máy 'lưu trữ'. Ví dụ: nếu bạn có 20 máy chủ chia sẻ tất cả DB, hãy sử dụng thời gian của DB. Nếu bạn có một máy chủ trung tâm và một triệu máy khách, thì các máy khách sẽ không chịu trách nhiệm về thời gian; thực hiện tất cả phía máy chủ đồng bộ hóa của bạn.Trong môi trường thực sự được phân phối, giống như mạng P2P hay thứ gì đó, hãy sử dụng máy trực tiếp 'sở hữu' tài nguyên đang được đề cập đến (tệp thực sự mà bạn muốn ghi) để đồng bộ hóa/kiểm soát quyền truy cập vào tệp.

+0

Đây là những gợi ý tốt và nhiều loại câu trả lời tôi đang tìm kiếm. Tuy nhiên, giả sử rằng cả hai máy tính đều không sở hữu tài nguyên và nó thực sự được chia sẻ. Hơn nữa, không máy tính nào có quyền truy cập trực tiếp vào máy tính khác và do đó không thể sử dụng đồng hồ của máy tính. – devios1

3

Đây là vấn đề hiện tại tôi phải giải quyết đối với người dùng cuối không phức tạp, có thể làm nhiều việc để làm đảo lộn các đề xuất hợp lý của những người đóng góp trước đó. Một người dùng cuối không phức tạp có thể làm ít nhất những điều này, và nhiều hơn nữa:

1) Không có đủ kiến ​​thức máy tính để có thể thiết lập thời gian đồng bộ hóa NTP

2) Thiết lập đồng hồ thời gian máy tính của họ để một chiếc đồng hồ nhà hoặc đồng hồ điện thoại di động đó là không chính xác

3) trong Windows XP vô tình vô hiệu hóa NTP đồng bộ hóa thời gian và không biết làm thế nào để kích hoạt nó một lần nữa, hoặc có ngày máy tính của họ thiết lập sai, trong trường hợp mà Windows NTP không hoạt động

4) Pin bios máy tính đã chuyển sang chế độ phẳng nên máy tính luôn khởi động vào năm 1970!

5) Người dùng mang máy tính xách tay ra nước ngoài và tạm thời đặt đồng hồ máy tính xách tay thành giờ địa phương nhưng không thay đổi múi giờ, vì vậy hiện tại máy tính sẽ trả lại thời gian không chính xác!

Vì vậy, chính chương trình của bạn sẽ phải quản lý thời gian và tất nhiên bạn muốn làm điều đó với chi phí tối thiểu.

Giả sử hai người dùng cuối đang chạy chương trình của bạn cần các chương trình để thực hiện điều gì đó vào cùng thời gian tuyệt đối trong tương lai.

Tôi đề xuất phương án này, trong đó có một số ý tưởng từ cách công việc cron làm việc, tôi sẽ rất vui nếu có ai có thể đề xuất cải tiến cho ý tưởng.

1) Khi ứng dụng của bạn bắt đầu, nó đồng bộ thời gian utc nội bộ của nó thành ntp thông qua cuộc gọi xà phòng đến máy chủ của bên thứ ba hoặc tới máy chủ thời gian của chính bạn (bạn có thể tự mình tiếp tục với ntp).

2) Sau đó thêm thời gian đã trôi qua từ đồng hồ hệ thống để duy trì thời gian. Nếu yêu cầu nghiêm ngặt, bạn có thể cần phải lặp lại đồng bộ hóa ntp trong các khoảng thời gian.

3) Ứng dụng sau đó xem danh sách các công việc trong tương lai mà công việc cần thực hiện đúng lúc. Nó cần biết công việc sớm nhất.

4) Sau đó tạo ra một chuỗi mà nó đặt để ngủ trong khoảng thời gian trước công việc sớm nhất, ít hơn một lề an toàn, tùy thuộc vào yêu cầu của bạn có thể là 10 phút trước, một hoặc hai giờ trước Ví dụ:

5) Khi chủ đề thức dậy, nó kiểm tra lại thời gian tuyệt đối với cuộc gọi xà phòng khác, sau đó dựa vào đồng hồ thời gian của hệ thống để thêm thời gian trôi qua cho đến khi công việc đầu tiên được thực hiện ngoài.

6) Ngay sau khi công việc được kích hoạt (chạy nó trong một chủ đề khác), chuỗi theo dõi thời gian tính toán thời gian nhiệm vụ tiếp theo phía trước và tự đặt lại giấc ngủ trong thời gian đó.

Cải tiến với ý tưởng:

1) Một người sử dụng có thể đóng cửa ứng dụng của bạn trước khi công việc do, vì vậy bạn có thể cần một quá trình nền hoặc dịch vụ, trong đó sử dụng các chương trình đồng bộ như trên, để giám sát độc lập việc của bạn danh sách, được lưu trữ trong cơ sở dữ liệu hoặc tệp và khởi động ứng dụng kịp thời. (Trong Windows, tạo ra quy trình đăng ký)

2) Ứng dụng của bạn có thể đang thêm công việc mới hơn, sớm hơn hoặc xóa công việc, vì vậy chủ đề ngủ của bạn có thể cần được đánh giá để tính toán lại cho công việc mới trước đó, hoặc cho công việc sau công việc đã xóa. Trong Win32 bạn sẽ làm điều này bằng cách chờ đợi của bạn với thời gian chờ trên một sự kiện, mà bạn thiết lập để buộc nó phải tính toán lại thời gian ngủ. Trong Linux không có nghi ngờ có một cơ chế tương tự.

3) Đối với cuộc gọi Xà phòng để có được thời gian lưu ý khi Xà phòng được gửi và khi nhận được phản hồi. Nếu thời gian quay vòng quá dài, bạn không thể dựa vào thời gian và có thể cần phải lặp lại cuộc gọi hoặc bạn có thể thỏa hiệp. Ví dụ, nếu Soap nói rằng đồng hồ máy tính là 5 phút nhanh, nhưng cuộc gọi Soap mất một phút để trả lời, sau đó bạn chỉ có thể nói chắc chắn rằng đồng hồ máy tính là ít nhất 4 phút nhanh.

0

Không sử dụng NTP. NTP chỉ dành cho ngày/giờ.

Nó hoạt động để đồng bộ hóa các sự kiện giữa các ứng dụng không giao tiếp. Ví dụ, ứng dụng báo thức và cơ thể của bạn.

Đối với các ứng dụng có giao tiếp trực tiếp, chia sẻ tài nguyên, sử dụng đồng hồ lamport hoặc đồng hồ vector như Diomidis cho biết. Đồng hồ lamport hoạt động rất tốt để đạt được một phần đơn đặt hàng giữa các sự kiện, đồng hồ Vector rất tuyệt khi bạn cần xác định các sự kiện đồng thời.

5

Bạn có thể thử PTP, Giao thức thời gian chính xác (PTP) là giao thức được sử dụng để đồng bộ hóa đồng hồ trong toàn bộ mạng máy tính. Trên một mạng cục bộ, nó đạt được độ chính xác của đồng hồ trong phạm vi micro giây, làm cho nó phù hợp với các hệ thống đo lường và điều khiển. http://en.wikipedia.org/wiki/Precision_Time_Protocol

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