ADR 0009: Trừu tượng hóa Bus, phân shard theo máy chủ
Trạng thái: Chấp nhận, một phần bị thay thế bởi ADR 0012 (bus là Redis Streams, không phải NATS JetStream ở GĐ 3; interface Bus và 64 shard vẫn giữ). Ngày: 2026-09-30.
Bối cảnh
Cần đơn giản ở GĐ 1 (một tiến trình) nhưng phải scale ngang và bền vững ở GĐ 3 mà không viết lại.
Quyết định
- Định nghĩa interface
Bus(Publish,Subscribe). GĐ 1 dùnginproc(channel có giới hạn), GĐ 3 dùng NATS JetStream. - Chia 64 shard logic với
shard = hash(server_id) mod 64. Mỗi shard có một chủ sở hữu (worker) tại một thời điểm, quản lý bằng lease trong Redis.
Lý do
- Toàn bộ mẫu của một máy chủ luôn đến cùng một worker, nên trạng thái đánh giá luật nằm trong bộ nhớ, không cần khóa phân tán.
- Đổi từ
inprocsang JetStream chỉ là đổi triển khai, không đổi logic. - JetStream: lưu file, nhân bản, consumer bền vững, đủ cho NFR-07 (đệm 2 giờ khi mất TSDB) và nhẹ hơn Kafka để vận hành.
- 64 shard cố định dễ phân bổ lại, đủ cho hàng chục worker.
Đánh đổi
- Thay đổi số shard sau này cần di chuyển trạng thái, do đó chọn số lớn từ đầu.
inprockhông bền vững, chấp nhận ở GĐ 1 vì agent còn giữ đệm và ingest trả 503 khi bus đầy.- Kafka và Redis Streams đã cân nhắc và không chọn (Kafka nặng vận hành, Redis Streams khó bảo đảm bền vững khi mất Redis).
Hệ quả
Xem 04-data-model (Bus) và 08-scaling-ha (sở hữu shard, lease).