2012-05-21 23 views
15

tôi đang tạo ra một ứng dụng giám sát có thể theo dõi 100-150 thiết bị ... Bây giờ để thiết kế một ứng dụng giám sát, tôi có hai phương pháp: -Về tạo thread hoặc hồ bơi thread cho 100 nhiệm vụ

  1. Tạo luồng cho mỗi thiết bị để theo dõi và mỗi luồng sẽ ping (Sử dụng ICMP) cho thiết bị để biết thiết bị có trực tuyến hay không. Những chủ đề này sẽ chạy không chính xác để biết trạng thái của chúng sau một khoảng thời gian cụ thể (nói 60 giây).

  2. Tạo nhóm chủ đề và cho từng thiết bị, gửi tác vụ đến nhóm chủ đề. Nhiệm vụ là ping đơn giản đến một thiết bị. Vì vậy, trong thiết kế hiện tại, các tác vụ sẽ nhiều hơn các chủ đề trong nhóm luồng. Ví dụ, nói rằng có 100 thiết bị để theo dõi, sẽ có 100 nhiệm vụ được theo dõi và thread pool sẽ có 40 chủ đề để hoàn thành 100 nhiệm vụ này. Tất nhiên, khoảng thời gian để chạy một loạt nhiệm vụ tiếp theo sẽ là để hoàn thành tất cả các tác vụ đang chờ xử lý trong nhóm luồng.

Phương pháp nào sẽ tốt hơn?

Trả lời

12

Tôi muốn tạo một ScheduledExecutorService (ví dụ: qua Executors.newScheduledThreadPool) cho phép bạn lập lịch ping lặp lại. Bạn có biết mỗi ping có khả năng mất bao lâu? Tôi sẽ hy vọng mà bạn có thể lấy đi với rất ít chủ đề - ít hơn 40, nếu bạn chỉ cần ping mỗi 100 thiết bị một lần mỗi phút.

Bạn có thể bắt đầu nó với số lượng chủ đề nhỏ hợp lý - nhưng hãy lưu ý thông tin Mark Peters nêu trong các nhận xét - việc triển khai được sử dụng không không mở rộng (như tôi mong đợi); nó có hiệu quả một hồ bơi cố định thread. Tuy nhiên, bạn sẽ có thể thực hiện với ít hơn 40 ...

+1

Đây sẽ là gợi ý của tôi quá. Tôi có cùng một mối quan tâm mặc dù ... những gì * if * 'N' thiết bị đã đi offline cùng một lúc, và' N' là lớn hơn kích thước hồ bơi thread ... nó có thể là giám sát có thể chết đói.Sẽ rất tuyệt khi có một bản triển khai 'ScheduledExecutorService' có thể phát hiện khi các nhiệm vụ của nó bị bỏ đói và tăng kích thước nhóm cho phù hợp. –

+0

Và nếu bạn thêm một số chẩn đoán tối thiểu (như thông qua JMX), bạn sẽ có thể theo dõi quá trình và điều chỉnh nó một cách thích hợp. Điều này dễ dàng hơn nhiều với một dịch vụ thực thi hơn so với hồ bơi thủ công của riêng bạn hoặc các chủ đề riêng lẻ. –

+0

@MarkPeters: 'newScheduledThreadPool' nhận một số * lõi * số nhiệm vụ, nhưng tăng nó khi cần, tôi tin. –

1

Tôi khuyên bạn nên tìm một nhóm luồng thay vì tạo chuỗi mới cho mọi thiết bị. Hồ bơi chủ đề phù hợp cho rất nhiều nhiệm vụ có thời lượng ngắn và vấn đề của bạn hoàn toàn phù hợp với điều này.

2

Tạo chuỗi riêng cho từng thiết bị không phải là giải pháp có thể mở rộng. Chỉ cần tưởng tượng nếu giải pháp của bạn phải làm việc với số lượng thiết bị tăng lên, giả sử từ 100 đến 1000; bạn không thể tiếp tục sinh sản một cách riêng biệt mỗi lần.

Tạo một threadpool sẽ là một giải pháp mong muốn. Bạn có thể điều chỉnh kích thước của threadpool theo yêu cầu và nguồn lực sẵn có. Nếu bạn cần ping các thiết bị trên cơ sở thường xuyên sau một khoảng thời gian cố định thì bạn có thể đi cho một dịch vụ thực thi theo lịch trình mà nội bộ sẽ chăm sóc lên lịch các nhiệm vụ theo định kỳ. Nhưng có, sử dụng một threadpool là sự lựa chọn không đáng kể.

2

Bạn nên tính đến thời gian chờ ping khi tính số lượng chủ đề tối đa. Có bao nhiêu chủ đề yêu cầu ping 100 thiết bị, thời gian chờ ping là 5 giây và thời gian lặp lại là 60 giây?

Trong 60 giây mỗi chuỗi có thể thực hiện 12 ping thiết bị (60 giây cho phép 12 ping hết thời gian chờ sau 5 giây). Điều đó có nghĩa là bạn cần ít nhất 9 chủ đề mỗi lần thực hiện 12 ping trong 60 giây.

numberOfThreads = numberOfDevices/(pollingPeriod/pingTimeout) = 100/(60/5) = 100/12 = 9 đề

+1

Điều này cũng phù hợp với câu trả lời của Jon. Các dữ liệu thực tế là tối đa chờ đợi 5 giây, thời gian 60 giây. Vì vậy, bạn sẽ xem xét 8-9 chủ đề để đảm bảo 100 thiết bị có thể được xử lý. Mặc dù nếu tất cả các thiết bị được đăng ký tại thời điểm 0 và các thử nghiệm đầu tiên bắt đầu tại thời điểm 60, nhiều người có thể không được ping cho đến thời gian 115 (chỉ là lần đầu tiên). –

+0

Đánh dấu cảm ơn, tôi đã cập nhật ví dụ dựa trên số của bạn. – itaifrenkel

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