Tôi có nên trao đổi từ WCF sang NserviceBus


13

Chúng tôi có một máy chủ trung tâm gửi và nhận tin nhắn từ một số PC được đặt trên các mạng máy khách ở nhiều địa điểm khác nhau. Để tạo điều kiện thuận lợi, hiện tại tôi đang sử dụng WCF với TCPNetBindings, sử dụng giao tiếp song công được bảo mật bằng chứng chỉ.

Bây giờ, chúng tôi có một số vấn đề với điều này - chủ yếu là chúng tôi đang được yêu cầu hỗ trợ "chế độ ngắt kết nối" (chúng tôi cần phải có khả năng chịu lỗi). Từ những gì tôi biết, không có cách đơn giản nào để thực hiện việc này bằng cách sử dụng ngăn xếp WCF - chúng ta cần thực hiện một cái gì đó và có lẽ sử dụng msmq. Gần đây tôi đã xem NServiceBus và từ đó tôi có thể thấy nó có vẻ phù hợp với hóa đơn - khả năng chịu lỗi, các tin nhắn có thể được gửi qua internet thông qua một cổng http đơn giản, v.v. Tôi biết rằng nó được tôn trọng trong cộng đồng và Tôi có thể thấy tại sao từ việc nhìn vào nó.

Vì vậy, câu hỏi của tôi là ... Việc sử dụng NServiceBus nghe có vẻ là một ý tưởng hợp lý hay có ai có bất kỳ đề xuất / kinh nghiệm thực tế nào khác liên quan đến vấn đề này không? Tôi đoán tôi lo lắng khi giới thiệu một công nghệ mới mà tôi biết khá ít và phải đối mặt với các vấn đề với những thứ như bảo vệ nó, thiết lập mọi thứ theo cách đáng tin cậy, gotchas trên đường đi .. Tôi cũng cảnh giác với "vàng- mạ "kiến trúc, và chọn một thứ gì đó sáng chói sẽ khiến tôi thất vọng trong việc thực hiện thay vì gắn bó với WCF và chỉ làm cho nó hoạt động với tôi ..

Cảm ơn!


1
> hỗ trợ "chế độ ngắt kết nối" (chúng ta cần phải có khả năng chịu lỗi) Bạn vẫn sẽ phải tự mình xây dựng nhiều khả năng chịu lỗi ở phía máy khách chứ? Khả năng chịu lỗi của MSMQ trên máy chủ rất tốt cho việc khôi phục trạng thái trong trường hợp xảy ra sự cố, nhưng tôi vẫn thấy rằng việc bị đau đầu rất lớn đối với khách hàng cho dù bạn chọn gì.
brian

1
Vâng, điều tôi cần hỗ trợ là "đảm bảo" rằng khách hàng sẽ gửi tin nhắn đến máy chủ và cuối cùng máy chủ sẽ nhận được tin nhắn - vì vậy nếu chúng tôi ngoại tuyến, chúng tôi cần tiếp tục cố gắng cho đến khi chúng tôi đến đó. Đó là những gì NSB làm "miễn phí", trong khi đó là một giải pháp WCF (tôi nghĩ) sẽ yêu cầu mã ..
Matt Roberts

Tôi đồng ý một phần với Brian. MSMQ, nếu được cấu hình đúng trong các phiên bản gần đây sẽ cung cấp cho bạn chế độ ngắt kết nối khá tốt, miễn là bạn định cấu hình hàng đợi và thông báo để hành xử theo cách đó. Máy khách có thể duy trì các tin nhắn trong hàng đợi gửi đi cục bộ và gửi lại khi máy chủ khả dụng lại trên hàng đợi từ xa.
Bill

WCF có các ràng buộc MSMQ ... Tôi rất hiểu biết về một số ứng dụng thành công quy mô lớn sử dụng điều này. Điều đó nói rằng, tôi cũng thích nServiceBus, nhưng nó làm một điều khác.
Kyle Hodgson

Câu trả lời:


12

Đề nghị của tôi, nếu bạn cần nhanh chóng về vấn đề này và chỉ cần một cái gì đó đơn giản để tạo điều kiện cho hoạt động bền (ngắt kết nối) với WCF, là xem xét các ràng buộc WCF - MSMQ. Nếu bạn cần một cái gì đó trong một môi trường lớn hơn, hãy xem nServiceBus.

Trong tâm trí của tôi, nServiceBus sẽ thực sự bắt đầu tỏa sáng trong một môi trường phân tán lớn hơn. Lấy ví dụ, ví dụ sau (đó sẽ là địa ngục trần gian với WCF nhưng đơn giản với nServiceBus):

  • Cơ sở hạ tầng được tạo thành từ tầng máy chủ ứng dụng, tầng máy chủ bộ đệm, chỉ đọc lớp cơ sở dữ liệu, tầng đọc / ghi cơ sở dữ liệu
  • Bất cứ khi nào khách hàng gửi một mục mới, bạn thực sự muốn tất cả các tầng này được cập nhật cùng một lúc
  • Trong WCF, bạn cần hiển thị các dịch vụ riêng biệt ở mỗi cấp bậc và yêu cầu khách hàng đẩy tất cả chúng (hoặc có một số dàn nhạc trung tâm làm điều tương tự cho bạn)
  • Trong nServiceBus, bạn có mỗi tầng là người đăng ký thông tin này và khách hàng sẽ xuất bản nó một lần, cho phép xe buýt dịch vụ chăm sóc phần còn lại

WCF có ràng buộc MSMQ

Tuy nhiên, nếu bạn cần gắn bó với WCF (thời gian ngắn, cần các tính năng WCF khác), tôi khuyên bạn nên xem bài viết này tại MSDN. Nó chỉ cho bạn cách sử dụng các ràng buộc WCF cho MSMQ và sau đó chỉ cho bạn cách di chuyển một dịch vụ từ HTTP sang MSMQ. Trên đường đi, nó cho bạn thấy một số vấn đề với kịch bản này (và các giải pháp hữu ích cho những vấn đề này).

Cả hai đề xuất này đều sử dụng MSMQ rất nhiều, vì vậy một lưu ý về điều đó: không giống như Apache MQ, RabbitMQ và các hệ thống xếp hàng phổ biến khác, MSMQ không phải là một kiến ​​trúc hàng đợi dựa trên môi giới điển hình, thay vào đó là một hàng đợi phân tán. Điều này có nghĩa là nếu ứng dụng khách WCF của bạn gửi tin nhắn qua vận chuyển MSMQ trong khi nó không thể kết nối với máy chủ từ xa lưu trữ hàng đợi, thì máy khách sẽ xử lý tin nhắn trong cái được gọi là "Hàng đợi đi" cục bộ. Thông báo sẽ ở đó an toàn cho đến khi dịch vụ MSMQ của khách hàng phát hiện ra rằng nó có thể kết nối lại với dịch vụ MSMQ từ xa. Tại thời điểm đó, tin nhắn sẽ chảy từ máy khách đến đích cuối cùng.

Có ít nhất một cảnh báo ở trên - nếu máy chủ từ xa ngoại tuyến quá lâu (kiểm tra tài liệu của bạn cho MSMQ), khách hàng sẽ từ bỏ và chuyển tin nhắn từ hàng đợi đến hàng đợi thư chết. Tin nhắn được chuyển đến hàng đợi thư chết không thể được gửi lại tự động, chúng phải được xây dựng lại.

Nếu bạn yêu cầu mã hóa và không có ActiveDirectory, trên mục blog này , Sergey Sorokin nêu chi tiết các bước cần thiết để mã hóa giao tiếp của MSMQ bằng WCF mà không cần Active Directory.


7

Chúng không phải là thay thế 1 đổi 1 - nhiều lần bạn sẽ sử dụng NServiceBus để gửi tin nhắn vào hoặc nhận tin nhắn từ điểm cuối WCF.

Trong mọi trường hợp, xử lý các tình huống chế độ ngắt kết nối như thế này là nơi hàng đợi tin nhắn thực sự, thực sự tỏa sáng. NServiceBus là một nơi tốt để bắt đầu. Có một số tùy chọn khác ngoài kia. Tôi sẽ lưu ý rằng nhiều người trong số họ thực sự bao bọc MSMQ vào cuối ngày - MSMQ là một mặt sau rất chắc chắn và có thể đáng sử dụng khi nó có thể truy cập được.


Cảm ơn. Điểm đã được đưa ra, mặc dù tôi đang xem là sự thay thế 1: 1 trong trường hợp của mình vì hầu hết các comms WCF của tôi đều có để hỗ trợ comms giữa các máy tính này và máy chủ - nsb dường như lo tất cả điều này cho tôi, do đó nó là một sự hoán đổi -out cho tôi.
Matt Roberts

Gotcha, sau đó nó sẽ hoạt động khá tốt cho bạn.
Wyatt Barnett
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.