질문
더 효율적인 메시지 필터를 작성하려면 어떻게 해야 합니까?
메시지 필터가 더 길어질 때 ESA의 성능 특성에 영향을 줄 수 있습니다.적은 수의 필터 또는 짧은 필터의 경우 효율성은 큰 문제가 되지 않습니다.그러나 더 긴 필터를 구성할 때 또는 구현에 많은 필터가 있을 경우 특정 작업의 상대적 효율성을 고려해야 합니다.
메시지 파이프라인을 통해 메시지를 전달할 때 모든 메시지 필터는 각 메시지에 대해 원자성 방식으로 평가되는 단일 표현식으로 결합됩니다.즉, 필터의 순서가 매우 중요하며 결합 표현식에 대한 회로(short-circuit) 추가 평가가 가능합니다.예를 들어, 메시지에 적용할 여러 필터가 있지만 하나의 필터가 매우 자주 적용되며 최종 작업 deliver(), bounce() 또는 drop()이 연결된 경우 가능한 한 빠른 시간 내에 목록에서 해당 필터를 이동해야 합니다.
ESA는 정규식을 처리하는 데 매우 효율적이지만 정규식 엔진을 악용하여 추가 또는 불필요한 처리를 유발할 수 있습니다.정규식의 각 평가에는 대략 같은 양의 리소스가 사용됩니다. 즉, 평가 식 수를 줄이면 효율성이 향상됩니다.예를 들어 다음 필터에서 각 "drop-attachments-by-name"의 정규식은 모두 개별적으로 평가됩니다. 즉, 첨부 파일 이름을 drop-attachments-by-name의 패턴과 비교할 때 정규식 평가가 7번 발생합니다.
strip_all_dangerous: if (true) {
drop-attachments-by-name('(?i)\\.pif$');
drop-attachments-by-name('(?i)\\.exe$');
drop-attachments-by-name('(?i)\\.scr$');
drop-attachments-by-name('(?i)\\.msi$');
drop-attachments-by-name('(?i)\\.java$');
drop-attachments-by-name('(?i)\\.dll$');
drop-attachments-by-name('(?i)\\.com$');
}
다음 예에서는 결과가 동일하지만 예제가 훨씬 효율적이어서 정규식 평가 하나만 발생합니다.
strip_all_dangerous: if (true) {
drop-attachments-by-name('(?i)\\.(pif|exe|scr|msi|java|dll|com)$');
}
두 번째 정규식은 첫 번째 필터의 7개 정규식보다 복잡하지만, 간단한 정규식 7개보다 복잡한 정규식 하나를 평가하는 것이 훨씬 효율적입니다.
그러나 이 기술은 이러한 필터를 유지 관리하는 비용과 균형을 맞춰야 합니다.