RabbitMQ: Zero to Hero
Sê-ri 40 bài đi từ thông điệp đầu tiên tới định tuyến, độ tin cậy, Spring AMQP, quorum queue và vận hành trên sản xuất. Mỗi bài có mã chạy được và số đo thật.
40/40 phần đã đăng
RabbitMQ
1
Hàng đợi rút thời gian khách chờ từ 464 ms xuống dưới 1 ms — mà tổng thời gian làm xong việc không nhúc nhích
Đo thật hai cách gọi một dịch vụ chậm: hàng đợi rút phản hồi từ 464 ms xuống dưới 1 ms, nhưng tổng thời gian làm xong việc không đổi.
11/07/2026
· 9 phút đọc
2
Dựng RabbitMQ bằng Docker mất ba giây — bốn cái bẫy im lặng đi kèm mất cả buổi chiều
Dựng RabbitMQ bằng Docker chỉ mất một tệp compose. Bốn cái bẫy đi kèm thì mất cả buổi chiều — bài này đo từng cái một.
12/07/2026
· 8 phút đọc
3
Mở connection cho mỗi thông điệp chậm gấp 1128 lần — năm khái niệm AMQP và chỗ thông điệp biến mất
Năm khái niệm của AMQP 0-9-1 như một đường dây thuê bao và một tổng đài: connection là đường dây đắt, channel là cuộc gọi ảo chạy chung trên đó. Đo bằng số giá mở connection, giá mở channel, và chỗ thông điệp lặng lẽ biến mất.
13/07/2026
· 7 phút đọc
4
Consumer chết giữa chừng mà không mất một thông điệp nào — vì broker chờ chữ ký, không chờ ai
Mổ từng tham số của basicPublish và basicConsume, đo vòng đời Ready → Unacked → xong, và cờ mandatory bắt lại thông điệp lạc đường.
14/07/2026
· 7 phút đọc
5
Cái ping báo xanh trước 2,7 giây, còn số trên giao diện chậm hơn CLI bảy lần — nhìn broker sao cho đúng
Ba đường nhìn vào broker — giao diện, rabbitmqctl và HTTP API. Lệnh kiểm tra nào nói thật, và vì sao số trên giao diện chậm hơn CLI bảy lần.
15/07/2026
· 7 phút đọc
6
Dòng khai báo hàng đợi trong mọi tutorial giờ đóng sập cả connection — bốn cờ và bốn mã lỗi
Bốn cờ khai báo hàng đợi, tám tổ hợp và hai cái không còn được phép. Kèm bốn mã lỗi hay gặp và phạm vi sát thương của từng cái.
16/07/2026
· 7 phút đọc
7
Persistent nhanh hơn transient 31% — câu 'bật persistent thì chậm' đã hết đúng từ lâu
Ba phần của một thông điệp AMQP, bốn thuộc tính broker thật sự dùng, và phép đo lật ngược lời khuyên «persistent thì chậm».
17/07/2026
· 8 phút đọc
8
'tôi gửi rồi mà consumer không nhận' — direct exchange khớp routing key đúng từng ký tự
Kiểu định tuyến đơn giản nhất của RabbitMQ: năm biến thể của cùng một khoá chỉ một cái tới đích, và phép đo cho thấy số binding không ảnh hưởng thông lượng.
18/07/2026
· 7 phút đọc
9
Fanout vào 100 hàng đợi, thông lượng tụt 68 lần — broker tính công theo số bản chép, không theo số gửi
Fanout bỏ qua routing key và chép thông điệp cho mọi hàng đợi. Đo cái giá của việc phát tán, và phân biệt chia việc với phát tán.
19/07/2026
· 6 phút đọc
10
don.# khớp cả khoá 'don' trần: cái chữ 'không' trong '# khớp không hoặc nhiều từ' là toàn bộ bài này
Bảng khớp đầy đủ của topic exchange: chín mẫu nhân bảy khoá, đo thật. Khác biệt giữa * và #, và phép đo cho thấy topic gần như miễn phí.
20/07/2026
· 7 phút đọc
11
Headers exchange tụt 13 lần ở 500 binding — kiểu exchange duy nhất RabbitMQ không đánh chỉ mục
Kiểu exchange thứ tư của RabbitMQ: khớp theo bảng header với x-match all hoặc any. Đo hiệu năng, chỉ ra cái bẫy kiểu dữ liệu, và nói thẳng khi nào nên dùng.
21/07/2026
· 8 phút đọc
12
Chuỗi rỗng khi gửi RabbitMQ không phải 'không có exchange' — nó là cửa sau vòng qua mọi luật định tuyến
Default exchange là một exchange thật với binding ngầm không gỡ được — và là cửa sau vòng qua mọi luật định tuyến bạn dựng lên.
22/07/2026
· 7 phút đọc
13
Bật alternate exchange thì mandatory ngừng báo — và thông lượng tụt chính là lượng thông điệp bạn đang mất
Hứng thông điệp không định tuyến được thay vì để nó bốc hơi — như một máng gạt cuối băng chuyền hứng kiện hàng không quét được. Alternate exchange khác mandatory thế nào, và cái giá đo được của nó.
23/07/2026
· 7 phút đọc
14
DLX trỏ ngược về hàng đợi gốc: một vòng lặp nuốt sạch dữ liệu, vòng lặp kia quay vô hạn
Ba nguyên nhân đưa thông điệp vào dead letter exchange, cách đọc header x-death, và hai kiểu vòng lặp hỏng theo hai hướng ngược nhau.
24/07/2026
· 6 phút đọc
15
Chọn một exchange hay nhiều: quyết định thật không nằm ở tốc độ, mà ở chỗ cái tên chính là phân quyền
Ba cách bố trí exchange cho một hệ thống thật, cái giá đo được của topology lớn, và quy ước đặt tên quyết định luôn cả phân quyền.
25/07/2026
· 8 phút đọc
16
Giết consumer giữa chừng, autoAck mất 948/1000 thông điệp — và vì sao basicQos không cứu nổi
Ba chế độ acknowledgement như giao thư thường và thư có ký nhận: 'đã gửi' khác 'đã xử lý', và khoảng giữa là cửa sổ mất dữ liệu. Đo bằng cách kill -9 consumer thật, cái giá thông lượng của an toàn, và hai cách làm channel chết.
26/07/2026
· 7 phút đọc
17
Chờ broker xác nhận từng thông điệp một: chậm gấp 133 lần, mà chẳng an toàn hơn cách nhanh gấp 68
Bốn cách chờ broker xác nhận, đo cạnh nhau. Vì sao cách trực giác nhất là cách tệ nhất, và cơ chế nào làm cách bất đồng bộ nhanh.
27/07/2026
· 7 phút đọc
18
txCommit của RabbitMQ nguyên tử — nhưng chỉ trong broker, và ngộ nhận nó bao cả CSDL là đắt nhất
txSelect, txCommit, txRollback đo cạnh publisher confirms. Vì sao tài liệu chính thức khuyên tránh, và điều rollback thật sự làm với ack.
28/07/2026
· 6 phút đọc
19
Prefetch 100 nhanh hơn 19 lần trên giấy, nhưng làm cả mẻ việc xong chậm gấp 4,3 lần
Đường cong thông lượng theo prefetch từ 1 tới không giới hạn, và mặt trái không ai đo: consumer chậm ôm việc rồi cả mẻ phải chờ nó.
29/07/2026
· 7 phút đọc
20
Một thông điệp hỏng quay 30 679 vòng, chặn đứng năm cái lành xếp sau — và x-delivery-limit không cứu
Cờ redelivered không đếm, requeue vô hạn ăn sạch consumer, và phép đo cho thấy x-delivery-limit chỉ tính khi consumer chết chứ không tính khi mã của bạn nack.
30/07/2026
· 6 phút đọc
21
Thử lại sau vài giây mà không giữ luồng: dựng backoff bằng TTL và DLX, tránh cái bẫy dồn mọi độ trễ thành một
Dựng vòng thử lại có độ trễ bằng TTL và dead letter exchange, đo từng mốc thời gian, và cái bẫy head-of-line làm mọi mức độ trễ thành một.
31/07/2026
· 8 phút đọc
22
Consumer chết ba lần, số dư thành 300 thay vì 100 — RabbitMQ không có 'đúng một lần'
RabbitMQ hứa at-least-once chứ không phải exactly-once. Ba cửa sổ sinh ra bản sao, ba cách chống, và cái giá thật của chúng — 122 byte mỗi thông điệp.
01/08/2026
· 7 phút đọc
23
Sập giữa commit và publish làm mất 20% đơn không ai biết — outbox đổi mất thành trùng
Khe hở giữa commit cơ sở dữ liệu và publish, đo bằng cách sập đúng chỗ hiểm. Vì sao AFTER_COMMIT không cứu được, và outbox thật sự mua gì.
02/08/2026
· 7 phút đọc
24
Spring Boot bật RabbitMQ trong một dòng — kèm ba mặc định đi ngược đúng thứ 23 bài trước đo được
Spring Boot auto-configuration cho sẵn gì cho RabbitMQ, ba mặc định đáng đổi ngay, và phép đo cho thấy RabbitTemplate không tốn thêm gì.
03/08/2026
· 6 phút đọc
25
Tăng consumer từ 1 lên 8 làm chậm gấp 4,4 lần — hay nhanh gấp 8, tuỳ listener có việc thật hay không
Mặc định của @RabbitListener đo bằng reflection, khác biệt thật giữa Simple và Direct container, và vì sao tăng số consumer có thể làm chậm bốn lần.
04/08/2026
· 7 phút đọc
26
Đổi sang JSON không gỡ được ràng buộc giữa hai dịch vụ — nó chỉ chuyển chỗ
Jackson2JsonMessageConverter, cái header trói hai dịch vụ vào nhau, và cách gỡ bằng idClassMapping. Kèm phép đo thông lượng hai converter.
05/08/2026
· 6 phút đọc
27
Khai topology bằng bean Spring: broker tắt vẫn khởi động xanh, khai lệch tham số chỉ là một dòng log
RabbitAdmin khai báo topology từ bean, nhưng nó làm việc đó muộn hơn bạn tưởng — và khai lệch tham số không làm ứng dụng dừng lại.
06/08/2026
· 6 phút đọc
28
Cùng một listener, hai loại lỗi: một cái quay vô hạn 11.189 lần, một cái ra đi ngay lần đầu
Vì sao hai ngoại lệ trong cùng một @RabbitListener lại có số phận ngược nhau, và phép đo cho thấy RepublishMessageRecoverer đính 1.688 byte header lên một thân 8 byte.
07/08/2026
· 7 phút đọc
29
Retry bốn dòng của Spring cho cùng kết quả nhưng chậm gấp 1000 lần — vì luồng ngồi chờ, không làm gì
Spring AMQP cho bật retry bằng vài dòng cấu hình. Phép đo cho thấy nó chặn luồng consumer, và toàn bộ thời gian thêm vào là thời gian ngồi chờ.
08/08/2026
· 7 phút đọc
30
Test với broker giả thì mọi thứ xanh — chạy broker thật mà không biến bộ test thành nửa tiếng chờ
Chạy broker thật trong test thay vì mock, giữ thời gian chạy ở mức chấp nhận được, và bỏ Thread.sleep — thứ làm năm phép chờ tốn 10,11 giây thay vì 0,12.
09/08/2026
· 6 phút đọc
31
Trace id chết ngay tại basicPublish — vì sao log hai đầu broker không nối được, và cái giá 10% để nối
Ngữ cảnh truy vết dừng ngay tại basicPublish. Cách nối lại log hai phía bằng một header, đo cái giá, và ba chi tiết hay bỏ sót.
10/08/2026
· 6 phút đọc
32
Đẩy một triệu thông điệp vào RabbitMQ, RAM không nhúc nhích — thứ phình là đĩa, không phải bộ nhớ
Đẩy dần tới một triệu thông điệp rồi đo bộ nhớ, đĩa và thông lượng. Vì sao chế độ lazy không còn ý nghĩa, và thứ thật sự cần lo khi hàng đợi phình.
11/08/2026
· 6 phút đọc
33
Quorum queue trên một node: trả đủ 36% thông lượng cho Raft, mà chẳng bảo vệ được ai
Đo cái giá của Raft khi chưa có nhân bản nào, danh sách tham số quorum queue từ chối, và khi nào classic vẫn là lựa chọn đúng.
12/08/2026
· 7 phút đọc
34
Tắt một node: hàng đợi classic biến mất khỏi cụm, quorum không ai để ý — và cái giá của nó
Dựng cụm ba node bằng Docker, đo cái giá thật của nhân bản, rồi tắt node và cắt mạng để xem hàng đợi classic và quorum hành xử khác nhau thế nào.
13/08/2026
· 8 phút đọc
35
Stream ghi 1000 thông điệp mà mọi công cụ báo 'còn 0' — kiểu hàng đợi mà đếm độ sâu là vô nghĩa
Kiểu hàng đợi thứ ba của RabbitMQ — log chỉ ghi thêm. Đo thông lượng trên cụm ba node, đọc lại từ đầu, và cái bẫy làm mọi cảnh báo độ sâu hàng đợi mù tịt.
14/08/2026
· 7 phút đọc
36
Nối hai broker rời nhau: Shovel bê sạch thông điệp đi, Federation để nguyên rồi chép — khác nhau đúng một chữ
Nối hai broker rời bằng Shovel và bằng Federation, đo tốc độ chuyển, và chỉ ra khác biệt quyết định việc chọn cái nào.
15/08/2026
· 6 phút đọc
37
TLS truyền dữ liệu chỉ tốn 5%, bắt tay mới đắt gấp 2,7 lần — và ba cột quyền chặn đúng cái gì
vhost tách biệt tới đâu, ba cột quyền configure–write–read chặn đúng cái gì, và cái giá đo được của TLS trên cả hai chiều.
16/08/2026
· 7 phút đọc
38
Hai hàng đợi 30 000 thông điệp, mọi chỉ số giống hệt — chỉ tốc độ ack (795 vs 0) nói bên nào đang chết
Đo hai tình huống giống hệt nhau trên mọi chỉ số quen thuộc, tìm ra con số duy nhất tách được chúng, và sáu chỉ số Prometheus đáng đặt cảnh báo.
17/08/2026
· 6 phút đọc
39
Cùng một mức đảm bảo, nhanh gấp 122 lần — và không đổi một dòng cấu hình broker nào
Gom toàn bộ phép đo của ba mươi tám bài thành hai bảng: thứ thật sự đổi được hiệu năng, và sáu thứ ai cũng khuyên mà đo ra không khác gì.
18/08/2026
· 6 phút đọc
40
Kafka đọc nhanh gấp 16 lần RabbitMQ — nhưng con số đó nói dối, vì hai bên không hứa cùng một điều
Đo RabbitMQ và Kafka cạnh nhau trên cùng một máy, chỉ ra chỗ phép so sánh không công bằng, bốn câu hỏi để chọn, và nhìn lại bốn mươi bài.
19/08/2026
· 8 phút đọc