2013-07-10 38 views
16

Chúng tôi đã bắt đầu điều tra việc sử dụng Windows Azure Service Bus như một sự thay thế cho hàng đợi hiện tại của chúng tôi khi chúng tôi chuyển sang một kiến ​​trúc hướng dịch vụ.Kiểu nối tiếp Bus dịch vụ Azure

Hầu hết tài liệu rõ ràng; tuy nhiên tôi gặp khó khăn trong việc xác định loại serialization nào mà BrokeredMessage sử dụng khi được cung cấp với một cơ thể.

Ví dụ, giả sử tôi tạo một đối tượng BrokeredMessage như sau:

ICommand sendMessageCommand = new SendMessageCommand 
{ 
    Title = "A new message title", 
    Body = "A new message body" 
}; 

BrokeredMessage brokeredMessage = new BrokeredMessage(sendMessageCommand); 

queueClient.Send(brokeredMessage); 

SendMessageCommand là một DTO đơn giản đánh dấu với thuộc tính [Serializable]; trong hàng đợi cũ của chúng tôi, mã nhị phân này được tuần tự hóa sao cho nó có thể được lưu trữ nhanh hơn và bảo toàn dữ liệu meta của nó. Điều này quan trọng đối với chúng tôi khi chúng tôi sử dụng hàng đợi để gửi lệnh bằng cách sử dụng pattern outlined here với vai trò người lao động nhận được deserialzing lệnh với một hỗn hợp của generics và gõ năng động.

Tuy nhiên theo THIS bài viết nội dung được truyền vào hàm tạo của BrokeredMessage là "Phân loại XML nhị phân". Giả định của tôi sau đó là đây là tiêu chuẩn hóa tuần tự XML sau đó được truyền qua một trình định dạng nhị phân, đúng không?

Thêm vào đó; điều đó có nghĩa là nếu tôi sử dụng chức năng cơ thể thông báo mặc định BrokeredMessage; Tôi sẽ phải đảm bảo tất cả các đối tượng là XML Serializable, bao gồm tất cả các vấn đề trình bày? (Mất trường riêng tư, không có dữ liệu meta để deserializing sử dụng generics, xml serialization thuộc tính)

Cuối cùng; Nếu đây là trường hợp; là có một cách đơn giản xung quanh này? Tôi đã xem xét việc làm serialization nhị phân của riêng của chúng tôi sau đó lưu trữ các byte[] trong một tài sản trên BrokeredMessage.

Trả lời

20

Theo the documentation:

Một ứng dụng có thể thiết lập các nội dung của thư bằng cách thông qua bất kỳ đối tượng serializable đến constructor của BrokeredMessage, và DataContractSerializer thích hợp sau đó sẽ được sử dụng để serialize đối tượng . Ngoài ra, một System.IO.Stream có thể được cung cấp.

Các constructor bạn đang sử dụng có this documentation:

Khởi một trường hợp mới của lớp BrokeredMessage từ một cho đối tượng bằng cách sử dụng DataContractSerializer với một XmlDictionaryWriter nhị phân.

Điều này phù hợp với các thông báo được định nghĩa là DataContracts, như được giải thích in this article.

Hoặc bạn có thể sử dụng người thay thế như được mô tả trong this answer.

Bạn cũng có thể cung cấp your own serializer hoặc a stream.

Một giải pháp thay thế sẽ là thực hiện tuần tự hóa của riêng bạn và sử dụng mảng hoặc chuỗi byte làm đối tượng tuần tự được cung cấp cho hàm tạo (ngược lại với thuộc tính thư).Đây là một cách tiếp cận phù hợp cho khả năng tương tác, vì bạn có thể sử dụng các định dạng tuần tự hóa như JSON hoặc protobuf. Chính sách Best Practices for Performance in Windows Azure Applications của Microsoft đề xuất sử dụng tuần tự hóa tùy chỉnh hoặc của bên thứ ba khi nó ảnh hưởng đến hiệu suất.

Tôi đã có kết quả tốt bằng cách sử dụng JSON serialization và dynamic objects.

+1

Liên kết thực tiễn tốt nhất đã chết – MPavlak

+3

Nhiều ví dụ trong [Kho lưu trữ Azure-mẫu GitHub] (https://github.com/Azure-Samples/azure-servicebus-messaging-samples) cũng sử dụng tuần tự hóa JSON với các đối tượng động . Tôi thích cách tiếp cận này ngay cả đối với các đối tượng tĩnh như bạn không phải xả rác mô hình của bạn với các thuộc tính DataContract và DataMember. –