Bagikan melalui


Pialang Layanan

Berlaku untuk: SQL ServerAzure SQL Managed Instance

SQL Server Service Broker menyediakan dukungan bawaan untuk pengiriman pesan dan antrean di SQL Server Database Engine dan Azure SQL Managed Instance. Pengembang dapat dengan mudah membuat aplikasi canggih yang menggunakan komponen Mesin Database untuk berkomunikasi antara database yang berbeda, dan membangun aplikasi terdistribusi dan andal.

Kapan menggunakan Service Broker

Gunakan komponen Service Broker untuk menerapkan fungsionalitas pemrosesan pesan asinkron dalam database asli. Pengembang aplikasi yang menggunakan Service Broker dapat mendistribusikan beban kerja data di beberapa database tanpa memprogram komunikasi dan olahpesan internal yang kompleks. Service Broker mengurangi pekerjaan pengembangan dan pengujian karena Service Broker menangani jalur komunikasi dalam konteks percakapan. Ini juga meningkatkan performa. Misalnya, basis data depan yang mendukung situs web dapat merekam informasi dan mengirim tugas yang membutuhkan banyak pemrosesan ke antrean dalam basis data belakang. Service Broker memastikan bahwa semua tugas dikelola dalam konteks transaksi untuk memastikan keandalan dan konsistensi teknis.

Gambaran Umum

Service Broker adalah kerangka kerja pengiriman pesan yang memungkinkan Anda membuat aplikasi berorientasi layanan dalam database asli. Tidak seperti fungsionalitas pemrosesan kueri klasik yang terus membaca data dari tabel dan memprosesnya selama siklus hidup kueri, aplikasi berorientasi layanan memiliki layanan database yang bertukar pesan. Setiap layanan memiliki antrean tempat pesan ditempatkan hingga diproses.

Diagram alur proses Service Broker.

Pesan dalam antrean dapat diambil menggunakan perintah Transact-SQL RECEIVE , atau dengan prosedur aktivasi yang dipanggil setiap kali pesan tiba dalam antrean.

Membuat layanan

Nota

Layanan target harus mengekspos satu atau beberapa kontrak. Jika Anda membuat layanan tanpa kontrak, layanan tidak akan dapat menerima pesan. Pesan yang dikirim akan tampak berhasil, tetapi pesan akan tetap berada di sys.transmission_queue inisiator

/*
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]);

Mengirim pesan

Pesan dikirim pada percakapan antara layanan menggunakan pernyataan SEND Transact-SQL. Percakapan adalah saluran komunikasi yang dibuat antara layanan menggunakan BEGIN DIALOG pernyataan 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"/>');

Pesan dikirim ke ExpensesService dan ditempatkan di dbo.ExpenseQueue. Karena tidak ada prosedur aktivasi yang terkait dengan antrean ini, pesan tetap dalam antrean sampai seseorang membacanya.

Memproses pesan

Pesan yang ditempatkan dalam antrean dapat dipilih dengan menggunakan kueri standar SELECT . Pernyataan SELECT tidak mengubah antrean dan menghapus pesan. Untuk membaca dan menarik pesan dari antrean, Anda dapat menggunakan pernyataan 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

Setelah memproses semua pesan dari antrean, Anda harus menutup percakapan menggunakan pernyataan 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

Dokumentasi Service Broker

Untuk informasi selengkapnya tentang Service Broker, lihat:

Anda juga dapat merujuk ke dokumentasi yang diterbitkan sebelumnya untuk konsep Service Broker dan untuk tugas pengembangan dan manajemen.

Apa yang baru di Service Broker

Service Broker dan Azure SQL Managed Instance

Pertukaran pesan Service Broker lintas instans antara instans Azure SQL Managed Instance dan pertukaran pesan antara SQL Server dan Azure SQL Manage Instance saat ini dalam pratinjau publik:

Keamanan transportasi didukung, sementara keamanan dialog tidak:

  • CREATE REMOTE SERVICE BINDING tidak didukung.

Service Broker diaktifkan secara default dan tidak dapat dinonaktifkan. Opsi berikut ALTER DATABASE ini tidak didukung:

  • ENABLE_BROKER
  • DISABLE_BROKER

Tidak ada perubahan signifikan yang diperkenalkan di SQL Server 2019 (15.x). Perubahan berikut diperkenalkan di SQL Server 2012 (11.x).

Pesan dapat dikirim ke beberapa layanan target (multicast)

Sintaksis pernyataan SEND diperluas untuk mengaktifkan multicast dengan mendukung beberapa handel percakapan.

Antrean mengekspos waktu antrean pesan

Antrean memiliki kolom baru, message_enqueue_time, yang menunjukkan berapa lama pesan berada dalam antrean.

Penanganan pesan racun dapat dinonaktifkan

Pernyataan CREATE QUEUE dan ALTER QUEUE sekarang memiliki kemampuan untuk mengaktifkan atau menonaktifkan penanganan pesan racun dengan menambahkan klausa, POISON_MESSAGE_HANDLING (STATUS = ON | OFF). Tampilan sys.service_queues katalog sekarang memiliki kolom is_poison_message_handling_enabled untuk menunjukkan apakah pesan racun diaktifkan atau dinonaktifkan.

Dukungan grup ketersediaan di Service Broker

Untuk informasi selengkapnya, lihat Service Broker dengan Grup Ketersediaan AlwaysOn (SQL Server).