2017-03-28 4 views
0

간단한 워크 플로를 실행해야하는 시스템이 있습니다. 예 : 오브젝트 Z에 대한Azure 테이블 저장소가있는 워크 플로 시스템

월 1 일 8시 15분 트리거 태스크 A에
  1. 객체 Z는 월 3 일에서 실행하려면 다음 몇 가지 코드 (중요하지 구현 세부 사항)
  2. 일정 작업 B를 실행 트리거 할 때 10:25 (등등)

워크 플로 자체는 간단하지만 500.000 이상의 인스턴스를 실행해야하며 까다로운 부분입니다.

나는 Windows Workflow Foundation을 알고 있으며, 그 이유는 바로 그 이유 때문입니다.

초기 디자인은 Azure Table Storage를 사용하는 것이므로 디자인에 대한 의견을 보내 주시면 감사하겠습니다.

시스템은 아이디어가 실행 테이블 개체 당 작업의 전체 역사를 가지고하고 시간표가 미래에 실행하는 모든 작업의 ​​목록을 것입니다 두 테이블

Table "Jobs" 
    PartitionKey: ObjectId 
    Rowkey: ProcessOn (UTC Ticks in reverse so that newest are on top) 
    Attributes: State (Pending, Processed, Error, Skipped), etc... 

Table "Timetable" 
    PartitionKey: YYYYMMDD 
    Rowkey: YYYYMMDDHHMM_<GUID> 
    Attributes: Job_PartitionKey, Job_RowKey 

구성됩니다.

일부 가정 :

  • 은 "작업이"매우 가벼운 예를 들어, 객체 당 하나 이상의 객체
  • 오직이있을 것입니다 보류중인 작업을 걸쳐하지 않습니다 일이다
    • 로모그래퍼

      • 중인 실행 작업 "시간표"의 모든 레코드에 대한

        1. 쿼리 : 큐

      시스템에 메시지를 게시하는 것은 이러한 작업을 수행 할 수 있어야합니다 "파티션 < = 오늘"및 "RowKey < = 오늘"

    • 각 레코드에 대해 (병렬로)
      1. 조회에 PartitionKey를 통해 작업 테이블에서 작업 및 RowKey
      2. "존재하지"또는 경우 주! = 다음
      3. "는 논리를"실행 건너 보류. 실패 할 경우 => 로그인 어쩌면
      4. 는 "시간표에 다음 실행 날짜를"
      5. 제출 단일 트랜잭션으로 "새 작업 기록 (다음 실행)"을 "업데이트 국가는 = 가공"및
    • 제출 일부 재시도 로직을 단 두 변형 트랜잭션에 세 레코드 :
    • 모두 마치면 => 모든 처리 시간표
    • 우려 기록 삭제. 이것이 어떤 식 으로든 극복 될 수 있습니까?개체 Z

      1. 검색어 상단에

      2. 정지 워크 플로우 정지/일시 정지 워크 플로우에 PartitionKey

      3. 에 의해 작업 테이블 1 일
      4. 어떠한 국가의 경우 == "취소"
      5. 으로 업데이트 한 후 보류
      6. (시간을 정할 때 청소 시간표를 지울 필요가 없습니다.)
    • 시작 워크 플로우

      1. 작업 테이블에 등록되지 않은 레코드를 만듭니다
      2. "일을 실행"의 관점에서

    내가 푸른 기능을 사용하는 것 시간표에 기록을 만들거나 스케줄러 - 5 분마다 대기중인 작업을 실행합니다.

    모든 의견이나 제안은 높이 평가 될 것입니다.

    감사합니다!

  • 답변

    1

    대신 서비스 버스를 사용하는 것이 어떻습니까? BrokeredMessage 클래스에는 ScheduledEnqueueTimeUtc이라는 속성이 있습니다. ScheduledEnqueueTimeUtc 등록 정보를 통해 작업을 실행 한 다음 fuggedabouddit을 사용하여 작업을 실행하도록 예약 할 수 있습니다. 그런 다음 서비스 버스 메시징 대기열을 모니터링하는 트리거 된 웹 작업을 가질 수 있으며 작업 메시지가 대기열에 들어갈 때 매우 가까이에 트리거됩니다. 필자는 필요한 서비스를 최소화하기 위해 기존 서비스에 의존하는 것을 매우 좋아합니다.

    +1

    우우 라. 서비스 버스의 멋진 기능. 나는 그것이 그것을 할 수 있다는 것을 몰랐다. 이것은 효과적으로 "시간표"를 대체 할 것입니다! 또한 그것은 하나의 엔티티 그룹 트랜잭션에서 모든 것을 얻는 데 도움이 될 것입니다 :) 나는 서비스 버스를 가지고 노는 것을 고대하고 있습니다. 그 방향으로 나를 밀어 주셔서 고마워요. –