0

Google BigQuery - Bài học 22: Remote Functions – Gọi trực tiếp API bên ngoài (Cloud Run / Cloud Functions) từ trong câu lệnh SQL

Chào anh em! Qua Bài học 21, chúng ta đã biết cách tự viết các hàm xử lý logic bằng SQL thuần hoặc nhúng mã nguồn JavaScript trực tiếp qua UDFs. Nhưng điều gì sẽ xảy ra khi logic nghiệp vụ của bạn không thể tự xử lý nội bộ trong BigQuery mà bắt buộc phải gọi đến các dịch vụ bên ngoài?

Ví dụ thực tế:

  • Bạn đang phân tích hàng triệu giao dịch thanh toán và muốn gọi một API AI chống gian lận (Fraud Detection Microservice) do bên thứ ba hoặc đội ngũ Security của công ty viết riêng trên Cloud Run để chấm điểm rủi ro theo thời gian thực.

  • Bạn cần gọi API chuyển đổi tiền tệ quốc tế cập nhật theo từng giây để tính lại giá trị đơn hàng đa quốc gia.

  • Bạn muốn tích hợp một mô hình ngôn ngữ lớn (LLM) hoặc dịch tự động văn bản ngay trong câu lệnh SQL.

Trước đây, để làm việc này, bạn phải trích xuất dữ liệu từ BigQuery ra ngoài, viết script Python gọi API vòng lặp từng dòng rồi nạp ngược lại cơ sở dữ liệu – cực kỳ cồng kềnh và mất thời gian.

Nhưng với tính năng Remote Functions trong GoogleSQL, BigQuery cho phép bạn gọi trực tiếp các API bên ngoài (được deploy trên Cloud Run hoặc Cloud Functions) hệt như một hàm SQL bình thường ngay trong câu lệnh SELECT!

Hãy cùng mổ xẻ kiến trúc và cách thiết lập siêu vũ khí này nhé!

1. Remote Function là gì và nó hoạt động thế nào dưới gầm máy?

Remote Function là một cầu nối an toàn cho phép động cơ tính toán Dremel của BigQuery gửi các mẻ dữ liệu (batches of rows) trực tiếp đến một HTTP Endpoint bên ngoài (thường là Cloud Run hoặc Cloud Functions) và nhận kết quả trả về ngay trong quá trình thực thi câu lệnh SQL.

Luồng xử lý dữ liệu diễn ra như thế nào?

Plaintext

[ Câu lệnh SELECT trong BigQuery ]
        |
        v (Dremel chia nhỏ dữ liệu thành các mẻ nhỏ - Batches)
[ BigQuery Connection (Xác thực IAM bảo mật) ]
        |
        v (Gửi HTTP POST request chứa JSON payload qua HTTPS)
[ Cloud Run / Cloud Functions (Microservice viết bằng Go / Node.js / Python) ]
        |
        v (Xử lý logic, gọi API bên thứ ba, trả về JSON response)
[ BigQuery nhận kết quả và gộp vào bảng kết quả trả về cho người dùng ]

  • Điểm ăn tiền: Bạn không cần phải lo về việc viết code phân tán hay xử lý mạng phức tạp. BigQuery tự động thực hiện việc gom nhóm hàng loạt (Batching), tự động retry khi gặp lỗi mạng tạm thời, và quản lý bảo mật thông qua Google Cloud IAM.

2. Hướng dẫn 3 bước thiết lập Remote Function thực chiến

Để kết nối BigQuery với một API bên ngoài, chúng ta cần thực hiện 3 bước cơ bản sau:

Bước 1: Xây dựng và Deploy API lên Cloud Run (Ví dụ bằng Node.js / Go)

API của bạn phải nhận đầu vào là một JSON payload chuẩn theo định dạng của BigQuery (gồm một mảng các calls) và trả về một mảng kết quả replies.

Ví dụ một đoạn code Cloud Run nhận giá trị số tiền và trả về điểm rủi ro gian lận:

JavaScript

// ĐVí dụ cấu trúc nhận request từ BigQuery Remote Function
app.post('/check-fraud-risk', (req, res) => {
    const body = req.body;
    // body.calls có dạng: [ [amount1, user_id1], [amount2, user_id2], ... ]
    
    const replies = body.calls.map(call => {
        const amount = call[0];
        const userId = call[1];
        
        // Logic kiểm tra rủi ro giả định
        let riskScore = amount > 50000000 ? "HIGH_RISK" : "SAFE";
        return riskScore;
    });

    // Trả về kết quả đúng chuẩn BigQuery mong đợi
    res.status(200).json({ replies: replies });
});

Bước 2: Tạo BigQuery Connection (Tạo cầu nối bảo mật)

Để BigQuery có quyền gọi vào Cloud Run của bạn (vốn được bảo mật không cho phép truy cập công khai), bạn cần tạo một kết nối Cloud Resource:

Bash

-- Tạo kết nối qua gcloud CLI
bq mk --connection \
  --connection_type=CLOUD_RESOURCE \
  --location=asia-southeast1 \
  my-external-api-conn

Sau khi tạo xong, bạn lấy địa chỉ Service Account sinh ra từ kết nối này và cấp quyền Cloud Run Invoker cho nó trên Cloud Run.

Bước 3: Đăng ký Remote Function trong BigQuery bằng SQL

Cuối cùng, bạn sử dụng câu lệnh CREATE EXTERNAL FUNCTION để khai báo Remote Function ngay trong Dataset của BigQuery:

SQL

CREATE OR REPLACE FUNCTION `my-project.utils.check_fraud_risk_remote`(amount NUMERIC, user_id INT64)
RETURNS STRING
REMOTE WITH CONNECTION `projects/my-project/locations/asia-southeast1/connections/my-external-api-conn`
OPTIONS (
    endpoint = 'https://my-fraud-api-run-xyz-as.a.run.app/check-fraud-risk',
    max_batching_rows = 1000 -- Gom tối đa 1,000 dòng vào mỗi lần gọi HTTP request để tối ưu mạng
);

3. Thực chiến: Gọi API trực tiếp trong câu lệnh SQL

Giờ đây, khi hàm check_fraud_risk_remote đã được tạo thành công trong Dataset, bạn có thể gọi nó trực tiếp trong bất kỳ câu lệnh báo cáo nào để làm giàu dữ liệu (Data Enrichment) cho hàng triệu dòng giao dịch:

SQL

SELECT 
    order_id,
    user_id,
    total_amount,
    -- Gọi trực tiếp Microservice trên Cloud Run thông qua Remote Function!
    `my-project.utils.check_fraud_risk_remote`(total_amount, user_id) AS fraud_status
FROM `my-project.core_dwh.fact_orders`
WHERE created_at >= TIMESTAMP('2026-10-18 00:00:00', 'Asia/Ho_Chi_Minh')
  AND status = 'PENDING';

  • Cảm giác mang lại: Bạn đang đứng ở tầng SQL của Data Warehouse nhưng có thể với tay gọi bất kỳ hệ thống Microservice, AI model, hay bên thứ ba nào trên Internet một cách mượt mà và an toàn tuyệt đối!

4. Cạm bẫy hiệu năng và Chi phí cần lưu ý khi dùng Remote Functions

Dù Remote Function cực kỳ quyền lực, nhưng với tư cách là một kiến trúc sư hệ thống, bạn phải ghi nhớ những nguyên tắc sống còn sau để không làm sập hệ thống API bên ngoài hoặc đốt tiền oan:

  1. Định luật "Nút thắt cổ chai API" (API Bottleneck): BigQuery có khả năng xử lý hàng triệu dòng dữ liệu trong vài giây bằng cách chia cho hàng ngàn Slots chạy song song. Nếu bạn dùng Remote Function quét toàn bộ bảng 100 triệu dòng mà không có điều kiện WHERE thu hẹp, BigQuery sẽ bắn hàng ngàn HTTP request đồng thời tấp nập vào Cloud Run của bạn. Nếu Cloud Run không đủ cấu hình Autoscaling hoặc API bên thứ ba bị giới hạn tốc độ (Rate Limit), hệ thống bên ngoài sẽ lập tức sập nguồn vì quá tải!

  2. Quy tắc tối ưu hóa:

    • Luôn dùng mệnh đề WHERE hoặc Partition Filter để lọc dữ liệu xuống mức tối thiểu trước khi truyền vào Remote Function.

    • Cấu hình thông số max_batching_rows hợp lý (thường từ 500 đến 1000) để giảm số lượng gói tin HTTP request truyền qua lại.

  3. Chi phí mạng và thời gian chờ (Timeout): Remote Function có giới hạn thời gian chờ tối đa cho mỗi request (thường là vài phút). Hãy đảm bảo API trên Cloud Run phản hồi nhanh chóng (dưới 5-10 giây cho mỗi batch). Đồng thời, lưu ý chi phí băng thông mạng khi gọi dữ liệu ra ngoài hạ tầng của Google Cloud.

Tổng kết Bài học 22

Remote Functions là cánh tay nối dài tuyệt vời của Google BigQuery ra thế giới bên ngoài:

  1. Kết nối Microservices: Cho phép gọi trực tiếp Cloud Run hoặc Cloud Functions ngay trong câu lệnh SELECT.

  2. Làm giàu dữ liệu thời gian thực: Tích hợp các thuật toán AI, chấm điểm rủi ro, hoặc gọi API bên thứ ba mà không cần dựng hệ thống ETL cồng kềnh.

  3. Quản lý thông minh qua Batching & IAM: Tự động gom nhóm mẻ dữ liệu và bảo mật chặt chẽ qua Google Cloud Connections.

Nhưng trong thế giới dữ liệu không gian địa lý (Geospatial Analytics) – chẳng hạn như bài toán tính khoảng cách tọa độ giao hàng của shipper, tìm điểm trong vùng (Polygon) cho các ứng dụng giao vận Logistics của Hasaki hay Metro Line 1 – BigQuery còn có một vũ khí hạng nặng khác.

Làm thế nào để xử lý dữ liệu bản đồ tọa độ không gian siêu tốc trong BigQuery? Hãy đón xem Bài học 23: BigQuery GIS (Geospatial Analytics) – Kiểu dữ liệu GEOGRAPHY và tối ưu hóa Logistics!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí