จัดการการเปลี่ยนแปลงด้วยรูปแบบที่ขับเคลื่อนด้วยเหตุการณ์
แอปพลิเคชันสมัยใหม่มักต้องตอบสนองต่อการเปลี่ยนแปลงฐานข้อมูลแบบเรียลไทม์ เมื่อลูกค้าสั่งซื้อ อัปเดตโปรไฟล์ หรือเมื่อระดับสินค้าคงคลังเปลี่ยนแปลง ระบบปลายน้ําจะต้องได้รับการแจ้งเตือน SQL Server และ Azure SQL มีกลไกหลายอย่างสําหรับการจับภาพและสตรีมการเปลี่ยนแปลงเหล่านี้ ซึ่งแต่ละกลไกมีลักษณะเฉพาะที่แตกต่างกันสําหรับเวลาแฝง ปริมาณงาน และความซับซ้อนในการใช้งาน
Data API Builder รวมเข้ากับกลไกการเปลี่ยนแปลงเหล่านี้ผ่านการผูกทริกเกอร์ ฟังก์ชัน Azure SQL การทําความเข้าใจว่าเมื่อใดควรใช้แต่ละวิธีจะช่วยให้คุณสร้างสถาปัตยกรรมที่ตอบสนองและขับเคลื่อนด้วยเหตุการณ์ที่ตอบสนองต่อการเปลี่ยนแปลงของข้อมูลได้อย่างมีประสิทธิภาพ
ทําความเข้าใจกลไกการจับการเปลี่ยนแปลง
แพลตฟอร์ม SQL มีหลายวิธีในการติดตามการเปลี่ยนแปลงข้อมูล ซึ่งแต่ละวิธีเหมาะกับสถานการณ์ที่แตกต่างกัน:
เปลี่ยนระเบียนการบันทึกข้อมูล (CDC) แทรก ปรับปรุง และลบการดําเนินการไปยังตารางการเปลี่ยนแปลงพิเศษ บันทึกสถานะก่อนและหลังที่สมบูรณ์ของแถวที่เปลี่ยนแปลง ทําให้เหมาะสําหรับข้อกําหนดในการตรวจสอบและการซิงโครไนซ์ข้อมูล
การติดตามการเปลี่ยนแปลง เป็นทางเลือกที่มีน้ําหนักเบากว่าซึ่งบันทึกแถวที่เปลี่ยนแปลงโดยไม่บันทึกค่าจริง แอปพลิเคชันสอบถามข้อมูลการเปลี่ยนแปลงเพื่อกําหนดว่าข้อมูลใดที่ต้องทําข้อมูลให้ตรงกัน
Change Event Streaming (CES) เป็นฟีเจอร์ใหม่ที่ผลักดันการเปลี่ยนแปลงไปยังสตรีมเหตุการณ์โดยไม่ต้องสํารวจความคิดเห็น ผสานรวมโดยตรงกับ Azure Event Hubs สําหรับสถานการณ์ที่มีปริมาณงานสูง
| คุณสมบัติ | ซีดีซี | การติดตามการเปลี่ยนแปลง | ซีอีเอส |
|---|---|---|---|
| บันทึกค่าที่เปลี่ยนแปลง | ใช่ | ไม่ | ใช่ |
| ต้องมีการสํารวจความคิดเห็น | ใช่ | ใช่ | ไม่ |
| ข้อมูลในอดีต | ใช่ | จำกัด | สตรีมเท่านั้น |
| ตั้งค่าความซับซ้อน | ปานกลาง | ต่ำ | ปานกลาง |
เปิดใช้งานการบันทึกข้อมูลการเปลี่ยนแปลงสําหรับสถานการณ์การตรวจสอบ
CDC มีความเหมาะสมเมื่อคุณต้องการประวัติการเปลี่ยนแปลงที่สมบูรณ์สําหรับการปฏิบัติตามข้อกําหนดหรือการดีบัก เปิดใช้งานในตารางเฉพาะ:
-- Enable CDC at the database level
EXEC sys.sp_cdc_enable_db;
-- Enable CDC on a specific table
EXEC sys.sp_cdc_enable_table
@source_schema = 'dbo',
@source_name = 'Orders',
@role_name = NULL,
@capture_instance = 'dbo_Orders',
@supports_net_changes = 1;
เมื่อเปิดใช้งานแล้ว SQL Server จะสร้างตารางการเปลี่ยนแปลงที่เก็บระเบียนในอดีต สืบค้นตารางเหล่านี้เพื่อดึงข้อมูลการเปลี่ยนแปลงภายในช่วงเวลา:
DECLARE @from_lsn binary(10), @to_lsn binary(10);
SET @from_lsn = sys.fn_cdc_get_min_lsn('dbo_Orders');
SET @to_lsn = sys.fn_cdc_get_max_lsn();
SELECT *
FROM cdc.fn_cdc_get_all_changes_dbo_Orders(@from_lsn, @to_lsn, 'all');
คิวรีนี้ส่งกลับการเปลี่ยนแปลงทั้งหมดระหว่างหมายเลขลําดับบันทึกต่ําสุดและสูงสุด รวมถึงชนิดการดําเนินการ (__$operation) ที่ระบุการแทรก อัปเดต หรือลบ
Note
CDC ต้องการให้ SQL Server Agent ทํางานอยู่ งานการจับภาพและการล้างข้อมูลจะทํางานตามกําหนดการที่คุณสามารถกําหนดค่าได้ ตรวจสอบประสิทธิภาพของงานในสภาพแวดล้อมที่มีธุรกรรมสูง
กําหนดค่าการผูกทริกเกอร์ ฟังก์ชัน Azure SQL
ฟังก์ชัน Azure การผูกทริกเกอร์ SQL ให้การผสานรวมโดยตรงที่สุดสําหรับการตอบสนองต่อการเปลี่ยนแปลงฐานข้อมูล ทริกเกอร์จะตรวจสอบตารางโดยใช้การติดตามการเปลี่ยนแปลงและเรียกใช้ฟังก์ชันของคุณเมื่อแถวเปลี่ยนไป
ขั้นแรก ให้เปิดใช้งานการติดตามการเปลี่ยนแปลงในฐานข้อมูลและตารางของคุณ:
-- Enable Change Tracking at database level
ALTER DATABASE [YourDatabase]
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON);
-- Enable Change Tracking on the table
ALTER TABLE dbo.Orders
ENABLE CHANGE_TRACKING;
สร้างฟังก์ชัน Azure ด้วยทริกเกอร์ SQL:
[FunctionName("OrderChangedTrigger")]
public static void Run(
[SqlTrigger("[dbo].[Orders]", "SqlConnectionString")]
IReadOnlyList<SqlChange<Order>> changes,
ILogger log)
{
foreach (var change in changes)
{
log.LogInformation($"Change operation: {change.Operation}");
log.LogInformation($"Order ID: {change.Item.OrderId}");
if (change.Operation == SqlChangeOperation.Update)
{
// Process order update
ProcessOrderUpdate(change.Item);
}
}
}
public class Order
{
public int OrderId { get; set; }
public int CustomerId { get; set; }
public DateTime OrderDate { get; set; }
public string Status { get; set; }
}
ชนิดจะ SqlChange<T> ตัดแต่ละแถวที่เปลี่ยนแปลงด้วยชนิดการทํางาน ฟังก์ชันของคุณได้รับการเปลี่ยนแปลงเป็นชุด ซึ่งจะช่วยเพิ่มประสิทธิภาพเมื่อหลายแถวเปลี่ยนแปลงพร้อมกัน
กําหนดค่า สายอักขระการเชื่อมต่อ ในการตั้งค่าแอปฟังก์ชันของคุณ:
{
"Values": {
"SqlConnectionString": "@Microsoft.KeyVault(SecretUri=https://myvault.vault.azure.net/secrets/sql-connection)"
}
}
สำคัญ
การผูกทริกเกอร์ SQL ต้องใช้การติดตามการเปลี่ยนแปลง ไม่ใช่ CDC หากคุณต้องการความสามารถในอดีตของ CDC ควบคู่ไปกับทริกเกอร์แบบเรียลไทม์ ให้เปิดใช้งานคุณสมบัติทั้งสองบนตารางของคุณ
สตรีมการเปลี่ยนแปลงด้วยการสตรีมเหตุการณ์การเปลี่ยนแปลง
สําหรับสถานการณ์ที่มีปริมาณงานสูงซึ่งเวลาแฝงในการสํารวจความคิดเห็นเป็นที่ยอมรับไม่ได้ Change Event Streaming จะผลักดันการเปลี่ยนแปลงไปยัง Azure Event Hubs โดยตรง วิธีการนี้ช่วยลดความล่าช้าในการสํารวจความคิดเห็นและปรับขนาดเป็นล้านเหตุการณ์ต่อวินาที
กําหนดค่า CES บนฐานข้อมูลของคุณ:
-- Create an event streaming group
CREATE EVENT STREAMING GROUP MyOrderStream
WITH (
TARGET_TYPE = 'eventhub',
TARGET_NAME = 'orders-eventhub',
TARGET_CONNECTION = '<event-hub-connection-string>'
);
-- Add tables to the streaming group
ALTER EVENT STREAMING GROUP MyOrderStream
ADD TABLE dbo.Orders;
การเปลี่ยนแปลงโฟลว์ไปยังฮับเหตุการณ์ทันทีเมื่อธุรกรรมตกลง ผู้บริโภคดาวน์สตรีมประมวลผลเหตุการณ์โดยใช้ทริกเกอร์ ฟังก์ชัน Azure Event Hubs, Stream Analytics หรือแอปพลิเคชันแบบกําหนดเอง
ข้อความฮับเหตุการณ์ประกอบด้วย:
- ประเภทการทํางาน (แทรก อัปเดต ลบ)
- ประทับเวลา
- ข้อมูลแบบเต็มแถวสําหรับการแทรกและการอัปเดต
- ค่าคีย์สําหรับการลบ
เลือกรูปแบบการเปลี่ยนแปลงที่เหมาะสม
การเลือกกลไกการเปลี่ยนแปลงที่เหมาะสมขึ้นอยู่กับความต้องการของคุณ:
ใช้ CDC เมื่อ:
- คุณต้องมีค่าก่อนและหลังที่สมบูรณ์
- การปฏิบัติตามข้อกําหนดต้องมีเรกคอร์ดการเปลี่ยนแปลงในอดีต
- การซิงโครไนซ์แบทช์เป็นที่ยอมรับ
ใช้ การติดตามการเปลี่ยนแปลง กับฟังก์ชันเมื่อ:
- คุณต้องการการตอบสนองแบบเรียลไทม์ต่อการเปลี่ยนแปลง
- คุณต้องการเพียงค่าปัจจุบัน ไม่ใช่ประวัติ
- คุณกําลังสร้างไมโครเซอร์วิสที่ขับเคลื่อนด้วยเหตุการณ์
ใช้ การสตรีมเหตุการณ์การเปลี่ยนแปลง ในกรณีต่อไปนี้
- คุณต้องการเวลาแฝงต่ํากว่าวินาที
- ปริมาณธุรกรรมสูงต้องการการสตรีม
- คุณกําลังสร้างไปป์ไลน์การวิเคราะห์แบบเรียลไทม์
พิจารณาการรวมแนวทาง ใช้ CDC สําหรับการตรวจสอบและการปฏิบัติตามข้อกําหนดในขณะที่ใช้ทริกเกอร์ฟังก์ชันสําหรับการแจ้งเตือนแบบเรียลไทม์ รูปแบบนี้ให้ทั้งบันทึกทางประวัติศาสตร์และการตอบสนองทันที