정해진 시각에 디렉터리를 훑어 가장 최근에 수정된 파일 하나만 처리하고 나머지는 버리고 싶다. 스크립트를 쓰지 않고 표준 프로세서만으로 구성한다.
ControlRate 는 Rate Control Criteria 로 무엇을 기준으로 셀지 정한다. 이 값을 확인하지 않으면 Maximum Rate 에 무엇을 넣어야 하는지부터 어긋난다.
| Rate Control Criteria | 세는 단위 | Maximum Rate 표기 |
|---|---|---|
| flowfile count | FlowFile 개수 | 1, 10 같은 숫자 |
| data rate | 바이트 | 1 MB, 10 MB 같은 크기 |
| attribute value | 지정한 속성의 숫자 값 합 | 숫자 |
기본값이 data rate 인 버전에서 Maximum Rate 에 1 을 넣으면 "초당 1바이트" 가 되어 흐름이 사실상 멈춘다. 개수로 조절하려면 반드시 flowfile count 로 바꾼다.
Time Duration 은 그 기준을 적용할 창의 길이다. Maximum Rate=1, Time Duration=1 sec 이면 1초에 하나만 통과시킨다.
핵심은 큐에서 정렬해 최신 파일을 맨 앞에 두고, ControlRate 로 하나만 통과시킨 뒤 나머지를 버리는 것이다.
Run Schedule 을 CRON 으로 두어 정해진 시각에만 돈다.
0 0 23 * * ?
주요 속성은 다음과 같다.
| 속성 | 값 | 이유 |
|---|---|---|
| Input Directory | 대상 경로 | |
| Minimum File Age | 2 min 이상 |
아직 쓰고 있는 파일을 집지 않는다 |
| Recurse Subdirectories | 필요에 따라 | |
| File Filter | 정규식 | 대상 범위를 좁힌다 |
ListFile 은 상태를 기억해 이미 나열한 파일을 다시 내보내지 않는다. 매번 전체를 다시 훑어야 한다면 ListFile 이 아니라 GetFile 이나 다른 구성을 검토한다.
FlowFile 속성 priority 에 수정 시각의 음수를 넣는다. PriorityAttributePrioritizer 는 값이 작은 쪽을 먼저 내보내므로, 음수를 쓰면 최신 파일이 앞으로 온다.
priority = ${file.lastModifiedTime:toDate("yyyy-MM-dd'T'HH:mm:ssZ"):toNumber():multiply(-1)}
file.lastModifiedTime 의 형식은 NiFi 버전에 따라 다를 수 있으므로, 실제 값을 큐의 FlowFile 속성에서 먼저 확인하고 toDate 의 패턴을 맞춘다.
UpdateAttribute 와 ControlRate 를 잇는 연결의 설정에서 PriorityAttributePrioritizer 를 고른다. Prioritizer 는 프로세서가 아니라 연결(큐) 의 속성이다. 여기서 헤매는 경우가 많다.
| 속성 | 값 |
|---|---|
| Rate Control Criteria | flowfile count |
| Maximum Rate | 1 |
| Time Duration | 1 sec |
success 는 다음 처리(FetchFile 등)로 보내고, rate.limit.exceeded 관계는 LogAttribute 를 거쳐 종료(Terminate)로 보낸다. 이렇게 하면 버려진 파일의 이름이 로그에 남아 나중에 확인할 수 있다.
ListFile 은 메타데이터만 만든다. 파일 내용을 처리하려면 FetchFile 이 필요하다.
ControlRate 는 "시간 창 안에서 몇 개" 를 세는 것이지 "큐 전체에서 최고 하나" 를 고르는 것이 아니다. 위 구성이 동작하는 이유는 ListFile 이 한 번에 목록을 쏟아 낸 뒤 그 뭉치가 1초 안에 큐를 지나가기 때문이다. 파일이 아주 많아 처리가 1초를 넘기면 두 번째 창이 열려 두 개가 통과할 수 있다.
파일 수가 많거나 확실성이 필요하면 다른 방법을 쓴다.
Time Duration 을 늘리면 그만큼 뒤에 온 FlowFile 이 큐에서 대기한다. 버릴 것이라면 대기가 무의미하므로 짧게 둔다.rate.limit.exceeded 를 자동 종료(auto-terminate)로 두면 버려진 파일이 아무 흔적 없이 사라진다. 운영에서는 로그를 남기는 편이 낫다.