จัดการการเปลี่ยนแปลงด้วยรูปแบบที่ขับเคลื่อนด้วยเหตุการณ์

เสร็จสมบูรณ์เมื่อ

แอปพลิเคชันสมัยใหม่มักต้องตอบสนองต่อการเปลี่ยนแปลงฐานข้อมูลแบบเรียลไทม์ เมื่อลูกค้าสั่งซื้อ อัปเดตโปรไฟล์ หรือเมื่อระดับสินค้าคงคลังเปลี่ยนแปลง ระบบปลายน้ําจะต้องได้รับการแจ้งเตือน 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 สําหรับการตรวจสอบและการปฏิบัติตามข้อกําหนดในขณะที่ใช้ทริกเกอร์ฟังก์ชันสําหรับการแจ้งเตือนแบบเรียลไทม์ รูปแบบนี้ให้ทั้งบันทึกทางประวัติศาสตร์และการตอบสนองทันที