2017-09-17 8 views
0

swappa.com을 모니터링하고 내 기준과 일치하는 전화 번호가있는 경우 SMS를 전송하는 기능 앱이 있습니다. 타이머 트리거 기능은 매 15 분마다 스왑을 확인하고 큐 트리거 기능은 일치하는 각 목록에 대한 텍스트 메시지를 보냅니다. 나는 바인딩에 독점적으로 스토리지와 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를 확인하고 큐 항목을 새 BLOB로 변환해야합니다. 단점

:

+1

시나리오 1에서 메시지의 TTL을 <15 분으로 설정할 수 있으므로 기능을 사용하지 않으면 이전 실행의 메시지가 삭제됩니다. – Mikhail

+0

@Mikhail 그레이트 포인트! 출력 바인딩과 관련된 C# 및'CloudQueue' 매개 변수를 사용하여 여러 메시지를 대기열에 넣고 TTL을 지정할 수있는 것처럼 보입니다. –

1

중복이 염려되는 경우 가장 간단한 방법은 목록의 모든 ID (또는 해시)를 한 상태 (예 : 단일 테이블 저장소 행)로 유지하는 것입니다. 이 상태를 타이머 트리거에로드하고 해당 상태를 기반으로 구문 분석 된 결과를 필터링 한 다음 상태를 업데이트하고 SMS의 대기열 항목을 보냅니다.

시간이지나면서 폭발하지 않도록 이전 항목을이 상태에서 제거 할 수 있어야합니다.

얼마나 많은 업체 정보를 갖고 있는지 잘 모르겠습니다. 그러나 매 15 분마다 모든 것을 크롤링 할 수 있으므로 내 시나리오가 실현 가능하다고 가정합니다. 그렇지 않으면 응답에 설명 된대로 큐 기반 시나리오를 사용하십시오.

+0

낡은 항목의 삭제를 무시하고, 이것은 javascript와 blob 바인딩 (1 개, 1 개)의 쌍으로 간단했습니다. 처음에는 빈 "{}"json blob을 업로드해야했습니다. –