使用Spyne的SOAP的性能问题

时间:2014-04-29 12:09:07

标签: performance soap spyne

我们在SOAP Web服务中遇到了性能问题。 Web服务是使用Spyne构建的。

我认为可以解决问题,更改接口只返回必要数据的接口,因为我们将大型soap对象发送到客户端。

示例:

我们有一个具有很多属性的Fabric soap对象,见下文:

class Fabric(ComplexModel):
   __namespace__ = 'vadain.webservice.curtainconfig'
   id = Mandatory.Integer
   "Fabric ID"
   articleNumber = String
   "Article Number"
   name = Mandatory.Unicode
   "Fabric Name"
   color = Mandatory.Unicode
   "Color"
   width = Float
   "Fabric Width"
   widthType = WidthType
   "Width Type"
   supplier = Mandatory.Unicode
   supplierId = Integer
   "Supplier"
   ETC.

还有更多!!

我们已经实现了两个界面搜索结构和获取结构,见下文:

搜索面料:

@rpc(Unicode, _returns=soap.Fabric.customize(max_occurs='unbounded'))
def fabricsWithName(ctx, name):
--Code to get all fabrics with name
return fabrics

获取面料:

@rpc(Integer, _returns=soap.Fabric)
def getFabric(ctx, fabric_id):
   --Code to get fabric from ID
return fabric

灼热织物的界面正在返回织物的所有属性,但这不是必需的。可以更改只返回结构名称和ID。

如何以良好的方式更改此界面' fabricsWithName'只会返回结构名称和ID,这会解决性能问题吗?

1 个答案:

答案 0 :(得分:0)

为什么不将返回值设置为仅包含所需内容的类?

e.g。

class FabricLite(ComplexModel):
   __namespace__ = 'vadain.webservice.curtainconfig'
   id = Mandatory.Integer

   name = Mandatory.Unicode

# (...)

@rpc(Integer, _returns=FabricLite)
def getFabric(ctx, fabric_id):
    # (...)

您无需更改函数体中的任何内容,Spyne将忽略其余数据。

另外,我将getFabric签名更改为:

@rpc(Mandatory.UnsignedInteger32, _returns=FabricLite)

以便传入值验证更严格。