2011-05-24 35 views
6

Tôi đang xem xét chuyển các phần của ứng dụng .Net sang các máy tính khác. Cách rõ ràng để làm điều này chỉ đơn giản là sử dụng WCF với một giao thức tcp nhị phân, ví dụ như describer trong "Easiest way to get fast RPC with .NET?".Cách tối ưu hóa để thực hiện RPC trong .Net

Tôi sẽ thực hiện một số lượng lớn các cuộc gọi và độ trễ là một vấn đề lớn. Về cơ bản một máy tính sẽ chạy một trình mô phỏng vật lý và những người khác sẽ tương tác với nó bằng cách sử dụng API của vài trăm lệnh.

Tôi nghĩ cách tốt nhất là tạo giao thức nhị phân tùy chỉnh trong đó các lệnh API được xác định bằng int16 và số thứ tự, và theo sau là các tham số bắt buộc. Hardwiring các lớp gửi và nhận sẽ loại bỏ bất kỳ chi phí không cần thiết nào.

Nhưng đó là rất nhiều công việc kể từ khi chúng tôi đang nói vài trăm lệnh API.

Bất kỳ suy nghĩ nào về cách tốt nhất để thực hiện nó?

Chỉnh sửa: Để làm rõ: AFAIK serialization in .Net không được tối ưu hóa. Có một hình phạt tương đối cao trong tuần tự hóa và deserializing đối tượng trong ví dụ việc sử dụng nội bộ của Reflection. Đây là loại những gì tôi muốn tránh, và do đó của tôi mặc dù xung quanh lập bản đồ trực tiếp (hardwiring) phương pháp.

Sau khi một số tìm kiếm tôi tìm thấy một ứng dụng tôi đã có một hồi ức mơ hồ về: http://www.protocol-builder.com/

+0

Bạn nói * độ trễ * là một vấn đề lớn, nhưng độ trễ là khá nhiều cố định. * Băng thông * có phải là nút cổ chai của bạn ở đây không? Tôi có thể đề xuất các cách để giảm băng thông trong WCF nếu bạn muốn thỏa hiệp giữa conveniece của WCF và hiệu suất của một giao thức tùy chỉnh ... –

+0

Với độ trễ tôi có nghĩa là thời gian cần từ một sự kiện vật lý (chẳng hạn như va chạm, trong hàng ngàn "cùng một lúc") để được xử lý và hành động theo. (Có, tôi cũng sẽ phải điều chỉnh số lượng sự kiện.) –

+0

một cách hiệu quả để giảm chi phí là gửi một tin nhắn duy nhất có trọng tải lớn hơn. Quan hệ nào trở lại với việc giảm băng thông. Tôi khá thích trao đổi serializer, ví dụ (DataContractSerializer không được biết đến là terse) –

Trả lời

8

Giảm lưu lượng tổng (đó sẽ là lợi ích chính của Nghị định thư tùy chỉnh so với sử dụng WCF) không được sẽ có một lượng lớn ảnh hưởng đến độ trễ. Vấn đề chính là giữ số lượng dữ liệu cho "tham số bắt buộc" ở mức tối thiểu, do đó, mỗi yêu cầu là tương đối nhỏ. Tuần tự hóa mặc định trong WCF khá hiệu quả, đặc biệt là khi sử dụng TCP trên mạng cục bộ. Trong một kịch bản như bạn đang mô tả, với nhiều khách hàng kết nối với một máy chủ tập trung, rất có khả năng việc vận chuyển các thông điệp sẽ là nút cổ chai - xử lý các thông điệp cụ thể có thể là nút cổ chai và giao thông vận tải. cơ chế sẽ không quan trọng nhiều.

Cá nhân, tôi chỉ sử dụng WCF và không bận tâm với việc cố tạo một giao thức tùy chỉnh. Nếu, một khi bạn có nó chạy, bạn thấy rằng bạn có một vấn đề, bạn có thể dễ dàng trừu tượng ra các phương tiện giao thông để một giao thức tùy chỉnh tại thời điểm đó, và bản đồ nó vào cùng một giao diện. Điều này sẽ yêu cầu rất ít mã bổ sung so với chỉ làm một giao thức tùy chỉnh chồng lên phía trước, và có khả năng giữ mã sạch hơn nhiều (vì giao thức tùy chỉnh sẽ được phân tách thành một ánh xạ đơn tới API "sạch"). Tuy nhiên, nếu bạn thấy vận chuyển không phải là một nút cổ chai, bạn sẽ tiết kiệm cho mình một lượng lớn lao động và công sức.

+0

+1, ông cũng có thể xem xét việc gửi thư để gửi. – user7116

+0

Hoặc gửi chúng không đồng bộ, do đó độ trễ không bị chặn ngay lập tức –

+0

có vẻ hợp lý. –

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