2017-07-06 36 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模式對你來說可能是有用的。