2013-05-31 47 views
5

Tôi có câu hỏi về cách tốt nhất để kiểm tra xem dịch vụ có đang chạy hay không.Cách tốt nhất để kiểm tra xem dịch vụ có treo số

Trước tiên hãy làm rõ một chút. Dịch vụ tôi có là một ứng dụng C# có thể chạy từ dòng lệnh hoặc có thể chạy dưới dạng Dịch vụ Windows. Chức năng của dịch vụ là kiểm tra các thay đổi đối với nguồn dữ liệu của bên thứ ba từ xa và xử lý các thay đổi đó trước khi thêm chúng vào kho lưu trữ dữ liệu cục bộ của chính chúng ta.

Tôi muốn có thể xác định thời điểm dịch vụ ngừng hoạt động vì bất kỳ lý do gì và thông báo cho ai đó khi điều này xảy ra tự động nhất có thể. Điều này cần xảy ra bất kể dịch vụ đang được chạy dưới dạng Dịch vụ Windows hay từ dòng lệnh.

Tôi đã xem xét theo dõi lưu trữ dữ liệu cục bộ để thay đổi và thông báo khi các thay đổi không xảy ra trong một khoảng thời gian nhất định, tuy nhiên điều này đã được chứng minh là quá không nhất quán, vì tần suất thay đổi đối với bên thứ 3 nguồn dữ liệu biến đổi, có nghĩa là việc thiếu thay đổi kéo dài không nhất thiết cho thấy dịch vụ đã ngừng hoạt động, nó chỉ có thể là không có thay đổi!

Có bất kỳ đề xuất nào về cách tôi có thể tiến hành theo dõi việc này không? Bất cứ ai có kinh nghiệm làm việc với một cái gì đó tương tự?

Cảm ơn, M

Sửa 1 Chỉ cần đưa ra một ý tưởng thô của cách làm việc của dịch vụ: Các dịch vụ bên thứ 3 làm tăng sự kiện khi mới/cập nhật dữ liệu có sẵn để phục vụ tôi ngồi và chờ đợi những sự kiện này được nâng lên và xử lý dữ liệu được trả lại trong sự kiện được nêu ra. Vì vậy đây là lý do tại sao nó khó để xác định khi có "không có thay đổi" thay vì "dịch vụ bị rơi".

Chỉnh sửa 2 Tôi nghĩ rằng tôi cần phải được rõ ràng hơn một chút: Lý do chính để giám sát này là để thông báo cho người dùng về một vấn đề tiềm năng hoặc với dịch vụ hoặc với kết nối với dịch vụ bên thứ 3. Bản thân dịch vụ là một luồng đơn và có xử lý và ghi nhật ký ngoại lệ phù hợp. Rất có thể dịch vụ này sẽ được chạy trên một máy chủ ở đâu đó vì vậy nếu có bất kỳ vấn đề nào với dịch vụ và nó ngừng cập nhật kho dữ liệu cục bộ của chúng tôi vì bất kỳ lý do nào dịch vụ cần thông báo cho ai đó.

+0

Dịch vụ của bạn có một số loại vòng lặp bỏ phiếu không? –

+0

Bạn có thể cho chúng tôi thấy một phác thảo Pseudo về những gì dịch vụ của bạn thực sự làm không? Chúng tôi có thể giúp xác định một nơi để định vị một dạng nhịp tim nào đó. – KingCronus

Trả lời

-1

Giải pháp làm việc cho dự án này là sử dụng nhịp tim như triển khai để cho phép dịch vụ thông báo cho tôi về tính khả dụng của nó.

Vì ứng dụng của chúng tôi sử dụng WebAPI tôi có thể thiết lập điểm cuối mà dịch vụ "ping" mỗi [x] giây.

Một quy trình riêng biệt đã được thêm vào để kiểm tra ngày và giờ của thông báo cuối cùng từ dịch vụ và nếu không nằm trong ngưỡng đã đặt, tôi thông báo cho người dùng biết rằng dịch vụ không khả dụng.

Tôi nhìn bằng cách sử dụng ServiceController nhưng điều đó sẽ không thể là một giải pháp lý tưởng vì khả năng rằng các chức năng bổ sung vào dịch vụ thể được chạy như một giao diện điều khiển ứng dụng Windows thay vì một dịch vụ Windows.

4

bạn có thể muốn xem xét một cái gì đó giống như một 'nhịp tim':

Heartbeat activity for Windows Service

Nhưng xem xét chính của bạn nên được làm việc ra lý do tại sao dịch vụ của bạn sẽ có thể dừng/treo? Tất cả các ngoại lệ cần phải bị bắt và trong trường hợp xấu nhất, hãy đặt lại dịch vụ của bạn về trạng thái khởi động sau một thời gian chờ ngắn để ngăn chặn tối đa CPU.

bản thân Windows có nhiều phương pháp để giúp đỡ thêm:

Start > Run > Services.msc > Right Click Service > Properties > Recovery Options 

Nếu bạn thiết kế ứng dụng của bạn để sử dụng đúng trường hợp ngoại lệ và xử lý chúng một cách thích hợp, bạn nên không bao giờ có một vấn đề với dịch vụ của bạn 'treo cho một số lý do '.

bổ sung:

Có không có cách nào để bạn xác định sự khác biệt giữa "không có công việc cần thiết" và treo?

+0

Điều tồi tệ nhất là nếu dịch vụ đa luồng và sinh mạng hoặc bế tắc đang diễn ra. –

+0

@MatthewWatson Có, một nhịp tim có thể giúp đỡ với điều đó, nhưng tôi vẫn muốn được xem xét nguyên nhân gốc rễ. Deadlocks và Livelocks hầu như luôn luôn có thể được sửa chữa bằng cách sử dụng lập trình threadsafe thích hợp. – KingCronus

0

bạn có thể sử dụng ServiceController lớp trong .net để giám sát dịch vụ.

Tôi gặp phải sự cố tương tự trong một trong các dự án của mình.

Tôi đã sử dụng phương pháp dưới đây để giám sát dịch vụ của mình.

  • Điều đầu tiên, tôi đăng nhập tất cả các thông tin, lỗi từ dịch vụ của tôi để xem sự kiện trong một định dạng tiêu chuẩn như

tùy chỉnh EventID này | datetime | nhắn

  • Sau đó, tôi đã tạo thêm một dịch vụ thông báo nữa sẽ lắng nghe trình xem sự kiện cho các sự kiện cụ thể, đọc thư từ mục nhập sự kiện
  • nếu mục sự kiện rơi vào event viewer nó sẽ gửi mail thông báo qua smtp
  • nếu bạn không được cung cấp với các SMPT sau đó đi cho các cửa sổ ứng dụng mà lắng nghe những sự kiện và thể hiện thông điệp bằng baloon hoặc nhắn hộp