8

Chúng tôi có một hệ thống phần mềm hiệu năng cao bao gồm nhiều quy trình Java tương tác (không phải EJB). Mỗi quy trình có thể trên cùng một máy hoặc trên một máy khác.Có giải pháp đồng bộ hóa ngoài giờ cho Java không?

Một số sự kiện nhất định được tạo trong một quy trình và sau đó được truyền bá theo nhiều cách khác nhau cho các quy trình khác để xử lý tiếp và v.v. Đối với mục đích đo điểm chuẩn, chúng ta cần tạo nhật ký khi mỗi sự kiện được chuyển qua "điểm kiểm tra", cuối cùng kết hợp các nhật ký này để có được dòng thời gian về cách mỗi sự kiện được truyền qua hệ thống và với độ trễ (tất nhiên, quá trình chuyển đổi và IPC thêm độ trễ, điều đó là ok).

Vấn đề, tất nhiên, là đồng bộ hóa đồng hồ. Vì vậy, đây là câu hỏi của tôi:

1) Nếu tất cả các quá trình trên cùng một máy, có đảm bảo rằng currentTimeMilis sẽ chính xác tại thời điểm gọi không? Có một số ràng buộc về các lỗi của ITP?

2) Nếu một số quy trình có thể có trên các máy khác nhau, có giải pháp không có sẵn (đó cũng là nguồn mở hoặc miễn phí) cho đồng bộ hóa đồng hồ không? Tôi tốt nhất là tìm kiếm một giải pháp có thể bỏ qua hệ điều hành (Windows hoặc Linux) và làm việc trực tiếp từ Java. Tôi cũng lý tưởng tìm kiếm một cái gì đó có thể hoạt động ở độ chính xác micro giây. Tôi đã nghĩ về NTP, nhưng tôi không chắc chắn nếu nó có sẵn thông qua Java hơn là thông qua hệ điều hành, và tôi không chắc chắn về sự phức tạp của nó.

3) Có cách nào để xác định lề lỗi khi sử dụng NTP trong cấu hình cụ thể (hoặc bất kỳ giải pháp nào tôi sử dụng) để tôi có thể đưa ra sai sót về tính toán độ trễ của chúng tôi không?

Cảm ơn!

Trả lời

4

Với lập trình phân tán, đồng bộ hóa đồng hồ thường không đủ. bạn có thể muốn xây dựng một khung thời gian hợp lý (chẳng hạn như các đồng hồ Lamport hoặc vector hoặc các phương thức Singhal-Kshemkalyani ... và có nhiều tải hơn để duy trì quan hệ nhân quả đồng bộ giữa các máy). Mà bạn chọn thường phụ thuộc vào ứng dụng và yêu cầu quan hệ nhân quả giữa các sự kiện.

Đồng hồ được đồng bộ hóa để đảm bảo các sự kiện đồng thời được lưu giữ theo thứ tự tuần tự đúng. Có nhiều cách khác để làm điều này hơn là giữ đồng hồ hệ thống đồng bộ ... trừ khi chúng chia sẻ một đồng hồ vật lý chung ... khá phức tạp.

Xét về lợi nhuận lỗi NTP, có những giải pháp:

đề nghị của tôi:

đọc: Distributed Computing: Nguyên tắc, thuật toán và hệ thống

Đặc biệt: Chương 3, thời gian hợp lý

Chỉnh sửa

Tiếp tục bài Cheeso, tôi tìm thấy

http://www.uniforum.org/publications/ufm/apr96/opengroup.html

http://sourceforge.net/projects/freedce

Có lẽ DCE Java bindings ra khỏi đó.

+0

Tôi nhớ cuốn sách từ đại học. Dự án của chúng tôi ngay bây giờ đang tìm kiếm một cái gì đó nhanh chóng và hợp lý chính xác, chúng tôi không thể là những người đầu tiên cần một cái gì đó như thế này. Tôi đã tự hỏi nếu có một triển khai kệ. – Uri

+0

Không phải là tôi biết, nhưng với JVM sẽ có rất nhiều thời gian trễ. Môi trường chương trình không được kết hợp chặt chẽ và có thể gian hàng (trên GC và vân vân). Tuy nhiên, tôi không phải là chuyên gia Java. –

0

DCE ("Distributed Computing Environment") được sử dụng để có giải pháp đồng bộ hóa thời gian phân phối, với tất cả các khả năng đó. Nó được gọi là DTS. Quản trị viên có thể định cấu hình bộ máy để đồng bộ hóa và độ trễ hoặc độ không đảm bảo được tính toán và khả dụng. Nếu bất kỳ máy nào không đồng bộ, đồng hồ của nó sẽ được điều chỉnh từ từ cho đến khi nó được đồng bộ lại. Có một đảm bảo rằng thời gian trên bất kỳ máy nào sẽ không bao giờ được điều chỉnh ngược (vi phạm vật lý cơ bản). Mạng cần ít nhất một đầu vào NTP để luôn được đồng bộ hóa với "thế giới thực".

Tôi không biết điều gì đã xảy ra với thời gian đó đồng bộ hóa nội dung hoặc mã DCE nói chung.

Dường như với tôi bạn không cần giải pháp "trong Java". Bạn cần phải đồng bộ các đồng hồ của một tập hợp các máy phân tán. Ứng dụng Java chỉ là thứ chạy trên các máy.

+0

Sự hiểu biết của tôi là hầu hết các hệ điều hành đều sử dụng phương pháp đồng bộ hóa với mức độ sai sót cao (Khoảng 10-100ms), điều này có thể chấp nhận được đối với hầu hết các thực tiễn. Tôi đã suy nghĩ về việc thực hiện nó thông qua Java vì tôi có thể sử dụng một dịch vụ có độ chính xác cao hơn. – Uri

+0

@Cheeso - DCE đã đi trước thời đại :) –

+0

@Uri - vâng tôi thấy bạn muốn có giải pháp có độ chính xác cao hơn. Ý tôi là, có thể đồng bộ hóa độc lập với bất kỳ mã Java nào. Nó có thể là yếu tố để đồng bộ hóa thời gian một phần của ứng dụng Java hoàn toàn, để một giả định thiết kế trong ứng dụng Java là "thời gian được đồng bộ". Nhưng lựa chọn thiết kế đó là của bạn để thực hiện! b – Cheeso

2

Tôi thực sự chỉ sử dụng NTP. Nó khá chính xác ngay cả trên internet, và trên một mạng LAN nó nên được tốt hơn. Theo Wikipedia [1],

NTPv4 thường có thể duy trì thời gian trong vòng 10 mili giây (1/100 giây) trên Internet công cộng và có thể đạt được độ chính xác 200 micro giây (1/5000 giây) hoặc tốt hơn trong mạng cục bộ trong điều kiện lý tưởng.

để có thể đủ tốt cho nhu cầu của bạn nếu điều kiện của bạn đủ "lý tưởng". NTP đã được khoảng đủ dài mà khá nhiều tất cả mọi thứ làm việc với nó. Tôi không thấy bất kỳ lý do nào để làm điều này thông qua Java thay vì hệ điều hành. Nếu hệ điều hành được đồng bộ hóa, thì sẽ là Java.

[1] Wikipedia: Network Time Protocol

1

tôi gặp chủ đề này sau khi thử một cái gì đó một mình (nên đã tìm kiếm đầu tiên!) http://snippets.dzone.com/posts/show/11345 - có thể là một phương pháp tốt, có thể xấu, nhưng nó phân phối (serverless) là tốt đẹp.

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