2008-12-18 41 views
5

Tôi hy vọng một người nào đó có thể hướng dẫn tôi khi tôi bị kẹt ... Tôi cần viết một hệ thống phát thanh khẩn cấp thông báo cho các trạm làm việc khẩn cấp và bật lên một thông điệp nhỏ dưới cùng của màn hình của người dùng. Điều này có vẻ đơn giản nhưng có khoảng 4000 máy trạm trên nhiều mạng con. Hệ thống cần gần như thời gian thực, gọn nhẹ và dễ triển khai như một dịch vụ windows.Whats cách tốt nhất để gửi một sự kiện đến tất cả các máy trạm

Sự cố bắt đầu khi tôi phát hiện ra rằng các bộ định tuyến không chuyển tiếp gói phát sóng UDP x.x.x.255. Sau đó tôi đã thực hiện một móc kiểm tra đơn giản trong VB6 để bắt các tin nhắn gửi net nhưng ngay cả những người không vượt qua các bộ định tuyến. Tôi cũng đã viết một gói sniffer đơn giản để lọc các gói chỉ để thấy rằng các gói mạng không bao giờ đạt đến đích dự định.

Sau đó, tôi đã xem và khám phá bằng cách sử dụng MSMQ qua HTTP, nhưng điều này yêu cầu IIS phải được cài đặt trên máy trạm mục tiêu. Vì có rất nhiều máy trạm, nó sẽ là một mối quan tâm lớn về bảo mật.

Ngay bây giờ tôi đã hoàn thành một dịch vụ web với gọi lại không đồng bộ gửi một sự kiện tới người đăng ký. Nó hoạt động hoàn hảo trên quy mô nhỏ nhưng một khi có hơn 15 người đăng ký, hiệu suất giảm đáng kể. Bỏ phiếu cho máy chủ không thực sự là một lựa chọn vì tải nó sẽ tạo trên máy chủ (cộng với tôi cũng đã thử nó)

Tôi cần sự giúp đỡ của bạn để hướng dẫn tôi sử dụng công nghệ nào. có ai đã sử dụng cách sao chổi với rất nhiều khách hàng hay tôi nên nhìn vào WCF?

Tôi đang sử dụng Visual C# 2005. Hãy giúp tôi thoát khỏi tình trạng khó khăn này.

Cảm ơn

+0

Bạn không cần IIS cho MSMQ ... –

Trả lời

3

Cân nhắc sử dụng cơ chế và sự kiện gọi lại WCF. Có good introduction bởi Juval Lowy.

Một mẫu khác là triển khai blocking web-service calls. Đây là cách hoạt động của tính năng trò chuyện của GMail. Tuy nhiên, bạn sẽ phải đối phó với các phiên và thời gian chờ tại đây. Nó hoạt động khi khách hàng ở phía sau NAT và Tường lửa và không thể truy cập trực tiếp. Nhưng nó có thể là quá phức tạp cho cảnh báo đơn giản trong mạng nội bộ.

0

Vấn đề này tôi nghĩ là giải quyết tốt nhất với ổ cắm.

Mở kết nối với máy chủ và mở nó.

+0

Mở kết nối với máy chủ hoạt động. Có 4000 ổ cắm mở có thể hoạt động, nhưng tôi e rằng nó sẽ không mở rộng quá tốt. – Piskvor

0

Bạn có thể có một máy chủ nô lệ trong mỗi mạng phụ có trách nhiệm phân phối tin nhắn đến tất cả các máy khách trong mạng con không?

Sau đó, bạn có thể chỉ có các nô lệ được đính kèm vào máy chủ trung tâm nơi thư được bắt đầu.

+0

Bạn đúng nhưng tôi không nghĩ rằng tôi có thể nhận được phần cứng. có khoảng 50 mạng con có nghĩa là một máy chủ có kết nối 50 tcp với nhiều máy khách udp. Vì vậy, tôi sẽ cần các khách hàng để có thể "đề cử" chính nó cho nô lệ, trong trường hợp một máy trạm được khởi động lại/etc. Bạn có đề nghị WCF cho việc này không? – Tyler

+0

nó có thể trở thành một cơn ác mộng cấu hình –

+0

Tôi muốn khuyên bạn nên có một vài nô lệ trong mỗi mạng con, trong trường hợp một trong những nô lệ đi xuống trước khi nó có thời gian để thông báo cho chủ. (Nhận thông báo về cùng một sự kiện nhiều lần tốt hơn không - bạn có thể bỏ qua các thông báo giống hệt nhau tiếp theo trên máy khách) – Piskvor

0

Tôi nghĩ rằng một số trong các bạn là bao la quá mức này. Đã có một dịch vụ được tích hợp vào mọi phiên bản Windows cung cấp chức năng chính xác này! Nó được gọi là dịch vụ Messenger. Tất cả những gì bạn phải làm là đảm bảo rằng dịch vụ này được kích hoạt và chạy trên tất cả các máy khách.

(Mặc dù bạn không chỉ định trong câu hỏi, tôi giả định từ các lựa chọn công nghệ của bạn rằng số lượng khách hàng của mạng này là tất cả Windows).

Bạn có thể gửi tin nhắn sử dụng cơ sở này từ dòng lệnh sử dụng một cái gì đó như thế này:

NET SEND computername "This is a test message" 

Lệnh NET SEND cũng có tùy chọn để gửi qua miền Windows, hoặc cho người dùng cụ thể bằng tên không phân biệt nơi họ được đăng nhập hoặc vào mọi hệ thống được kết nối với một máy chủ Windows cụ thể. Các tùy chọn này sẽ cho phép bạn dễ dàng tránh vấn đề mạng con, đặc biệt nếu bạn sử dụng bảo mật dựa trên miền trên mạng của mình. (Bạn có thể cần dịch vụ "Alerter" được kích hoạt trên một số máy chủ nhất định nếu bạn đang gửi tin nhắn qua máy chủ và không gửi trực tiếp tới máy khách).

Phiên bản có lập trình của đây là API có tên NetMessageBufferSend() khá đơn giản. Việc quét nhanh P/Invoke.net tìm thấy page for this API không chỉ cung cấp các định nghĩa mà bạn cần để gọi ra API, mà còn là một chương trình mẫu C#!

Bạn không cần phải viết bất kỳ mã phía máy khách nào cả. Có lẽ điều liên quan nhất sẽ là tìm ra tập hợp các cuộc gọi tốt nhất tới API này để có được sự bao phủ hoàn chỉnh của mạng trong cấu hình của bạn.

ETA: Tôi vừa nhận thấy rằng dịch vụ Messenger và API này đã biến mất hoàn toàn trong Windows Vista. Rất kỳ lạ của Microsoft để loại bỏ hoàn toàn chức năng như thế này. Có vẻ như this vendor has a compatible replacement dành cho Vista.

+0

Cảm ơn Tim, tôi không nghĩ rằng vista sẽ là vấn đề vì có lẽ chúng tôi sẽ bỏ qua phiên bản đó;) Tôi đã thử tùy chọn này nhưng vấn đề là tôi không thể nắm bắt gói tin ở cuối ứng dụng để ngăn hộp thông báo mặc định. Tôi có nên sử dụng chụp gói để bẫy nó ở phía máy khách không? – Tyler

+0

Tại sao bạn muốn bẫy nó, câu hỏi của bạn chỉ định một thông điệp bật lên? Vâng, bạn có thể xây dựng dịch vụ của riêng bạn mà cùng một điều Messenger làm. Về cơ bản, nó sử dụng API NETBIOS để lắng nghe những thông điệp gửi đến này, sau đó kích hoạt MessageBox. –

+0

Dịch vụ tin nhắn sử dụng netbios mà lần lượt sử dụng các gói tin phát sóng mà không đi qua router ... –

3

Đây chính xác là những gì Multicast được thiết kế cho.

Phát sóng mạng bình thường (theo định nghĩa) nằm trên mạng con cục bộ và sẽ không được chuyển tiếp qua bộ định tuyến.

Truyền đa hướng mặt khác có thể có nhiều phạm vi khác nhau, từ mạng con cục bộ, thông qua trang cục bộ, thậm chí đến toàn cục. Tất cả những gì bạn cần là cho các bộ định tuyến khác nhau kết nối các mạng con của bạn với nhau để nhận biết đa hướng.

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