다음을 통해 공유


서비스 브로커

적용 대상:SQL ServerAzure SQL Managed Instance

SQL Server Service Broker는 SQL Server 데이터베이스 엔진 및 Azure SQL Managed Instance의 메시징 및 큐에 대한 기본 지원을 제공합니다. 개발자는 데이터베이스 엔진 구성 요소를 사용하여 서로 다른 데이터베이스 간에 통신하고 분산되고 신뢰할 수 있는 애플리케이션을 빌드하는 정교한 애플리케이션을 쉽게 만들 수 있습니다.

Service Broker를 사용하는 경우

Service Broker 구성 요소를 사용하여 네이티브 데이터베이스 내 비동기 메시지 처리 기능을 구현합니다. Service Broker를 사용하는 애플리케이션 개발자는 복잡한 통신 및 메시징 내부를 프로그래밍하지 않고도 여러 데이터베이스에 데이터 워크로드를 분산할 수 있습니다. Service Broker는 대화 컨텍스트에서 통신 경로를 처리하므로 개발 및 테스트 작업을 줄입니다. 또한 성능을 향상시킵니다. 예를 들어 웹 사이트를 지원하는 프런트 엔드 데이터베이스는 정보를 기록하고 프로세스 집약적인 작업을 백 엔드 데이터베이스의 큐에 보낼 수 있습니다. Service Broker는 모든 태스크가 트랜잭션 컨텍스트에서 관리되도록 하여 안정성과 기술 일관성을 유지합니다.

개요

Service Broker는 기본 데이터베이스 내 서비스 지향 애플리케이션을 만들 수 있는 메시지 배달 프레임워크입니다. 쿼리 수명 주기 동안 테이블에서 데이터를 지속적으로 읽고 처리하는 클래식 쿼리 처리 기능과 달리 서비스 지향 애플리케이션에는 메시지를 교환하는 데이터베이스 서비스가 있습니다. 모든 서비스에는 메시지가 처리될 때까지 배치되는 큐가 있습니다.

Service Broker 프로세스 흐름의 다이어그램.

큐의 메시지는 Transact-SQL RECEIVE 명령을 사용하거나 메시지가 큐에 도착할 때마다 호출되는 활성화 프로시저를 사용하여 가져올 수 있습니다.

서비스 만들기

비고

대상 서비스는 하나 이상의 계약을 노출해야 합니다. 계약 없이 서비스를 만들면 메시지를 받을 수 없습니다. 보낸 메시지는 성공하는 것처럼 보이지만, 메시지는 여전히 개시자의 sys.transmission_queue에 남아 있습니다.

/*
In this example, the initiator must then use ON CONTRACT [DEFAULT] and a MESSAGE TYPE [DEFAULT]. [DEFAULT] is a delimited identifier for the built‑in contract and isn't a T‑SQL keyword, so it must be bracketed or quoted.
*/
CREATE QUEUE dbo.ExpenseQueue;
GO

CREATE SERVICE ExpensesService
ON QUEUE dbo.ExpenseQueue ([DEFAULT]);

메시지 보내기

메시지는 SEND Transact SQL 문을 사용한 서비스 간의 대화를 통해 보내집니다. 대화는 BEGIN DIALOG Transact-SQL 문을 사용하여 서비스 간에 설정된 통신 채널입니다.

-- Begin a dialog
DECLARE @dialog_handle AS UNIQUEIDENTIFIER;

BEGIN DIALOG @dialog_handle
    FROM SERVICE ExpensesClient
    TO SERVICE N'ExpensesService'
    ON CONTRACT [DEFAULT];

-- Send a message
SEND ON CONVERSATION (@dialog_handle)
    MESSAGE TYPE [DEFAULT] (N'<Expense ExpenseId="1" Amount="123.45" Currency="USD"/>');

메시지가 ExpensesService으로 전송되고 dbo.ExpenseQueue에 배치됩니다. 이 큐와 연결된 활성화 프로시저가 없으므로 다른 사람이 읽을 때까지 메시지가 큐에 남아 있습니다.

메시지 처리

큐에 배치된 메시지는 표준 SELECT 쿼리를 사용하여 선택할 수 있습니다. 문 SELECT은 큐를 수정하지 않고 메시지를 제거하지 않습니다. 큐에서 메시지를 읽고 끌어오려면 RECEIVE Transact-SQL 문을 사용합니다.

RECEIVE TOP (1)
    conversation_handle,
    message_type_name,
    TRY_CAST (message_body AS NVARCHAR (MAX)) AS message_body_text
FROM dbo.ExpenseQueue;
GO

큐에서 모든 메시지를 처리한 후에는 END CONVERSATION Transact-SQL 문을 사용하여 대화를 닫아야 합니다.

-- Drain any remaining target conversations for the from the queue
DECLARE @conversation_hdl AS UNIQUEIDENTIFIER;

WHILE EXISTS (SELECT 1 FROM dbo.ExpenseQueue)
    BEGIN
        RECEIVE TOP (1) @conversation_hdl = conversation_handle FROM dbo.ExpenseQueue;
        END CONVERSATION @conversation_hdl;
    END
GO

Service Broker 설명서

Service Broker에 대한 자세한 내용은 다음을 참조하세요.

Service Broker 개념 및 개발 및 관리 작업에 대해 이전에 게시된 설명서를 참조할 수도 있습니다.

Service Broker의 새로운 기능

Service Broker 및 Azure SQL Managed Instance

Azure SQL Managed Instance 인스턴스 간 서비스 브로커 메시지 교환과 SQL Server와 Azure SQL Manage Instance 간의 메시지 교환은 현재 공개 미리 보기로 제공됩니다.

전송 보안은 지원되지만 대화 상자 보안은 지원되지 않습니다.

  • CREATE REMOTE SERVICE BINDING는 지원되지 않습니다.

Service Broker는 기본적으로 사용하도록 설정되며 사용하지 않도록 설정할 수 없습니다. 다음 ALTER DATABASE 옵션은 지원되지 않습니다.

  • ENABLE_BROKER
  • DISABLE_BROKER

SQL Server 2019(15.x)에는 중요한 변경 사항이 도입되지 않았습니다. SQL Server 2012(11.x)에는 다음과 같은 변경 사항이 도입되었습니다.

메시지를 여러 대상 서비스(멀티캐스트)로 보낼 수 있습니다.

SEND 문의 구문은 여러 대화 핸들을 지원함으로써 멀티캐스트를 사용할 수 있도록 확장되었습니다.

메시지가 큐에 추가된 시간이 표시됨

큐에는 메시지가 큐에 있는 기간을 보여 주는 새 열 message_enqueue_time이 있습니다.

포이즌 메시지 처리를 사용하지 않도록 설정할 수 있습니다.

CREATE QUEUEALTER QUEUE 문은 이제 절 POISON_MESSAGE_HANDLING (STATUS = ON | OFF)을 추가하여 포이즌 메시지 처리를 사용하거나 사용하지 않도록 설정할 수 있습니다. 이제 카탈로그 뷰 sys.service_queues 에 포이즌 메시지를 사용할 수 있는지 여부를 나타내는 열 is_poison_message_handling_enabled 이 있습니다.

Service Broker의 가용성 그룹 지원

자세한 내용은 Always On 가용성 그룹이 있는 Service Broker(SQL Server)를 참조하세요.