2017-09-17 48 views
0

我有一個監控swappa.com的功能應用程序,如果有符合我的標準的電話列表,就會發送短信。定時器觸發函數每15分鐘檢查一次swappa,隊列觸發器函數爲每個匹配列表發送一條文本消息。我僅使用綁定來訪問存儲和twilio以保持事物額外的「功能」。消除Azure功能工作流程中的重複項目?

維護狀態並避免發送關於相同列表的重複文本消息的最佳功能模式是什麼?即使我可以檢查列表的年齡,價格可以降低舊的上市,使他們一個新的比賽。所以我需要跟蹤已處理的單獨列表。

回答

0

以下是我到目前爲止提出的兩種解決方案。

  1. 在中間添加隊列觸發器功能來檢查表格存儲。如果表格中沒有條目,則將該條目添加到表格和第二個隊列中。

function.json

{ 
     "disabled": false, 
     "bindings": [ 
      { 
       "name": "queueItem", 
       "type": "queueTrigger", 
       "direction": "in", 
       "queueName": "itemqueue", 
       "connection": "AzureWebJobsStorage" 
      }, 
      { 
       "name": "itemsFoundIn", 
       "type": "table", 
       "tableName": "itemsFound", 
       "partitionKey": "{productId}", 
       "rowKey": "{price}", 
       "direction": "in", 
       "connection": "AzureWebJobsStorage" 
      }, 
      { 
       "name": "itemsFoundOut", 
       "type": "table", 
       "tableName": "itemsFound", 
       "partitionKey": "{productId}", 
       "rowKey": "{price}", 
       "direction": "out", 
       "connection": "AzureWebJobsStorage" 
      }, 
      { 
       "type": "queue", 
       "direction": "out", 
       "name": "$return", 
       "queueName": "smsqueue", 
       "connection": "AzureWebJobsStorage" 
      } 
     ] 
    } 

index.js

module.exports = function (context, queueItem) { 
     if (context.bindings.itemsFoundIn) { 
      context.log("queueItem already present in table storage. Treating as duplicate."); 
      context.done(); 
     } 
     else { 
      context.log("queueItem not found in table storage. Placing in table and destination queue."); 
      context.bindings.itemsFoundOut = queueItem; 

      context.done(null, queueItem); 
     } 
    }; 

下行:如果此功能將停用一段時間,後來啓用的,有可能是檢查表並行執行存儲,並將同一列表的兩個實例傳遞到第二個隊列。

  1. 對sms函數使用blob觸發器而不是隊列觸發器。使用blob名稱來消除重複。如果僅使用綁定,則可能需要在中間添加單獨的隊列觸發器函數以檢查現有的斑點,並將隊列項目變爲新的斑點。

缺點

+1

在場景1中,您可以將消息的TTL設置爲<15分鐘,因此如果您的功能被禁用,則來自上一次運行的消息將被丟棄。 – Mikhail

+0

@Mikhail好點!看起來我可以使用C#和與我的輸出綁定關聯的'CloudQueue'參數排隊多條消息併爲它們指定一個TTL。 –

1

如果您擔心重複,最直接的方法是將列表的所有ID(或散列)保留在一個狀態(例如,在單個表存儲行中)。在定時器觸發器中加載此狀態,根據該狀態過濾出解析結果,然後更新狀態併發送SMS的隊列項。

你也應該能夠從這個狀態中刪除舊的項目,以避免它隨着時間的推移爆炸。

我不確定您將擁有多少物品。但既然你能夠每隔15分鐘抓取所有這些,我認爲我的方案是可行的。否則,請按照您的答案中所述使用基於隊列的方案。

+0

忽略刪除舊項目,這是簡單的JavaScript和一對blob綁定(一進一出)。我最初必須上傳一個空的「{}」json blob。 –