2017-07-06 56 views
0

我有复杂的代码在C#与多个类(和类有不同的功能),我想实现它作为天蓝色的功能。问题是,架构如下:流数据将作为输入,并且在类函数内的复杂计算之后,我需要将计算值作为流再次返回。要返回值是在类函数内部,我很难找到一种方法将这些函数返回给“运行”函数。有没有简单的方法来做到这一点? 结构是这样的Azure函数与复杂的C#代码

public static void Run(string myQueueItem, TraceWriter log) 
{ 
// gets data from service bus per second 
call function 1 
} 

public class Class1 
{ 
function1(){ 
call function2 
} 
} 

public class Class2 
{ 
function2() 
output interested is in here and program creates an output after 30 31 seconds and continues to creates about every 20 second 
)} 

非常感谢

+0

非常感谢您的回答。我已经更新了相应的问题 – emkay

+0

'function2' - 它有点像循环运行并每20秒发射一次事件吗?还是有一个20秒的计时器?因此,对于每个传入的消息,您创建一个长期运行的过程?它什么时候停止? – Mikhail

+0

非常感谢您的帮助。功能2没有循环运行,当没有来自服务总线的消息时停止。所以函数从服务总线获取输入消息,聚合并计算一些值并将其传递给函数2。 Function2再次执行更多计算并创建输出以发送其他azure组件。是否有意义 – emkay

回答

2

您的问题不是很清楚,但根据您的意见,我了解您的处理逻辑和计算结果取决于多个传入消息。

Azure函数(Run方法)将在队列中的每个Service Bus消息中调用一次。这意味着你需要保持某种状态,例如前面的消息,跨函数调用。

Azure函数本身不提供任何可靠的进程内状态存储,因此您需要使用外部存储(例如SQL数据库,Cosmos数据库,表存储等)。

你的功能流程会是这个样子:

  1. Run被称为传入服务总线的消息。
  2. 您可以从外部存储装载该功能的前一个状态。
  3. 您实例化Class1/Class2/etc层次结构。
  4. 您将传入消息和您的状态传递给Class1/Class2。
  5. 您的逻辑会生成输出消息,新状态或两者。
  6. 您将状态持续存储。
  7. 您将输出消息返回到输出绑定。

如果您不想要任何外部状态,Azure函数可能不适合您。例如。您可能有一个Web作业,它不断运行并在内存中保存一系列消息。

编辑:由@Gaurav建议,你应该看看 Durable Functions,但他们仍处于早期预览阶段。

+0

你好,米哈伊尔,我已经在课堂上存储状态和计算,所以我想我是完全错误的路径。我认为,就像我们在c#中所做的那样,我们也可以将类对象的状态存储在azure函数中。是完全错误的吗? – emkay

+0

@emkay问题是函数的后续调用不能保证在同一个进程或甚至机器中(记住动态调整)。所以任何内存中状态有时可能会保留,但是你不能依赖它。 – Mikhail

+0

因此,在这种情况下,您是否推荐网络工作?假设持久功能处于早期阶段。 – emkay

0

首先,Azure的功能并非设计用于复杂的处理。相反,如果您的解决方案已位于服务结构中,则可以考虑此工作或微服务的工作人员角色。

+0

嗯,这是一个大胆的声明。真的取决于我们谈论什么样的“复杂”。我在功能应用程序中看不到“多类”复杂的问题。 – Mikhail

1

您应该看看最近公布的Azure Durable Functions。不幸的是,我只读过它,并没有使用它,因此我将无法提出它将如何解决您的问题。

我喜欢这件事的一件整洁的事情是,不像你的常规函数​​,它们在自然界中是stateful,它可以让你坚持当地的状态。

我喜欢这件事的另一件事是,它是用于长期运行的任务,这是你以后的事情。我相信Function Chaining模式对你来说可能是有用的。