有一个很好的例子here:
CRUD x业务逻辑接口。假设您正在使用发票。每张发票都包含一个InvoiceHeader和一个或多个InvoiceLine。如果您使用CRUD接口作为发票,您将首先调用CreateInvoiceHeader操作来创建InvoiceHeader,然后调用几个AddInvoiceLine操作来添加所有InvoiceLines - 这是低级CRUD方法。但是如果你在服务端实现业务逻辑,你将调用单个CreateInvoice并将一个复杂的对象图(包含所有行的标题)传递给服务,以创建和添加所需的内容。
为什么一个完美合法的方法组合
var Invoice =
Service.CreateInvoice(
Service.CreateInvoiceHeader(...),
{
Service.CreateInvoiceLine(...),
Service.CreateInvoiceLine(...)
}
)
为什么必须创建一个复杂的对象图并将其发送到服务方法
var InvoiceDTO = new InvoiceDTO(
new InvoiceHeaderDTO(...),
{
new InvoiceLineDTO(...),
new InvoiceLineDTO(...)
}
)
var Invoice = Service.Create(InvoiceDTO)
并且服务必须遍历整个图并调用相同的Service方法来组合生成的Invoice?
有没有办法使用方法组合来创建复杂的结果而不使用复杂的对象图作为数据传输?
答案 0 :(得分:2)
答案是,对于SOA架构,您的性能瓶颈是往返行程非常昂贵。它们会增加延迟,适用于您的网络和CPU开销。
有几种基本的缓解策略。
把相互交谈的东西放在一起。在同一过程中是最佳的。在同一台机器上帮助很大。在数据中心附近仍然有帮助。这种方法的缺点是,你可以放在一起的程度受到机器尺寸的限制。
将工作分解为更细粒度的块,以最大限度地减少往返次数。这种方法的缺点是左侧的相互作用可能更复杂(您的“复杂对象图”就是一个例子)。
使用更有效的协议。在过去的千年里,真正聪明的人们嘲笑XML作为RPC协议。十年前聪明的人意识到这是愚蠢的。很多组织仍在使用它。停止。使用JSON,Cap'n Proto或其他东西。唯一的缺点是让人们就如何做什么达成一致的组织挑战。
并行拨打电话。那就是一次不发送50个请求。将它们一起发送并在它们回来时处理它们。缺点是这大大增加了代码复杂性,只会导致延迟 - 资源消耗没有帮助。
您无需在这些选项中进行选择。拥有良好SOA架构的公司(例如Google)可以完成所有4个。
那说,回到你的问题。有一个中间立场。你可以做的就是调用创建一个对象,进行各种调用来构建数据结构,然后调用实际发送它,而不是用复杂的对象进行调用。代码看起来与您使用低级CRUD接口编写的代码完全相同,只是在末尾有一个Service.Send()
调用实际发送请求。