큐는 기본적으로 들어온 순서대로 나간다. 순서를 바꾸려면 연결을 선택하고 Configure → Settings 의 Prioritizers 에 우선순위 규칙을 추가한다.
| 우선순위 | 동작 |
|---|---|
FirstInFirstOutPrioritizer |
들어온 순서 (기본 동작) |
NewestFlowFileFirstPrioritizer |
가장 늦게 들어온 것부터 |
OldestFlowFileFirstPrioritizer |
가장 오래된 것부터 |
PriorityAttributePrioritizer |
속성 priority 값의 오름차순. 숫자면 수치 비교, 아니면 사전순 |
여러 개를 등록하면 위에서부터 차례로 적용한다.
여기서 흔히 오해하는 점이 있다. NewestFlowFileFirstPrioritizer 는 순서만 바꾼다. 나머지 FlowFile 이 사라지지는 않으므로, 실행할 때마다 최신 한 건만 처리하고 나머지를 버리려는 요구는 이것만으로 충족되지 않는다. 오래된 것들은 큐에 계속 남아 결국 처리되거나 back pressure 를 만든다.
정말로 최신 한 건만 남기려면 둘 중 하나를 더한다.
첫째, 연결에 FlowFile Expiration 을 건다. 예를 들어 실행 주기가 5 분이면 만료를 5 mins 로 두어 그 주기 안에 처리되지 못한 건은 사라지게 한다. 데이터 유실을 전제하는 설정이므로 최신값만 의미 있는 센서 값 같은 데이터에 쓴다.
둘째, 소스 단계에서 최신만 고른다. ListFile · ListSFTP · ListS3 는 file.lastModifiedTime 이나 s3.lastModified 를 속성으로 붙이므로, 목록 단계에서 최신 하나만 남기고 나머지는 라우팅으로 버린다. 원본이 디렉터리라면 이쪽이 자연스럽다.
Funnel 은 여러 연결을 하나로 모으는 점이다. 프로세서가 아니므로 설정도 스케줄도 없고, 받은 FlowFile 을 그대로 다음 연결로 넘긴다.
쓰임새는 두 가지다. 하나는 여러 프로세서의 failure 관계를 한곳으로 모아 공통 오류 처리로 보내는 것이고, 다른 하나는 여러 갈래를 하나의 연결로 합쳐 우선순위나 분배 전략을 한 곳에서만 지정하는 것이다.
Funnel 자체는 큐를 갖지 않는다. 화면에서 보이는 건수는 Funnel 앞뒤 연결의 큐에 있는 건수다.
FlowFile 을 밀어 주는 주체는 언제나 다음 프로세서 다. 큐 자체에는 실행 기능이 없으므로, 큐에 한 건이 남아 있다면 뒤에 있는 프로세서가 돌지 않는 것이다.
확인 순서는 다음과 같다.
큐에 남은 건이 back pressure 를 만들어 상류가 멈춰 있는 경우도 같은 방식으로 확인한다.