Service Broker jako lekki ETL: kolejka faktur → tabela faktów

2025-10-04 · 1 min

Lead

Masz raporty, które nie mogą dławić OLTP? Service Broker jest jak listonosz w tej samej bazie: szybko, lokalnie, bez SSIS.

Schemat

  • INSERT do ERP.dbo.Invoice → wysyłka komunikatu do kolejki ReportingQueue.
  • Aktywacja procedury serwisowej → transformacja do Reporting.dbo.FactInvoice.

Minimalny przykład

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
-- Włącz SB
ALTER DATABASE ERP SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE;

-- Kontrakt i typ wiadomości
CREATE MESSAGE TYPE [//InvoiceCreated] VALIDATION = WELL_FORMED_XML;
CREATE CONTRACT [//ReportingContract] ([//InvoiceCreated] SENT BY INITIATOR);

-- Kolejki i usługi
CREATE QUEUE ReportingQueue;
CREATE SERVICE [//ReportingService] ON QUEUE ReportingQueue ([//ReportingContract]);

Procedura aktywacji (pseudokod):

1
2
3
4
5
6
7
8
9
CREATE OR ALTER PROC dbo.OnInvoiceMessage AS
BEGIN
  SET NOCOUNT ON;
  DECLARE @h UNIQUEIDENTIFIER, @msg XML;
  RECEIVE TOP(1) @h=conversation_handle, @msg=message_body FROM ReportingQueue;
  IF @h IS NULL RETURN;
  INSERT Reporting.dbo.FactInvoice(...) SELECT ... FROM OPENXML(@msg, 'Invoice', 2) WITH (...);
  END CONVERSATION @h;
END

Aktywacja:

1
ALTER QUEUE ReportingQueue WITH STATUS=ON, ACTIVATION (STATUS=ON, PROCEDURE_NAME=dbo.OnInvoiceMessage, MAX_QUEUE_READERS=5, EXECUTE AS OWNER);

Zalety

  • Brak blokad na długim raporcie.
  • Pełna kontrola i transakcyjność w SQL.
  • Można rozdzielić bazy (ERP vs Reporting).

Na co uważać

  • Rozmiar kolejki i monitoring „poślizgu”.
  • Błędy przetwarzania → DLQ (dead‑letter).
  • Idempotencja – insert „at‑least once”.

Tagi: SQL Server , Service Broker , ETL , Asynchroniczność , Reporting

Marcin Pytlik
LinkedIn · GitHub

Marcin Pytlik

LinkedIn · GitHub