CYBERSOFT
Đăng nhập

Thực chiến: rating/mediation, tính cước CDR, top-up & trừ cước, roaming trong viễn thông

Thực chiến doanh nghiệpViễn thôngAPIData-drivenThực tế
🗓 1 tháng trước22 phút đọc·👁 1,148 lượt xem👤 484 người đọc

Bài sâu 14 chương: bối cảnh thu thập CDR & rating/mediation viễn thông, kiến trúc 5 khối (mediation/rating/billing/invoice), idempotency CDR & bảo toàn số dư làm oracle, test plan, decision table cước, code automation happy path & ca lỗi chuyên sâu (CDR trùng, race condition, roaming tính sai bảng giá), batch đối soát cước cuối kỳ, CI/CD, AI Agent, phỏng vấn.

1. Bối cảnh doanh nghiệp & phạm vi

Một nhà mạng di động ảo (MVNO) tại Việt Nam phục vụ 4,2 triệu thuê bao trả trước và trả sau, phát sinh trung bình 38 triệu bản ghi chi tiết cuộc gọi (CDR — call detail record) mỗi ngày từ hệ thống chuyển mạch (switch) và cổng dữ liệu (data gateway), chưa kể các CDR roaming quốc tế gửi về theo lô từ đối tác qua giao thức TAP3/NRTRDE với độ trễ vài giờ đến vài ngày. Toàn bộ dòng CDR này phải đi qua một chuỗi xử lý gồm mediation (chuẩn hoá định dạng, loại bỏ bản ghi hỏng, phát hiện trùng lặp), rating (tính cước theo gói cước và bảng giá đang áp dụng tại thời điểm phát sinh cuộc gọi), và billing (trừ vào số dư tài khoản trả trước hoặc cộng dồn vào hoá đơn trả sau). Sai sót ở bất kỳ khâu nào — tính cước sai, tính trùng một CDR, hoặc trừ tiền không khớp với cước đã tính — đều trực tiếp ảnh hưởng đến doanh thu ghi nhận (revenue leakage nếu tính thiếu, hoặc khiếu nại khách hàng ồ ạt nếu tính thừa) và có thể vi phạm quy định của Bộ Thông tin và Truyền thông về minh bạch cước viễn thông.

Kiến trúc rating/mediation viễn thông · Telecom rating/mediation architecture Switch/HLR(CDR gốc) Mediation(chuẩn hoá, lọc trùng) Rating Engine(bảng giá/gói) Billing/Balance(trừ cước) Invoice CDR Store(unique cdrId) Rating Table(gói/roaming) Top-up Service(nạp tiền) Bất biến: mỗi cdrId chỉ tính cước đúng 1 lần; số dư = Σtop-up − Σcước
Kiến trúc rating/mediation/billing end-to-end

Phạm vi tự động hoá

  • API mediation nhận/chuẩn hoá CDR, phát hiện & loại CDR trùng theo cdrId
  • Rating engine: tính cước theo gói cước, bảng giá roaming, quy tắc làm tròn block
  • Billing/Balance: top-up, trừ cước, giới hạn khi số dư không đủ, đối soát cuối kỳ
  • Ngoài phạm vi: thuật toán định tuyến cuộc gọi trong mạng lõi (core network), UI CSKH
Oracle của bài này KHÔNG phải 'API trả về 200 OK' mà là hai bất biến định lượng: (1) cước tính được phải bằng đúng tổng theo bảng rating áp dụng cho từng CDR, và (2) số dư sau mọi thao tác phải bằng đúng Σtop-up − Σcước đã trừ, không lệch một đồng.

2. Kiến trúc hệ thống & luồng nghiệp vụ

Kiến trúc gồm 5 khối chính nối tiếp nhau: Switch/HLR phát sinh CDR gốc ở định dạng ASN.1/nhị phân, Mediation Layer chuyển đổi sang định dạng chuẩn nội bộ (JSON/Avro), loại bỏ bản ghi lỗi cú pháp và gắn cờ nghi ngờ trùng lặp dựa trên cdrId (do switch cấp) kết hợp hash của (msisdn, startTime, duration, callType), Rating Engine tra bảng giá đang hiệu lực tại thời điểm startTime của CDR (không phải thời điểm xử lý) để tính cước, Billing/Balance Service áp dụng cước vào tài khoản — trừ trực tiếp với thuê bao trả trước hoặc cộng dồn vào bảng invoice_line cho thuê bao trả sau, và cuối cùng Invoice Service tổng hợp theo kỳ cước để xuất hoá đơn. CDR Store đóng vai trò then chốt: đây là nơi duy nhất lưu trạng thái 'đã rate' hay 'chưa rate' của từng cdrId, và mọi thao tác ghi vào đây phải là idempotent — nếu mediation gửi lại cùng một CDR (do retry mạng, do switch gửi trùng), rating engine phải nhận diện và bỏ qua thay vì tính cước lần thứ hai.

  • Điểm khó test #1: rating phải dùng bảng giá tại startTime của CDR, không phải thời điểm xử lý batch (dữ liệu roaming có thể trễ vài ngày)
  • Điểm khó test #2: idempotency theo cdrId phải đúng ngay cả khi mediation gửi lại do lỗi mạng hoặc do đối tác roaming gửi trùng file TAP3
  • Điểm khó test #3: trừ cước và tính cước là 2 bước riêng biệt (rate rồi mới charge) — cần test lệch pha giữa 2 bước khi hệ thống crash giữa chừng
Decision table tính cước (rating) · Rating decision table Loại CDR Điều kiện gói/roaming Công thức cước Kỳ vọng (Oracle) Thoại nội mạng Trong định mức gói 0đ (miễn phí) Trừ phút định mức, cước=0 Thoại nội mạng Vượt định mức phút dư × đơn giá Cước > 0, đúng đơn giá bảng rating Data 4G/5G Trong nước MB × đơn giá/gói Làm tròn theo block 1KB/1MB đúng quy tắc Thoại/Data roaming Ngoài nước, có đối tác đơn giá roaming đối tác Áp bảng giá quốc gia đối tác, có phí hoà mạng CDR trùng (duplicate) cdrId đã tồn tại n/a Từ chối tính cước lần 2, không trừ tiền thêm Số dư không đủ balance < cước tính được chặn/giới hạn cuộc gọi Cắt cuộc gọi khi chạm 0đ, không âm quá ngưỡng Top-up hợp lệ mã thẻ chưa dùng, đúng mệnh giá balance += mệnh giá Số dư tăng đúng, mã thẻ khoá lại (1 lần dùng) Top-up trùng request retry cùng idempotency key n/a Chỉ cộng tiền đúng 1 lần dù client gọi lại nhiều lần
Decision table quyết định cách tính cước theo loại CDR
⚠️ Không bao giờ tính cước dựa trên bảng giá 'hiện hành lúc chạy job' — nếu job rating chạy trễ (do backlog roaming), một CDR phát sinh trước ngày đổi giá phải vẫn dùng giá cũ, nếu không đối soát cuối kỳ sẽ lệch hàng loạt.

3. Mô hình dữ liệu & bất biến nghiệp vụ (oracle)

Mô hình dữ liệu cốt lõi xoay quanh 5 bảng: `Subscriber` (msisdn, planId, balance, status), `RatingPlan` (planId, freeMinutes, freeData, unitPriceVoice, unitPriceData, roamingPartnerId, effectiveFrom, effectiveTo), `Cdr` (cdrId UNIQUE, msisdn, callType, startTime, duration, dataVolume, roamingCountry, ratedStatus, ratedAmount), `Transaction` (txId, msisdn, type[TOPUP|CHARGE], amount, idempotencyKey UNIQUE, balanceAfter, createdAt), và `Invoice` (invoiceId, msisdn, period, totalAmount, lineItems). Ràng buộc UNIQUE trên `Cdr.cdrId` là tuyến phòng thủ đầu tiên chống tính trùng ở tầng database, nhưng riêng nó chưa đủ vì rating engine có thể đọc CDR, tính cước, rồi crash trước khi cập nhật `ratedStatus` — lúc đó CDR vẫn còn ở trạng thái 'chưa rate' và job retry sẽ tính lại, tạo ra 2 dòng Transaction cho cùng 1 cuộc gọi nếu không có idempotencyKey trên Transaction.

🔒

Nội dung bị khoá

Bạn đang xem bản xem trước. Đăng nhập để mở khoá toàn bộ bài viết và tất cả tài liệu Tester/QA.

Đã xem 24% nội dung
  • Đọc trọn vẹn mọi bài viết
  • Lưu bài & ghi chú cá nhân
  • Theo dõi tiến độ đã đọc
  • Luyện phỏng vấn, ISTQB, Mock
Đăng nhập để đọc tiếp

Chưa có mã? Lấy mã qua Fanpage / Zalo CyberSoft.

0

💬 Bình luận (0)

Bạn có thể đọc mọi bình luận. Đăng nhập để bình luận

Chưa có bình luận nào. Hãy là người đầu tiên!