Tôi có tình huống này .... Giao tiếp SOAP 1.1 do khách hàng khởi tạo giữa một máy chủ và giả sử, hàng chục nghìn khách hàng. Khách hàng là bên ngoài, thông qua tường lửa của chúng tôi, chứng thực bằng giấy chứng nhận, https, vv .. Họ có thể ở bất cứ đâu, và thường có tường lửa riêng của họ, bộ định tuyến NAT, vv ... Họ thực sự là bên ngoài, không chỉ văn phòng công ty từ xa. Họ có thể ở trong mạng công ty/trường học, DSL/Cáp, ngay cả Dialup.Giao thức mạng nào để sử dụng để thông báo nhẹ cho các ứng dụng từ xa?
Khách hàng sử dụng Delphi (2005 + SOAP sửa từ năm 2007) và máy chủ là C#, nhưng từ quan điểm kiến trúc/thiết kế, điều đó không quan trọng.
Hiện tại, khách hàng đẩy dữ liệu mới đến máy chủ và lấy dữ liệu mới từ máy chủ trên vòng lặp bỏ phiếu trong vòng 15 phút. Máy chủ hiện không đẩy dữ liệu - khách hàng truy cập vào phương thức "messagecount", để xem liệu có dữ liệu mới để kéo hay không. Nếu 0, nó ngủ thêm 15 phút nữa và kiểm tra lại.
Chúng tôi đang cố gắng giảm xuống 7 giây.
Nếu đây là một ứng dụng nội bộ, với một hoặc chỉ một vài chục khách hàng, chúng tôi sẽ viết một dịch vụ xà phòng "nghe" cilent, và sẽ đẩy dữ liệu vào nó. Nhưng kể từ khi họ đang ở bên ngoài, ngồi đằng sau bức tường lửa của riêng mình, và đôi khi các mạng riêng đằng sau NAT router, điều này là không thực tế.
Vì vậy, chúng tôi đang bỏ phiếu với vòng lặp nhanh hơn nhiều. 10 nghìn khách hàng, mỗi người kiểm tra messagecount của họ sau mỗi 10 giây, sẽ là 1000/giây thông điệp mà chủ yếu sẽ chỉ lãng phí băng thông, máy chủ, tường lửa và tài nguyên xác thực.
Vì vậy, tôi đang cố gắng thiết kế một cái gì đó tốt hơn so với những gì sẽ gây ra một cuộc tấn công DoS tự gây ra.
Tôi không nghĩ rằng thực tế để máy chủ gửi tin nhắn xà phòng tới máy khách (push) vì điều này sẽ đòi hỏi quá nhiều cấu hình ở phía máy khách. Nhưng tôi nghĩ có những lựa chọn thay thế mà tôi không biết. Chẳng hạn như:
1) Có cách nào để khách hàng thực hiện yêu cầu GetMessageCount() qua Soap 1.1 và nhận phản hồi, và có thể "ở lại trên đường" trong khoảng 5-10 phút để nhận thêm phản hồi trong trường hợp dữ liệu mới đến? tức là máy chủ nói "0", sau đó một phút sau để đáp ứng với một số kích hoạt SQL (máy chủ là C# trên Sql Server, btw), biết rằng khách hàng này vẫn còn "trên dòng" và gửi số lượng tin nhắn cập nhật của "5 "?
2) Có giao thức nào khác mà chúng tôi có thể sử dụng để "ping" ứng dụng khách, sử dụng thông tin được thu thập từ yêu cầu GetMessageCount() cuối cùng của họ không?
3) Tôi thậm chí không biết. Tôi đoán tôi đang tìm một số giao thức ma thuật mà khách hàng có thể gửi một yêu cầu GetMessageCount(), trong đó sẽ bao gồm thông tin cho "oh bằng cách này, trong trường hợp thay đổi câu trả lời trong giờ tiếp theo, ping tôi tại địa chỉ này ... ".
Ngoài ra, tôi giả sử rằng bất kỳ chương trình nào trong số này "giữ nguyên đường mở" sẽ ảnh hưởng nghiêm trọng đến kích thước máy chủ, vì nó sẽ cần phải giữ cho hàng nghìn kết nối mở, đồng thời. Điều đó có khả năng sẽ ảnh hưởng đến tường lửa, tôi nghĩ vậy.
Có điều gì ở đó như thế không? Hay tôi bị mắc kẹt nhiều với việc bỏ phiếu?
TIA,
Chris
CẬP NHẬT 2010/04/30:
Sau khi chứng minh được rằng có thông báo 7 giây không phải là dễ dàng và cũng không rẻ, đặc biệt là không đi ra ngoài trong những tiêu chuẩn của công ty của HTTPS/SOAP/Tường lửa , có lẽ chúng ta sẽ đưa ra một giải pháp hai pha. Phase1 sẽ có các cuộc thăm dò của khách hàng "theo yêu cầu" với GetMessageCount được thực hiện thông qua SOAP, không có gì lạ mắt ở đây. Sẽ có nút "refresh" để lấy dữ liệu mới (hợp lý ở đây, vì người dùng thường có lý do nghi ngờ rằng dữ liệu mới đã sẵn sàng, tức là họ chỉ thay đổi màu vải trong hệ thống trực tuyến, vì vậy họ biết nhấp chuột REFRESH trước khi xem tệp kê khai giao hàng trên máy tính để bàn và bây giờ họ thấy màu trong mô tả.) (Đây KHÔNG phải là ứng dụng may mặc/thời trang, nhưng bạn có ý tưởng). Khái niệm về việc có hai aps luôn được đồng bộ, với các bản cập nhật thời gian thực được đẩy từ máy chủ, vẫn còn trên bàn, sử dụng các công nghệ được thảo luận ở đây. Nhưng tôi hy vọng rằng nó sẽ được đẩy ra cho một phiên bản khác, vì chúng tôi có thể cung cấp 85% chức năng mà không cần phải làm điều này. Tuy nhiên, tôi hy vọng rằng chúng tôi có thể làm một Proof Of Concept, và có thể chứng minh rằng nó sẽ hoạt động. Tôi sẽ quay lại và đăng các cập nhật trong tương lai. Cảm ơn sự giúp đỡ của mọi người về điều này.
Xin chào các bạn, tôi đã thêm tiền thưởng, nhưng điều đó không có nghĩa là tôi không thích câu trả lời cho đến nay! Tôi muốn chắc chắn rằng điều này đã được xem xét càng nhiều càng tốt, và bên cạnh đó, tôi đã luôn luôn muốn làm một tiền thưởng ... Có rất nhiều câu trả lời tuyệt vời ở đây, và tôi thực sự đánh giá cao nó. –
Tôi ước gì tôi có thể chia tiền thưởng .. có nhiều câu trả lời tuyệt vời ở đây, và có lẽ hữu ích nhất vào thời điểm này trong dự án là sự đồng thuận áp đảo đồng ý với lập trường của tôi rằng chúng tôi không thể xử lý các kết nối 10K thực hiện bỏ phiếu nhanh chúng ta có thể đẩy dữ liệu đến chúng như những người nghe SOAP thông thường không. –