토픽 필터 및 작업
구독자는 토픽에서 수신할 메시지를 정의할 수 있습니다. 이러한 메시지는 하나 이상의 명명된 구독 규칙의 형태로 지정됩니다. 각 규칙은 특정 메시지를 선택하는 필터 조건으로 구성되며, 필요에 따라 선택된 메시지에 주석을 다는 작업을 포함합니다.
작업을 포함하지 않는 모든 규칙은 OR
조건을 통해 결합되며 여러 일치 규칙이 있는 경우에도 구독에서 단일 메시지를 생성합니다.
작업을 포함하는 각 규칙은 메시지의 복사본을 생성합니다. 이 메시지에는 값이 해당 일치 규칙의 이름인 RuleName
라는 속성이 있습니다. 작업은 속성을 추가 또는 업데이트하거나 원래 메시지에서 속성을 삭제하여 구독에 메시지를 생성하는 것일 수 있습니다.
구독에 5개의 규칙(작업이 포함된 규칙 2개와 작업이 없는 규칙 3개)이 있는 다음 시나리오를 생각해 보세요. 이 예시에서는 5개의 규칙과 모두 일치하는 메시지를 하나 보내면 구독에 3개의 메시지가 수신됩니다. 이는 작업을 포함하는 두 가지 규칙에 대한 2개의 메시지이며 작업을 포함하지 않는 세 가지 규칙에 대한 1개의 메시지입니다.
새로 생성된 각각의 토픽 구독에는 초기 기본 구독 규칙이 있습니다. 규칙에 대한 필터 조건을 명시적으로 지정하지 않는 경우 적용된 필터는 true 필터이며 이를 통해 모든 메시지를 구독으로 선택할 수 있습니다. 기본 규칙에는 연결된 주석 작업이 없습니다.
참고 항목
이 문서는 JMS가 아닌 시나리오에 적용됩니다. JMS 시나리오의 경우 메시지 선택기를 사용합니다.
필터
Service Bus는 세 가지 필터 조건을 지원합니다.
- SQL 필터
- 부울 필터
- 상관관계 필터
다음 섹션에서는 이러한 필터에 대한 자세한 정보를 제공합니다.
SQL 필터
SqlFilter는 도착하는 메시지의 사용자 정의 속성 및 시스템 속성에 대해 broker에서 평가되는 SQL과 유사한 조건식을 보유합니다. 모든 시스템 속성은 조건식에서 sys.
로 시작되어야 합니다. 필터 조건용 SQL 언어 하위 집합은 속성의 존재 여부(EXISTS
), Null 값(IS NULL
), 논리적 NOT
/AND
/OR
, 관계 연산자, 단순 숫자 산술 및 LIKE
와 일치하는 간단한 텍스트 패턴을 테스트합니다.
SQL 필터를 정의하는 .NET 예제는 다음과 같습니다.
adminClient = new ServiceBusAdministrationClient(connectionString);
// Create a SQL filter with color set to blue and quantity to 10
await adminClient.CreateSubscriptionAsync(
new CreateSubscriptionOptions(topicName, "ColorBlueSize10Orders"),
new CreateRuleOptions("BlueSize10Orders", new SqlRuleFilter("color='blue' AND quantity=10")));
// Create a SQL filter with color set to red
// Action is defined to set the quantity to half if the color is red
await adminClient.CreateRuleAsync(topicName, "ColorRed", new CreateRuleOptions
{
Name = "RedOrdersWithAction",
Filter = new SqlRuleFilter("user.color='red'"),
Action = new SqlRuleAction("SET quantity = quantity / 2;")
}
부울 필터
TrueFilter 및 FalseFilter는 구독에 대해 모든 도착 메시지가 구독에 대해 선택되거나(true) 선택되지 않도록(false) 합니다. 이러한 두 필터는 SQL 필터에서 파생됩니다.
부울 필터를 정의하는 .NET 예제는 다음과 같습니다.
// Create a True Rule filter with an expression that always evaluates to true
// It's equivalent to using SQL rule filter with 1=1 as the expression
await adminClient.CreateSubscriptionAsync(
new CreateSubscriptionOptions(topicName, subscriptionAllOrders),
new CreateRuleOptions("AllOrders", new TrueRuleFilter()));
상관관계 필터
CorrelationFilter는 도착 메시지의 사용자 및 시스템 속성 중 하나 이상과 일치하는 조건 집합을 보유합니다. 일반적인 사용법은 CorrelationId 속성과 일치시키는 것이지만 애플리케이션은 다음 속성과 일치하도록 선택할 수도 있습니다.
ContentType
Label
MessageId
ReplyTo
ReplyToSessionId
SessionId
To
- 사용자 정의 속성입니다.
속성에 대한 도착 메시지의 값이 상관 필터에 지정된 값과 같을 때 일치가 존재합니다. 문자열 식의 경우 비교에서 대/소문자가 구분됩니다. 여러 일치 속성을 지정할 때 필터는 이들을 논리적 AND 조건으로 결합합니다. 즉, 필터가 일치하려면 모든 조건이 일치해야 합니다.
상관 관계 필터를 정의하는 .NET 예제는 다음과 같습니다.
// Create a correlation filter with color set to Red and priority set to High
await adminClient.CreateSubscriptionAsync(
new CreateSubscriptionOptions(topicName, "HighPriorityRedOrders"),
new CreateRuleOptions("HighPriorityRedOrdersRule", new CorrelationRuleFilter() {Subject = "red", CorrelationId = "high"} ));
String
인수를 사용하는 CorrelationRuleFilter
생성자를 사용하여 상관 관계 ID가 있는 상관 관계 필터를 만듭니다.
CorrelationRuleFilter
기본 생성자를 사용하는 경우 필터링을 위해 시스템 속성(ContentType
, Label
, MessageId
, ReplyTo
, ReplyToSessionId
, SessionId
, To
) 및 사용자 정의 속성을 할당할 수 있습니다. 상관 관계 필터에 대한 사용자 정의 속성을 지정하려면 IDictionary <string, object>
형식의 Properties
속성을 사용합니다. 이 사전의 키는 메시지를 조회할 사용자 정의 속성입니다. 키와 연결된 값은 상관 관계를 지정할 값입니다. 예를 들면 다음과 같습니다.
var filter = new CorrelationFilter();
filter.Label = "abc";
filter.ReplyTo = "xdeu@hotmail.com";
filter.Properties["prop1"] = "abc";
filter.Properties["prop2"] = "xyz";
참고 항목
- 모든 필터는 메시지 속성을 평가합니다. 필터는 메시지 본문을 평가할 수 없습니다.
- 복잡한 필터 규칙에는 처리 용량이 필요합니다. 특히 SQL 필터 규칙을 사용하면 구독, 토픽, 네임스페이스 수준에서 전반적인 메시지 처리량이 줄어듭니다. 가능할 때마다 애플리케이션은 SQL과 유사한 필터보다 상관 관계 필터를 선택해야 하는데, 이는 상관 관계 필터의 처리 효율이 훨씬 높아서 처리량에 미치는 영향이 적기 때문입니다.
actions
SQL 필터 조건을 사용하면 속성 및 값을 추가, 제거 또는 교체하여 메시지에 주석을 달 수 있는 작업을 정의할 수 있습니다. 이 작업은 SQL UPDATE
문 구문에 느슨하게 의존하는 SQL과 유사한 식을 사용합니다. 이 작업은 메시지가 일치된 이후 및 구독에 선택되기 이전에 해당 메시지에서 수행됩니다. 메시지 속성에 대한 변경 사항은 구독에 복사된 메시지에 대한 프라이빗입니다.
다음은 색이 빨간색일 때 수량을 업데이트하는 작업을 사용하여 SQL 규칙을 만드는 .NET 예제입니다.
adminClient = new ServiceBusAdministrationClient(connectionString);
// Create a SQL filter with color set to red
// Action is defined to set the quantity to half if the color is red
await adminClient.CreateRuleAsync(topicName, "ColorRed", new CreateRuleOptions
{
Name = "RedOrdersWithAction",
Filter = new SqlRuleFilter("user.color='red'"),
Action = new SqlRuleAction("SET quantity = quantity / 2;")
}
Important
규칙 작업을 통해 시스템 속성을 업데이트하는 경우 예상되는 동작이 변경될 수 있습니다. 일부 속성은 큐 또는 토픽에서 메시지를 받을 때만 평가됩니다. 따라서 규칙 작업에서 이러한 속성을 업데이트한 다음 구독에 전달하면 무시됩니다. 하지만 다른 큐 또는 토픽으로 자동 전달하면 다시 평가됩니다.
- ScheduledEnqueueTime: 이 속성을 설정하거나 업데이트하면 구독에서 무시됩니다.
- 중복 제거가 포함된 MessageID: MessageID가 업데이트되고 중복되는 경우 구독에서 중복 제거가 수행되지 않습니다.
- 분할이 있는 SessionID: 이 시나리오에서 세션 ID는 분할된 엔터티의 파티션 키이며 메시지가 전송되는 파티션을 결정하는 데 사용됩니다. 규칙 작업에서 sessionID를 변경하면 메시지가 파티션에 배치된 후 파티션 키가 변경됩니다. 따라서 소비자는 세션에서 이러한 메시지 중 일부를 받지 못할 수 있습니다. 소비자가 메시지를 수신하더라도 변경된 파티션 키로 인해 잘못된 파티션에서 오는 것처럼 보입니다.
사용 패턴
브로드캐스트 패턴
토픽에 대한 가장 간단한 사용 시나리오는 모든 구독이 토픽에 전송된 각 메시지의 복사본을 가져오는 브로드캐스트 패턴을 사용하는 것입니다.
분할 패턴
분할은 필터를 사용하여 예측 가능하며 상호 배타적인 방식으로 기존의 여러 토픽 구독에 메시지를 배포합니다. 분할 패턴은 전체 데이터의 하위 집합을 보유하는 기능적으로 동일한 구획에서 다수의 많은 컨텍스트를 처리하도록 시스템 규모가 확장될 때 사용됩니다(예: 고객 프로필 정보). 분할을 사용하면 게시자가 분할 모델에 대한 지식이 없어도 토픽에 메시지를 제출할 수 있습니다. 그런 다음 메시지는 올바른 구독으로 이동되고 파티션의 메시지 처리기에서 검색이 가능해집니다.
라우팅 pattern
라우팅은 필터를 사용하여 예측 가능한 방식으로 토픽 구독에 메시지를 배포하지만 반드시 배타적이지는 않습니다. 자동 전달 기능과 함께 토픽 필터를 사용하여 Azure 지역 내에 메시지를 배포하기 위해 Service Bus 네임스페이스 내에 복잡한 라우팅 그래프를 만들 수 있습니다. Azure Service Bus 네임스페이스 간에 브리지 역할을 하는 Azure Functions 또는 Azure Logic Apps를 사용하면 LOB(기간 업무) 애플리케이션에 직접 통합하여 복잡한 글로벌 토폴로지를 만들 수 있습니다.
참고 항목
Azure Portal이 이제 Service Bus Explorer 기능을 지원하므로 포털에서 구독 필터를 만들거나 편집할 수 있습니다.
다음 단계
더 많은 예제는 Service Bus 필터 예제를 참조하세요.