Phạm Văn Thư
Tự động hóa và tích hợp · AI-assisted content

NATS Server làm trục sự kiện nội bộ cho fintech cho vay tiêu dùng

Đăng ngày 12/10/2026

Mục lục bài nghiên cứu
Hình đại diện NATS — tự động hóa quy trình mã nguồn mở

NATS Server có nên là đường ống sự kiện nội bộ của một công ty cho vay tiêu dùng?

NATS Server là máy chủ của hệ thống truyền thông NATS. README mô tả đây là hệ thống truyền thông đơn giản, an toàn và hiệu năng cao cho các hệ thống số, dịch vụ và thiết bị; dự án thuộc CNCF, có hơn 40 thư viện client theo ngôn ngữ, và máy chủ có thể chạy tại chỗ, trên đám mây, ở biên, thậm chí trên Raspberry Pi [1].

Bài này đặt một câu hỏi hẹp: một công ty fintech cho vay tiêu dùng, chỉ xét hệ thống nội bộ, có nên dùng NATS làm trục sự kiện giữa các dịch vụ xử lý hồ sơ vay hay không. Câu trả lời thận trọng của người viết là nên cân nhắc cho các luồng thông báo và điều phối giữa dịch vụ, nhưng không dùng nó thay cơ sở dữ liệu giao dịch hay sổ cái.

Một cảnh báo về nguồn: kho này có rất ít tài liệu mô tả chi tiết cơ chế lõi. README chủ yếu dẫn sang tài liệu ở nơi khác [1], và tài liệu chi tiết nhất trong nguồn đã đọc lại viết về lớp MQTT [6]. Vì vậy nhiều đánh giá dưới đây được nêu như điều cần kiểm chứng, không phải kết luận.

Khi một hồ sơ vay đi qua sáu dịch vụ và mỗi dịch vụ gọi trực tiếp dịch vụ kế tiếp

Một khoản vay tiêu dùng đi qua nhiều bước nội bộ: tiếp nhận hồ sơ, kiểm tra giấy tờ, chấm điểm, phê duyệt, giải ngân, rồi theo dõi thu hồi. Nếu mỗi bước gọi trực tiếp bước sau bằng yêu cầu đồng bộ, một dịch vụ chậm hoặc đang bảo trì sẽ kéo cả chuỗi chậm theo, và việc thêm một bước mới như kiểm tra gian lận buộc phải sửa dịch vụ đứng trước nó.

Mô hình thông điệp giải quyết bằng cách để dịch vụ phát một sự kiện, còn ai cần thì đăng ký nhận. Điều cần xác định là NATS giải quyết phần nào của nó, và với mức bảo đảm giao nhận nào.

Nguồn đã đọc cho thấy một phần câu trả lời qua phần cài đặt MQTT: máy chủ dùng JetStream để lưu trạng thái phiên, lưu thông điệp QoS 1 và 2, và gửi lại khi cần [6]. Nghĩa là NATS Server có lớp lưu trữ bền vững gọi là JetStream, dù tài liệu đã đọc không giải thích nó đầy đủ. Mô tả đầy đủ cần đọc ở tài liệu chính thức trên docs.nats.io, mà README dẫn tới [1].

Vai trò của máy chủ, tài khoản, cụm và JetStream, theo đúng những gì nguồn cho phép nói

README chỉ cho biết máy chủ chạy trong nhiều môi trường và client kết nối bằng thư viện theo ngôn ngữ [1]. Chi tiết hơn đến từ tài liệu MQTT, vốn mô tả cách tầng MQTT được xây trên cùng lõi: trong máy chủ có kiểu client nội bộ chạy vòng đọc và vòng ghi riêng, và một cờ mqtt làm client đó hành xử theo chuẩn MQTT [6].

Tài liệu MQTT cũng cho thấy ba khái niệm phạm vi: tài khoản (account), cụm (cluster) và máy chủ. Trình quản lý phiên theo tài khoản được khởi tạo lười khi gói CONNECT đầu tiên tới; số bản sao của stream được quyết định theo kích thước cụm và bị giới hạn ở 3, có thể ghi đè bằng tùy chọn stream_replicas trong khối cấu hình MQTT [6]. Từ đó suy ra tài khoản là đơn vị gom trạng thái, và JetStream có khái niệm bản sao theo cụm.

JetStream được dùng với nhiều chính sách khác nhau trong cùng một tính năng. Có stream theo chính sách giới hạn (limits) có MaxMsgsPer bằng 1 để chỉ giữ bản mới nhất theo subject, có stream theo chính sách quan tâm (interest), và có consumer bền (durable) [6]. Các chi tiết này được tài liệu ghi cho cài đặt MQTT, không nên tự động coi là mô tả đầy đủ của JetStream nói chung.

Theo một sự kiện đi hết vòng: phát, lưu, nhận, xác nhận

Tài liệu MQTT cung cấp một đường đi chi tiết hiếm hoi, đủ để minh họa nguyên tắc chung nhưng không thay cho đặc tả luồng của NATS lõi. Khi một thông điệp QoS 1 hoặc 2 đến, máy chủ lưu nó vào stream tương ứng và chuyển giao trách nhiệm cho máy chủ; tài liệu nói người gửi trao quyền sở hữu thông điệp cho máy chủ, rồi máy chủ giao cho người nhận với mức QoS cao nhất có thể, và không có xác nhận giao thức trực tiếp giữa người nhận và người gửi ban đầu [6].

Ở phía người nhận, mỗi đăng ký QoS 1 hoặc 2 có một consumer bền riêng, kèm một đăng ký NATS nội bộ để chuyển thông điệp tới client [6]. Thông điệp chưa được xác nhận sẽ được JetStream gửi lại. Tài liệu ghi đây là cơ chế gửi lại chủ động và liệt kê rằng việc gửi lại có thể xảy ra không theo thứ tự ban đầu [6].

Hệ quả cho một hệ thống tín dụng: nếu logic xử lý nhạy cảm với thứ tự, như áp dụng thay đổi trạng thái hồ sơ, thì người nhận phải chịu được việc nhận lặp và nhận lệch thứ tự, thường bằng khóa idempotency và số phiên bản trong thông điệp.

Những gì được xác nhận: phạm vi triển khai, MQTT, phát hành, kiểm toán

Từ README: NATS là dự án CNCF; có hơn 40 client theo ngôn ngữ; máy chủ chạy được tại chỗ, đám mây, biên và thiết bị nhỏ; có thông tin kiểm toán bảo mật bởi Trail of Bits do OSTIF thuê, báo cáo tháng 4 năm 2025 [1].

Từ tài liệu MQTT: máy chủ hiện hỗ trợ phần lớn MQTT 3.1.1, dựa nhiều vào JetStream để lưu phiên, thông điệp giữ lại và thông điệp QoS [6]. Năm stream được liệt kê, như $MQTT_sess, $MQTT_msgs, $MQTT_rmsgs, $MQTT_qos2in và $MQTT_out [6]. Đây là tính năng đã có, nhưng mục "Known issues" của chính tài liệu ghi những giới hạn như gửi lại không đúng thứ tự gốc và chưa hoàn tất việc giao các thông điệp đang bay sau khi hủy đăng ký hoặc kết nối lại [6].

Về lộ trình, README chỉ dẫn tới trang lộ trình trên nats.io mà không nêu nội dung [1], nên bài không nêu tính năng tương lai nào. Về mô hình phát hành, từ NATS 2.11 máy chủ theo chu kỳ sáu tháng, đánh phiên bản theo semantic versioning, và hỗ trợ sửa lỗi cùng vá bảo mật cho bản minor hiện tại và bản trước đó [4]. Phần lõi pub/sub, subject và cluster chưa được xác minh từ tài liệu trong kho này.

Dành cho đội kỹ thuật nào, và vì sao fintech nội bộ lại là một lựa chọn có điều kiện

README đặt NATS như hệ thống cho các hệ thống phân tán hiện đại, ở nhiều môi trường từ đám mây tới thiết bị nhỏ [1]. Điều đó hợp với đội nền tảng muốn một lớp truyền thông thống nhất cho nhiều dịch vụ và ngôn ngữ lập trình, nhờ số lượng client được nêu [1].

Với fintech cho vay tiêu dùng nội bộ, nhóm hưởng lợi nhiều nhất là đội xây dịch vụ xử lý hồ sơ theo hướng sự kiện và cần tách các bước ra để thêm bớt độc lập. Đội cần tích hợp với thiết bị đầu cuối hoặc ứng dụng di động của khách hàng ở ngoài phạm vi bài này, vì bài giới hạn ở hệ thống nội bộ theo yêu cầu.

Ít phù hợp hơn: đội chưa có kinh nghiệm vận hành hệ thống phân tán và không có người nhận trách nhiệm trực sự cố; đội cần bảo đảm giao đúng một lần với kiểm toán chặt mà chưa có thiết kế idempotency; và đội chỉ có hai ba dịch vụ, nơi một hàng đợi đơn giản trong cơ sở dữ liệu sẵn có đã đủ.

Tình huống giả định: trục sự kiện nội bộ cho vòng đời một khoản vay tiêu dùng

Đây là đề xuất, không phải trường hợp đã triển khai. Giả định một công ty fintech cho vay tiêu dùng tại Hà Nội, có các dịch vụ nội bộ riêng cho tiếp nhận hồ sơ, xác minh giấy tờ, chấm điểm tín dụng, phê duyệt, giải ngân và nhắc nợ. Giả định thêm rằng không có dịch vụ nào của NATS được mở ra Internet hay cho ứng dụng khách hàng; mọi kết nối đều từ mạng nội bộ của công ty.

Đề xuất: mỗi bước phát một sự kiện nhỏ mang mã hồ sơ, loại sự kiện và phiên bản, thay vì mang nguyên dữ liệu cá nhân. Dịch vụ nhận lấy dữ liệu chi tiết từ kho của dịch vụ sở hữu nó qua API nội bộ có phân quyền. Cách này giảm lượng dữ liệu nhạy cảm đi qua bus. Các stream JetStream được tách theo miền, ví dụ hồ sơ, giải ngân, thu hồi, kèm consumer bền cho mỗi dịch vụ nhận để không mất sự kiện khi dịch vụ tạm ngừng [6].

Đề xuất tiếp: mọi dịch vụ nhận phải idempotent, nhận lặp cùng một sự kiện không tạo hai lần giải ngân. Nhật ký kiểm toán chính thức nằm trong cơ sở dữ liệu của dịch vụ, không dựa vào việc bus giữ thông điệp. Các yêu cầu pháp lý về lưu trữ dữ liệu cá nhân, an toàn thông tin và hoạt động cho vay do bộ phận pháp chế và tuân thủ của công ty xác nhận; bài này không đưa tư vấn pháp lý. Nếu công ty cũng vận hành một hệ thống tri thức như phamvanthu.com, trục sự kiện có thể đồng bộ chỉ mục tài liệu chính sách, nhưng đó là gợi ý ngoài phạm vi chính.

Phát hành, nâng cấp và những gì cần tự dựng quanh máy chủ

RELEASES.md cho biết từ phiên bản 2.11 máy chủ ra bản mới theo chu kỳ sáu tháng, nhánh main dùng cho phát triển, các nhánh phát hành được tạo cho bản vá, và chỉ bản minor hiện tại cùng bản trước đó được hỗ trợ sửa lỗi và vá bảo mật [4]. Với đội vận hành, điều này nghĩa là phải nâng cấp ít nhất mỗi năm, kẻo rơi khỏi vùng được hỗ trợ.

Bản xem trước của bản minor kế tiếp có sẵn khi phát triển tính năng xong, và ảnh Docker chạy đêm của nhánh main có tại kho synadia/nats-server dùng để thử nghiệm [4]. Một công ty tài chính không nên chạy ảnh đêm trong môi trường thật; chỉ dùng nó để thử sớm tính tương thích. Bản phát hành mới nhất lúc thu thập là v2.15.1 theo dữ liệu GitHub API đã lưu, không phải tài liệu trích dẫn.

Phần còn lại là việc đội vận hành phải tự quyết và kiểm chứng từ docs.nats.io: kích thước cụm, số bản sao, cấu hình tài khoản và người dùng, sao lưu và khôi phục stream, giám sát độ trễ hàng đợi. Tài liệu kiểm thử trong kho có đề cập các quy ước đặt tên cho kiểm thử JetStream và kiểm thử cụm, nhưng nội dung nhắc đến Travis, dấu hiệu cho thấy tài liệu phụ này có thể lỗi thời [5].

Kiểm toán bên ngoài, chính sách báo lỗi và khoảng trống người dùng phải tự lấp

README nêu một cuộc kiểm toán bảo mật bên thứ ba do Trail of Bits thực hiện theo thỏa thuận với Open Source Technology Improvement Fund, báo cáo tháng 4 năm 2025 [1]. Đây là dấu hiệu tích cực, nhưng một báo cáo kiểm toán ở một thời điểm không bảo đảm phiên bản người dùng chạy hôm nay không có lỗi; người viết chưa đọc báo cáo đó nên không nêu kết luận của nó.

SECURITY.md cho biết chính sách bảo mật chung của mọi dự án NATS nằm ở kho nats-general, lịch sử khuyến cáo ở advisories.nats.io, và riêng với nats-server hãy báo qua cơ chế GitHub Security Advisory [3]. README thì ghi địa chỉ email bảo mật cho việc báo lỗ hổng [1]. Hai kênh này khác nhau; đội bảo mật của công ty nên theo kênh nêu trong SECURITY.md và theo dõi khuyến cáo định kỳ.

Những gì nguồn đã đọc không mô tả: cơ chế xác thực, phân quyền theo subject, mã hóa đường truyền, mã hóa dữ liệu lưu trên đĩa. Với công ty cho vay, các mục đó là điều kiện tiên quyết, không phải tùy chọn, và phải được xác minh từ tài liệu chính thức trước thử nghiệm. Ngay cả khi chỉ dùng nội bộ, nên giả định rằng mạng nội bộ có thể bị xâm nhập, và không để dữ liệu cá nhân dạng rõ đi qua bus nếu không cần.

Apache-2.0 cho mã máy chủ, nhưng chưa kết luận được cho mọi thứ xung quanh

LICENSE ở commit đã ghim là văn bản Apache License 2.0 [2]. README nói thêm rằng, trừ khi có ghi chú khác, các tệp nguồn NATS phân phối theo giấy phép Apache 2.0 trong tệp LICENSE [1]. Cụm "trừ khi có ghi chú khác" quan trọng: cây tệp được thu thập chỉ có một tệp LICENSE ở gốc, nhưng người viết không rà soát từng tệp nguồn để tìm ghi chú giấy phép riêng.

Apache-2.0 cho phép dùng thương mại, sửa đổi và phân phối với các điều kiện như giữ thông báo bản quyền và nêu thay đổi; điều khoản bằng sáng chế nằm trong văn bản [2]. Kho cũng có tệp DEPENDENCIES.md trong cây tệp, nhưng người viết chưa mở nên không nêu giấy phép của các thư viện phụ thuộc.

Giấy phép chỉ bao phủ mã máy chủ ở commit này. Nó không bao phủ các thư viện client, các sản phẩm hay dịch vụ thương mại do bên khác bán quanh NATS, hay dữ liệu và cấu hình của bạn. Quản trị dự án nằm ở quy tắc chung của NATS trong kho nats-general [7]; người viết không đọc nội dung đó nên không kết luận về nhãn hiệu hay CLA. Đơn vị có kế hoạch đóng gói lại hoặc bán nên hỏi tư vấn pháp lý.

Chi phí nằm ở cụm máy chủ, người trực và kỷ luật thiết kế thông điệp

Không có phí giấy phép, nhưng chi phí tài nguyên có bốn nhóm. Thứ nhất là máy chủ: một cụm nhiều nút để có bản sao, và ổ đĩa đủ nhanh nếu bật lưu bền; số lượng và cấu hình phụ thuộc khối lượng sự kiện, kích thước thông điệp và thời gian giữ, mà bài không có số liệu.

Thứ ba là nhân sự: ít nhất hai người hiểu cách vận hành cụm để có thể trực luân phiên, vì một công ty cho vay phụ thuộc vào dòng sự kiện thông suốt. Thứ tư là công sức thiết kế: định nghĩa lược đồ sự kiện, khóa idempotency, quy tắc đặt tên subject và chiến lược xử lý thông điệp lỗi.

Cách ước tính là đo khối lượng sự kiện thực của luồng thí điểm trong giai đoạn thử nghiệm, rồi nhân với mức giữ lại và số bản sao do đội chọn.

So với hàng đợi trong cơ sở dữ liệu, Kafka, RabbitMQ và dịch vụ hàng đợi của đám mây

Phương án đơn giản nhất là bảng hàng đợi trong chính cơ sở dữ liệu giao dịch. Nó cho nhất quán giao dịch với dữ liệu nghiệp vụ và dễ kiểm toán, nhưng khó mở rộng và tạo tải thêm lên cơ sở dữ liệu. Với ít luồng sự kiện, đây thường là lựa chọn an toàn nhất.

Phương án thứ hai là các hệ thống nhật ký sự kiện phân tán như Apache Kafka, hay broker hướng hàng đợi như RabbitMQ. Chúng có hệ sinh thái trưởng thành và nhiều đội đã quen. Người viết chưa đọc tài liệu chính thức của chúng trong đợt này nên không so sánh hiệu năng, độ trễ hay chi phí. Cách chọn nên dựa trên kỹ năng sẵn có của đội và yêu cầu về thứ tự, lưu giữ, tái phát.

Phương án thứ ba là dịch vụ hàng đợi quản lý của nhà cung cấp đám mây, giảm công vận hành nhưng gắn vào một nhà cung cấp. NATS Server nhấn mạnh khả năng chạy tại chỗ, trên đám mây và ở biên [1], hợp với công ty muốn giữ lựa chọn linh hoạt về nơi chạy.

Những điều kiện không nên dùng, và độ mờ của bằng chứng trong kho này

Giới hạn rõ nhất là chính tài liệu của tầng MQTT liệt kê: gửi lại QoS qua JetStream xảy ra không đúng thứ tự gốc, chưa hoàn tất việc giao thông điệp đang bay sau khi hủy đăng ký hoặc kết nối lại, và còn thiếu lệnh dọn phiên cũ [6].

Giới hạn thứ hai là tài liệu: kho này chủ yếu dẫn sang nơi khác, tài liệu kiểm thử nhắc Travis [5], và các quyết định thiết kế đã chuyển sang kho riêng [8].

Giới hạn thứ ba là chu kỳ phát hành: chỉ hai bản minor gần nhất được hỗ trợ [4]. Không nên dùng khi: cần giao dịch phân tán chặt chẽ giữa bus và cơ sở dữ liệu mà đội chưa có thiết kế bù trừ; cần coi bus là nơi lưu bằng chứng kiểm toán duy nhất; không có người vận hành cụm; hoặc quy định nội bộ yêu cầu mã hóa và kiểm soát truy cập mà chưa được xác minh trên NATS.

Thí điểm sáu tuần trên một luồng sự kiện ít rủi ro

Chọn một luồng không liên quan trực tiếp tới tiền, ví dụ thông báo trạng thái hồ sơ cho hệ thống chăm sóc khách hàng nội bộ. Giai đoạn một, hai tuần: dựng cụm thử nghiệm ba nút theo tài liệu chính thức, bật xác thực và mã hóa đường truyền theo yêu cầu của đội bảo mật, và kiểm tra việc tách quyền theo subject. Tiêu chí qua: dịch vụ ngoài quyền không thể gửi hoặc nhận được sự kiện của luồng khác.

Giai đoạn hai, hai tuần: bật lưu bền JetStream cho luồng đó, dùng consumer bền cho dịch vụ nhận, và chạy kịch bản lỗi có chủ ý như tắt một nút, tắt dịch vụ nhận vài giờ, gửi trùng sự kiện [6]. Đo: số sự kiện mất, số sự kiện nhận trùng, thời gian khôi phục. Ngưỡng chấp nhận phải đặt trước, ví dụ không mất sự kiện nào trong mọi kịch bản và tất cả bản trùng được xử lý idempotent.

Giai đoạn ba, hai tuần: chạy song song với kênh hiện có, so sánh kết quả hai bên và tính công vận hành mỗi tuần. Tiêu chí dừng: bất kỳ mất sự kiện nào không giải thích được; không xác minh được cơ chế xác thực và phân quyền; hoặc đội không thể nhận lịch trực.

Kết luận: dùng như đường ống, không dùng như sổ cái

NATS Server, theo README và các tài liệu đã đọc ở commit ghim, là một máy chủ truyền thông thuộc CNCF, giấy phép Apache-2.0, chạy được nhiều nơi, có JetStream làm lớp lưu bền và có chu kỳ phát hành rõ ràng [1][2][4][6]. Kiểm toán bên ngoài năm 2025 là điểm cộng nhưng chưa thay thế việc tự đánh giá [1].

Với một công ty cho vay tiêu dùng chỉ xét hệ thống nội bộ, giá trị khả dĩ là tách rời các bước xử lý hồ sơ và giảm phụ thuộc đồng bộ. Rủi ro đến từ ngữ nghĩa giao nhận, thứ tự, bảo mật cấu hình và gánh nặng vận hành cụm, mà nguồn trong kho này chưa đủ để kết luận.

Khuyến nghị: thí điểm một luồng ít rủi ro với tiêu chí đo được, đọc tài liệu chính thức về xác thực, phân quyền và JetStream trước khi bắt đầu, và giữ cơ sở dữ liệu nghiệp vụ là nguồn sự thật.

Nguồn, phạm vi đọc và những khoảng trống đã biết

NATS Server được chọn từ kho lưu trữ GitHub Trending do bên thứ ba lưu: lần ghi nhận đầu tiên là danh sách Go ngày 2026-01-04, vị trí 13, với 27 lần quan sát đến ngày 2026-09-30 theo dữ liệu tổng hợp của dự án nghiên cứu [9]. Kho lưu trữ chỉ bao phủ các danh sách Python, Go, JavaScript và Swift, thiếu hai ngày 2026-09-03 và 2026-10-12, và không phải bảng xếp hạng top 100 chính thức.

Commit ghim là 64dda80fdd87b41b2afcdc5faf5d846db6c189b0, ngày commit 2026-10-09, kiểm tra 2026-10-12. Các tệp đã đọc: README [1], LICENSE [2], SECURITY.md [3], RELEASES.md [4], tài liệu kiểm thử trong thư mục server [5], tài liệu cài đặt MQTT [6], GOVERNANCE.md [7] và doc/README.md [8]. Các tài liệu trên docs.nats.io và kho nats-general không được đọc. Tài liệu MQTT phản ánh một lớp tính năng cụ thể, nên các suy luận về JetStream nói chung đều có độ tin cậy hạn chế.

Đây là nghiên cứu bàn giấy: người viết không cài đặt, chạy hay đo hiệu năng phần mềm. Tình huống fintech là đề xuất giả định. Bài không phải ấn phẩm khoa học được bình duyệt, và nội dung kho mã được coi là dữ liệu tham khảo chứ không phải chỉ dẫn.

Xem mã nguồn NATS Server trên GitHub

Khám phá nghiên cứu của BDSG Foundation

Trao đổi về ứng dụng công nghệ cho doanh nghiệp