Web服务返回函数规范而不是对象?

时间:2015-06-18 17:27:30

标签: java c# web-services wcf functional-programming

道歉,如果这个问题是重复的(或者如果它有明显的答案,我错过了) - >

是否存在涉及Web服务将函数定义返回给客户端而不是值或对象的实践或模式?

对于一个额外的粗略概述示例:

我对一些统计模型的结果很感兴趣。我有一个100,000个ClientSideClass类对象的数据集。

统计模型位于服务器上,必须经常访问大型数据库并经常重新校准/重新估算。

统计模型采用一些数学形式,如RESULT = function(ClientSideClass)= A X + B Y + anotherFunction(List(Z))

有问题的服务接受具有ClientSideClass对象的请求,使用最新的统计模型执行计算,然后返回ModelResultClass类的结果对象。

在伪OOP中(再次,抱歉这个粗糙的例子):

我作为客户的程序:

static void main() {
   /* assume that this assignment is meaningful and that all
       the objects in allTheThings have the same identifying kerjigger */
   SomeIdentifier id = new SomeIdentifier("kerjigger");
   ClientSideClass[100000] allTheThings = GrabThoseThings(id);

   for (ClientSideClass c : allTheThings) {
      ModelResult mr = Service.ServerSideMethod(c);
      // more interesting things
   }
}

使用我的客户端课程:

ClientSideClass {
   SomeIdentifier ID {}
   int A {}
   double[] B {}
   HashTable<String,SomeSimpleClass> SomeHash {}
}

在服务器上,我的主要服务:

Service {
   HashTable<SomeIdentifier,ModelClass> currentModels {}

   ModelClass GetCurrentModel(SomeIdentifier id) {
       return currentModels.get(id);
   }

   ModelResultClass ServerSideMethod(ClientSideClass clientObject) {
       ModelClass mc = GetCurrentModel(clientObject.ID);
       return mc.Calculate(clientObject);
   }
}

ModelClass {
   FormulaClass ModelFormula {}

   ModelResultClass Calculate(ClientSideClass clientObject) {
       // apply formula to client object in whatever way
       ModelResult mr = ModelFormula.Execute(clientObject);
       return mr;
   }
}


FormulaClass {
    /* no idea what this would look like, just assume
         that it is mutable and can change when the model
         is updated */
   ModelResultClass Execute(clientObject) {
    /* do whatever operations on the client object
        to get the forecast result 
        !!! this method is mutable, it could change in
        functional form and/or parameter values */
    return someResult;
   }
}

这种形式导致大量的网络聊天,似乎它可能使并行处理成为问题,因为服务器可以同时处理的请求数量和/或阻止这些调用的潜在瓶颈可能是什么

在对比的形式中,服务是否可以返回函数规范而不是返回结果对象?我正在思考Lisp宏或F#引用等等。那些可以作为简单文本发送回客户端,然后在客户端处理,对吧?

那么ModelClass会看起来像这样吗? - &GT;

ModelClass {
   FormulaClass ModelFormula {}
   String FunctionSpecification {
       /* some algorithm to transform the current model form
           to a recognizable text-formatted form */
      string myFuncForm = FeelTheFunc();
      return myFuncForm;
   }
}

ServerSideMethod可能看起来像这样 - &gt;

String ServerSideMethod(SomeIdentifier id) {
   ModelClass mc = GetCurrentModel(id);
   return mc.FunctionSpecification;
}

作为客户,我想我会像这样调用新服务 - &gt;

static void main() {
   /* assume that this assignment is meaningful and that all
       the objects in allTheThings have the same identifier */
   SomeIdentifier id = new SomeIdentifier("kerjigger");
   ClientSideClass[100000] allTheThings = GrabThoseThings(id);

   string functionSpec = Service.ServerSideMethod(id);
   for (ClientSideClass c : allTheThings) {
       ModelResult mr = SomeExecutionFramework.Execute(functionSpec, c);
   }
}

这似乎是在削减网络瓶颈方面的改进,但它也应该很容易修改,以便可以通过简单地向其投掷线程来加速它。

这种方法合理吗?是否有现有的资源或框架可以做这类事情或有没有人有这方面的经验?具体来说,我对一个&#34;可解释的用例非常感兴趣。函数可以在以OO语言(即Java或C#)编写的大型Web服务中使用。

我会对具体的实现建议感兴趣(例如,使用带有Java服务的Clojure或带有C#/ WCF服务的F#),但我也会对任何一般建议或见解提出建议。

0 个答案:

没有答案