我正试图围绕可能的瓶颈进行优化。
我有一个服务器应用程序,它可以远程地为从数据库到应用程序的对象提供服务,可以使用1到n个不同类型的对象(其中n可以是一个相对较高的数字),它们都实现了一个公共接口但是可能包含许多不同类型的独特属性。
客户端应用程序将服务器对象存储在本地缓存中,直到它们准备好通过服务器将它们保留回数据库。
目前正在WCF中进行此操作,每个类定义一个DataContract。
由于可能需要传递回服务器的大量对象(它根据实现而改变),我宁愿不再将这些作为单独的调用,而是将所有对象包装在一个单个序列化(或更好的静态压缩)流并将它们作为一个连接发送到服务器。
我可以简单地推广自己,但更愿意使用推荐的方法,并希望有人可以提出建议。如果你能说服我,我也愿意接受我的方法可能不是最好的主意。
答案 0 :(得分:3)
“相对较高”有多高?
例如,出现的一个选项是使用包装器对象:
[DataContract]
public class Wrapper {
[DataMember(Order = 1)]
public List<Foo> Foos {get {...}}
[DataMember(Order = 2)]
public List<Bar> Bars {get {...}}
[DataMember(Order = 3)]
public List<Blop> Blops {get {...}}
}
然后,您应该能够发送包含任意数量的Foo
,Bar
和/或Blop
条记录的单条消息。我对Order
属性的包含是故意的 - 如果你想减小流的大小,你可以考虑protobuf-net - 使用上面的布局,protobuf-net可以通过包含{{{{{}来挂钩到WCF 1}}在您要攻击的方法(在操作 - 合同接口中)(在客户端和服务器上)。这会将传输切换为使用google的“协议缓冲区”二进制格式,使用base-64进行编码。如果您使用的是basic-http绑定,如果启用它也可以使用MTOM,因此即使base-64也不是问题。使用此功能,您可以获得significant data transfer savings(根据显示的数字约为1/5的空间)。
(编辑1 - protobuf-net假设[ProtoBehavior]
,Foo
和Bar
也使用Blop
属性)
(编辑2 - 请注意,您始终可以将请求分解为多个中等大小的Order
消息,然后调用方法在服务器上将所有更改应用于所有更改(可能是在数据库中的登台表))