2014-01-23 3 views
2

우리는 Vindicia와 함께 새로운 청구 시스템을 구현하고 있습니다. Vindicia에는 모듈을 쉽게 만들 수있는 훌륭한 wsdl 파일이 있습니다. 그래서 우리는 SUDS입니다. 하지만 문제는 SUDS가 이러한 wsdl을로드하는 데 실제로 속도가 느리다는 것입니다. (우리의 경우 2.4 초까지 걸립니다.)SUDL로 WSDL로드가 느림

다음은 SUDS로 구현 한 방법입니다.

class BaseWSDL(object): 
    client = None 
    group = "" 
    instances = "" 

    @classmethod 
    def get_client(cls): 
     if cls.client is None: 
      wsdl = 'file://%s/%s.wsdl' % (wsdl_dir, cls.group) 

      cls.client = Client(url=wsdl, location=host) 
      setattr(cls, cls.instances.split(":")[1].lower(), cls.client.factory.create(cls.instances)) 
     return cls.client 

class Authentication(object): 
    def __init__(self, client, instances): 
     self.authentication = client.factory.create(instances) 
     self.authentication.login = login 
     self.authentication.password = pw 

class BillingPlan(BaseWSDL): 
    group = "BillingPlan" 
    instances = "ns2:BillingPlan" 

    def __init__(self, **kwargs): 
     super(BillingPlan, self).__init__() 

    def fetch_all(self): 
     client = self.get_client() 
     auth = Authentication(client, "ns2:Authentication") 
     response = client.service.fetchAll(auth.authentication) 
     if response[0].returnCode == "200": 
      plans_dict = {} 
      for plan in response[1]: 
       plans_dict[plan.merchantBillingPlanId] = plan 
      return plans_dict 

는 그러나 문제는 여기 cls.client = Client(url=wsdl, location=settings.VIN_SOAP_HOST) 2를 처음보고 걸립니다. 그러나 우리는 새로운 요청에 대해 동일한 객체를 재사용하며 SUDS가 Thread safe가 아니라는 사실에 우려를 표시합니다.

그래서 우리는 또 다른 간단한 해결책을 찾았습니다. 그리고 우리는 pySimpleSoap이 훨씬 빠르다는 것을 발견했습니다.

그러나 우리는 wsdl의로드 중에 재귀 오류가 발생합니다.

... 
    File "/usr/local/lib/python2.7/dist-packages/pysimplesoap/helpers.py", line 205, in postprocess_element 
    postprocess_element(n) 
    File "/usr/local/lib/python2.7/dist-packages/pysimplesoap/helpers.py", line 188, in postprocess_element 
    postprocess_element(v) 
    File "/usr/local/lib/python2.7/dist-packages/pysimplesoap/helpers.py", line 188, in postprocess_element 
    postprocess_element(v) 
    File "/usr/local/lib/python2.7/dist-packages/pysimplesoap/helpers.py", line 205, in postprocess_element 
    postprocess_element(n) 
    File "/usr/local/lib/python2.7/dist-packages/pysimplesoap/helpers.py", line 188, in postprocess_element 
    postprocess_element(v) 
    File "/usr/local/lib/python2.7/dist-packages/pysimplesoap/helpers.py", line 185, in postprocess_element 
    for k, v in elements.items(): 
    File "/usr/local/lib/python2.7/dist-packages/pysimplesoap/simplexml.py", line 151, in items 
    return [(key, self[key]) for key in self.__keys] 
RuntimeError: maximum recursion depth exceeded while calling a Python object</code> 

그래서 우리는 WSDL의 부하를 절감하는 솔루션을 찾고 있습니다 (알려진 문제로 솔기하는 재귀 얘기 코드에서 TODO있다). 클라이언트를 만든 후 캐시하는 것이 좋습니다. 재사용할까요? 그리고 구현이 간단해야합니다. 모든 기능을 다시 구현할 필요가 없기를 바랍니다.

답변