2012-02-03 44 views
8

Tôi không thể từ chối lợi ích hiệu suất của cuộc gọi không đồng bộ hai chiều, nhưng một số điều khiến tôi cảm thấy cảnh giác.Thực tiễn tốt nhất cho khách hàng Duplex WCF

Mối quan tâm của tôi là đối tượng khách hàng được khởi tạo, WCF có thể cho biết phiên bản dịch vụ khách hàng cụ thể nào sẽ nhận được đối số gọi lại không?

Bất cứ ai có thể cho tôi biết nếu đây là một ý tưởng hay không? Nếu không, tai sao không?

new DuplexChannelFactory<IServerWithCallback>(
    new ClientService(), 
    new NetTcpBinding(), 
    new EndpointAddress("net.tcp://localhost:1234/"+Guid.NewGuid())) 
  1. Nếu đường dẫn ảo trên được dành riêng như thế nào nó có thể được loại bỏ. Tôi muốn tuổi thọ của dịch vụ khách hàng khá ngắn. IE thực hiện một yêu cầu và nhận được một phản ứng và khi thực hiện nhận được, giết nó. Làm thế nào xấu là hình phạt hiệu suất trong việc làm cho đời sống dịch vụ khách hàng ngắn như trái ngược với gộp nó và giữ nó sống lâu hơn.

    Ý tưởng là để tránh vấn đề thời gian chờ. Khi thực hiện nhận, gửi, xử lý ASAP. Theo quy ước - không thể vượt qua các dịch vụ khách hàng xung quanh. Nếu bạn cần thông tin, hãy tạo một thông tin mới, đơn giản - giống như EF/L2S, v.v.

  2. Từ bên trong bản thân dịch vụ WCF, làm cách nào để tôi hủy phiên với máy khách. I E. Tôi không muốn khách hàng kết thúc phiên - Tôi biết tôi có thể trang trí hoạt động của mình cho phù hợp, nhưng tôi muốn dịch vụ chấm dứt chính nó theo chương trình khi các điều kiện nhất định được đáp ứng.

  3. Tôi có thể gắn cổng và chuyển tiếp tương ứng để giải quyết mọi sự cố tường lửa, nhưng điều tôi lo lắng là nếu ứng dụng khách ngồi sau bộ cân bằng tải. Dịch vụ sẽ biết máy chủ cụ thể nào sẽ gọi?

Trả lời

7

Tôi nghĩ dịch vụ Duplex đơn giản là một kiến ​​trúc không thành công khác của Microsoft. Đây là một trong những thứ trông thực sự tốt trên giấy nhưng chỉ rơi ra khi kiểm tra kỹ hơn.

Có quá nhiều điểm yếu:

1) Phụ thuộc vào phiên để thiết lập trình nghe khách hàng của máy chủ.Đây là thông tin phiên được lưu trữ trong bộ nhớ. Do đó bản thân máy chủ không thể được cân bằng tải. Hoặc nếu nó được cân bằng tải, bạn cần bật ip affinity, nhưng bây giờ nếu một trong các máy chủ bị tấn công, bạn không thể chỉ cần thêm một cái khác và mong đợi tất cả các phiên này tự động di chuyển sang máy chủ mới.

2) Đối với mỗi khách hàng ngồi sau bộ định tuyến/tường lửa/loadbalancer, một điểm cuối mới với cổng cụ thể cần được tạo. Nếu không, router sẽ không thể định tuyến đúng các thông điệp gọi lại đến máy khách thích hợp. Một cách khác là có một bộ định tuyến cho phép lập trình tùy chỉnh để chuyển hướng đường dẫn cụ thể đến một máy chủ cụ thể. Một lần nữa một trật tự cao. Hoặc một cách khác là cho khách hàng với cuộc gọi lại để lưu trữ cơ sở dữ liệu của riêng mình và chia sẻ dữ liệu qua cơ sở dữ liệu < - Có thể làm việc trong một số trường hợp phí cấp phép không phải là vấn đề ... nhưng nó giới thiệu rất nhiều phức tạp và khách hàng cộng với nó trộn lẫn lớp ứng dụng và dịch vụ với nhau (có thể chấp nhận được trong một số trường hợp ngoại lệ, nhưng không phải trên chi phí thiết lập lớn)

3) Tất cả điều này về cơ bản nói rằng thực tế là hai mặt vô dụng. Nếu bạn cần gọi lại thì bạn sẽ làm tốt để thiết lập một máy chủ wcf trên đầu máy khách. Nó sẽ đơn giản hơn và dễ mở rộng hơn nhiều. Plus có ít khớp nối giữa máy khách và máy chủ.

Giải pháp song công tốt nhất cho kiến ​​trúc có thể mở rộng là cuối cùng không sử dụng.

+2

Câu trả lời này có đúng với NetTcpBinding hay chỉ để liên kết Dual Http? – Yaniv

3
  1. Nó sẽ phụ thuộc vào cách ngắn bạn cần khách hàng new'd lên và họ sẽ kéo dài trong bao lâu. Việc gộp nhóm sẽ không phải là một tùy chọn nếu bạn cần một khách hàng mới mỗi lần, nhưng nếu khách hàng tiếp tục làm điều tương tự thì tại sao không có một nhóm họ chờ đợi để được sử dụng, nếu họ không thể tạo lại cùng một khách hàng đó.

  2. Thực tế trong trường hợp gọi lại nếu dịch vụ gọi lại cho khách hàng (thực sự gọi một hàm trên máy khách) để chuyển thông tin dịch vụ hiện là khách hàng và ngược lại. Bạn có thể có dịch vụ đang thực hiện gọi lại .Đóng() kết nối nhưng nó sẽ được mở cho đến khi GC có thể xử lý nó, từ trải nghiệm của tôi có thể mất nhiều thời gian hơn dự kiến. Vì vậy, trong ngắn hạn khách hàng phải chịu trách nhiệm (khách hàng là một trong những thực hiện cuộc gọi đến một cái gì đó) để đóng chính nó xuống, hoặc ngắt kết nối, dịch vụ chỉ nên trả lại câu trả lời hoặc lấy dữ liệu từ một khách hàng.

  3. Trong cuộc gọi lại hai chiều, dịch vụ hiện đang gọi lại cho khách hàng sẽ nhận được địa chỉ của khách hàng được tóm tắt phía sau duplexchannelfactory. Nếu dịch vụ không thể gọi lại cho khách hàng tôi không nghĩ rằng có nhiều thứ có thể được thực hiện, bạn phải đảm bảo cổng mà khách hàng của bạn đang gọi đến dịch vụ đang mở để nhận các cuộc gọi lại mà tôi đoán.

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