1. Vấn đề cần giải quyết
- Triển khai hạ tầng dự án cần có sự đồng nhất trải dài giữa các môi trường để đảm báo tính đồng nhất và thuận tiện cho việc
- Có hỗ trợ template phục vụ nhu cầu cấu hình các môi trường mới thuận tiện.
2. Kiến trúc tổng quan của hệ thống
2.1. Mô tả tổng quan về hệ thống hiện tại

Hệ thống được chia thành các nodepool (nodepool là một nhóm các node có cùng cấu hình chung về CPU, Memory, thiết bị mạng và được dựng trên một phiên bản OS snapshot cố định, ta có thể tạo nhiều máy trong nodepool bằng cách dùng chung một snapshot và liên tục tạo ra các máy chủ mới bằng cùng một snapshot đó). Hiện tại hệ thống được chia thành các nodepool sau:
- Nodepool business: phục vụ việc chạy các micro-service
- Nodepool transport and caching: phục vụ việc lưu trữ cache và vận chuyển message. chi tiết về message sẽ được nhắc đến ở phía dưới document này.
- Nodepool infrastructure: phục vụ các thành phần hạ tầng phục vụ dự án, chi tiết được mô tả phía dưới.
Hệ thống được chia thành hai kiểu thiết kế: CDC và non-CDC (CDC dịch là Change data capture)
Hệ thống CDC được thiết kế theo CQRS, bao gồm hai thành phần chính:
- Thành phần write most: là các database Postgres được cấu hình với plugin wal2json, decoderbufs hoặc pgoutput phục vụ cho việc đọc và chuyển đổi transaction được ghi xuống Postgres thành các logical replication data. Chi tiết các khái niệm có thể xem qua trong tài liệu bên dưới
20.5. Write Ahead Log
- Thành phần transform: khi có bất kì thay đổi nào được ghi xuống database, hệ thống CDC sẽ bắt lấy các sự thay đổi và đẩy vào kafka. Từ đây các transaction sẽ được đội dự án bắt lấy, chuyển đổi và lưu trữ vào một database khác ví dụ như Postgres, Mysql, Mongodb hoặc lưu lên Elasticsearch. Tại thời điểm hiện tại, CDC được đội dự án chọn là debezium.
Hệ thống non-CDC được thiết kế chỉ gồm các thành phần chính như database (Postgres hoặc MongoDB), một search engine chính (tại Alpaca là Elasticsearch cluster) và một thành phần caching chính (Redis non-persistent).
Hệ thống distributed locking: để quản lý locking giữa các thành phần micro-service và đảm bảo tính đồng đồng bộ, hệ thống được cấu hình dùng redis-persistent để làm distributed locking, về mô tả chi tiết có thể tham khảo qua tài liệu bên dưới
Distributed Locks with Redis