Eclipse Vert.x cho microservice
Sê-ri 50 bài đi từ event loop và verticle tới event bus phân cụm, các mẫu microservice, client dữ liệu reactive và đưa lên sản xuất. Mọi khẳng định đều kèm số đo chạy thật.
50/50 phần đã đăng
Vert.x
1
Spring MVC đứng yên ở 8.900 req/s dù tăng tải 25 lần, Vert.x lên 86.804 — nhưng một dòng chặn hạ 1/16 cả máy chủ
Đo mô hình event loop cạnh mô hình một luồng mỗi request khi số kết nối tăng dần, kèm hai lần tôi đo sai trước khi ra được con số đúng.
02/07/2025
· 7 phút đọc
2
Quên gọi complete() trong Verticle, cả ứng dụng treo vĩnh viễn — không lỗi, không log
Dựng dự án Vert.x đầu tiên, mổ vòng đời Verticle bằng phép đo, và đo thời gian khởi động cùng kích thước gói so với Spring Boot.
03/07/2025
· 6 phút đọc
3
Bốn kết nối chặn làm sập thông lượng 59 lần — bán kính sát thương của một handler chặn
Luật duy nhất của event loop, đo bằng số: bán kính sát thương của một handler chặn, và phép tính giải thích chính xác con số đo được.
04/07/2025
· 6 phút đọc
4
Mất 90% thông lượng mà công cụ bắt chặn của Vert.x không nói một lời — đặt ngưỡng thế nào cho đúng
Bốn tham số mặc định của blocked thread checker, thứ nó bỏ sót, thứ nó bắt được, và vì sao gần như ai cũng bỏ qua cảnh báo của nó.
05/07/2025
· 7 phút đọc
5
executeBlocking mặc định: 20 luồng worker mà chỉ 1 chạy, 19 ngồi không — chậm 20 lần, không một dòng lỗi
Bốn cách chạy mã chặn trong Vert.x, đo cả bốn. Tất cả đều cứu được event loop, nhưng thông lượng của chúng chênh nhau hai mươi lần vì một tham số mặc định.
06/07/2025
· 7 phút đọc
6
Ném ngoại lệ trong onSuccess của Vert.x là mất luôn lỗi — request treo, không log, không 500
Future và Promise của Vert.x: compose dừng ở bước hỏng, recover khác otherwise ở đâu, ngoại lệ đi về đâu, và chi phí thật của một chuỗi ba bước.
07/07/2025
· 6 phút đọc
7
compose hai Future trông như nối tiếp nhưng chạy song song — vì Future khởi động lúc *tạo*, không lúc ghép
Ghép năm lời gọi bất đồng bộ theo ba cách và đo thời gian, khác biệt giữa all với join khi có lỗi, và cái bẫy compose không hề tuần tự hoá.
08/07/2025
· 6 phút đọc
8
ThreadLocal trên event loop không mất dữ liệu — nó trả về dữ liệu của request khác
Vì sao ThreadLocal không dùng được trên event loop — nó không mất dữ liệu, nó trả về dữ liệu của người khác. Và đo xem Context đi được tới đâu.
09/07/2025
· 6 phút đọc
9
Quên gọi next(): request treo tới khi client bỏ cuộc, không một dòng log — và 50 handler vẫn miễn phí
Đo chi phí thật của Router và chuỗi handler trong Vert.x Web, cùng ba cách làm request biến mất mà không có dòng lỗi nào.
10/07/2025
· 6 phút đọc
10
Client gửi rác, endpoint Vert.x báo 500 — vì sao lỗi của họ lại thành lỗi của bạn
Ba cách làm thân request biến mất trong Vert.x Web, hành vi thật khi vượt giới hạn kích thước, và chỗ lỗi của client bị báo thành lỗi của server.
11/07/2025
· 6 phút đọc
11
Upstream không sập, chỉ im lặng — 40 request treo kéo thông lượng về 0 và ở lại đó mãi
Đo thông lượng Web Client theo kích thước pool, chỉ ra chỗ maxPoolSize bị nhân lên mà không ai để ý, và dựng lại cảnh sập toàn phần vì quên phép chờ.
12/07/2025
· 6 phút đọc
12
Một dòng write() thiếu áp lực ngược: một client mạng yếu ngốn 172 MiB, đủ để sập cả ứng dụng
Hai cách truyền tệp trông giống hệt nhau, một cái đọc tệp vào RAM nhanh hết mức có thể. Đo heap của cả hai với cùng một client chậm.
13/07/2025
· 6 phút đọc
13
39 luồng giữ gần 10.000 WebSocket — nhưng phát tin cho tất cả lại là một quét O(n) trên event loop
Đo chi phí thật của kết nối WebSocket giữ mở trong Vert.x — bộ nhớ, số luồng, thời gian phát tin — và cái bẫy giới hạn 50 kết nối phía client.
14/07/2025
· 6 phút đọc
14
Mười nghìn kết nối SSE cạnh mười nghìn WebSocket: cái 'nhẹ hơn' hoá ra tốn bộ nhớ y hệt
Đo mười nghìn kết nối SSE cạnh mười nghìn WebSocket trên cùng máy chủ, và chỉ ra khác biệt thật sự nên dựa vào để chọn.
15/07/2025
· 6 phút đọc
15
Đổi một chữ trong tên thuật toán JWT, thông lượng tụt từ 99.657 xuống 27.486 req/s
Bảo vệ route bằng JWTAuthHandler trong Vert.x Web, rồi đo chi phí thật của việc kiểm chữ ký mỗi request — HS256 gần như miễn phí, RS256 lấy mất 72% thông lượng.
16/07/2025
· 7 phút đọc
16
Một dòng bật luồng ảo, Spring MVC vọt từ 8.900 lên 42.589 req/s — bám sát Vert.x ở đúng chỗ nó sinh ra để thắng
Ba khung, cùng một endpoint, cùng một máy: Vert.x Web, Spring MVC, và Spring MVC với luồng ảo. Kèm phần nói rõ chỗ phép so sánh không công bằng.
17/07/2025
· 7 phút đọc
17
Event bus báo 40 triệu thông điệp/giây — đó là tốc độ xếp hàng, không phải tốc độ giao
Ba kiểu gửi trên event bus của Vert.x, thông lượng thật của từng kiểu, độ trễ hỏi đáp tính bằng micro giây, và chỗ phép đo dễ tự lừa mình.
18/07/2025
· 6 phút đọc
18
Cách nhanh nhất đưa object qua event bus Vert.x lại lén chia sẻ trạng thái giữa hai luồng
Ba cách đưa POJO lên event bus của Vert.x, đo kích thước trên dây và thông lượng, và cái bẫy chia sẻ trạng thái mà cách nhanh nhất mang theo.
19/07/2025
· 6 phút đọc
19
Event bus nhanh hơn HTTP nội bộ 11 lần — và đó gần như không bao giờ là lý do để chọn nó
Cùng một tương tác hỏi đáp, đo qua event bus và qua HTTP trên cùng tiến trình, rồi nói rõ ba trường hợp HTTP vẫn là lựa chọn đúng.
20/07/2025
· 6 phút đọc
20
Một NullPointerException trong consumer Vert.x làm treo mọi request đi qua nó suốt 30 giây
DeliveryOptions của Vert.x — timeout mặc định 30 giây, ba cách một request hỏng, và cách phân biệt chúng ở phía gọi.
21/07/2025
· 6 phút đọc
21
Qua cụm, event bus của Vert.x chậm hơn cả HTTP loopback — lợi thế tốc độ đến từ *không* qua mạng
Dựng cụm hai node bằng Hazelcast rồi đo lại event bus: độ trễ, thông lượng, và cách send phân phối khi có consumer ở cả hai bên.
22/07/2025
· 6 phút đọc
22
Một dòng regex .* trong cầu nối SockJS biến cả event bus nội bộ thành API công khai
Đưa event bus của Vert.x ra trình duyệt, đo ba mức cấu hình quyền, và dựng lại kịch bản lạm dụng bằng một client giả lập.
23/07/2025
· 6 phút đọc
23
A bỏ cuộc sau 1 giây nhưng C vẫn chạy xong — timeout không dừng việc, nó chỉ thôi chờ
Chuỗi hỏi đáp nhiều chặng trên event bus — lỗi có về tới nơi không, timeout lồng nhau xử sự ra sao, và mỗi chặng thêm vào tốn bao nhiêu.
24/07/2025
· 6 phút đọc
24
Tra một dịch vụ ở sổ 1000 bản ghi tốn gần 1ms — mà cái bạn tra được có thể đã chết từ lâu
Service Discovery của Vert.x: ba kiểu bản ghi, chi phí tìm kiếm tăng tuyến tính theo số dịch vụ, và bản ghi đã cầm trong tay không bao giờ tự hết hạn.
25/07/2025
· 6 phút đọc
25
Hạ nguồn treo: timeout mất 15 giây và dội đủ 30 lần, circuit breaker mất 2,5 giây, chỉ 5 lần
Đo circuit breaker của Vert.x trong đúng tình huống nó sinh ra: một dịch vụ hạ nguồn treo. Kèm ba giá trị mặc định nên đổi ngay.
26/07/2025
· 7 phút đọc
26
Thiếu đúng một dòng scanPeriod: nạp nóng cấu hình biên dịch được, chạy được, và không bao giờ chạy
Vert.x Config gộp nhiều nguồn theo thứ tự khai báo, nạp nóng sau nửa giây — nhưng chỉ khi bạn khai một dòng mà tài liệu không nhấn mạnh.
27/07/2025
· 6 phút đọc
27
Gộp liveness với readiness: một CSDL chết biến thành mất sạch dịch vụ vì vòng khởi động lại vô ích
Đo bằng Vert.x Health Check: liveness và readiness khác nhau ở đâu, và chuyện gì xảy ra khi gộp chúng làm một. Kèm phép đo health check chặn event loop.
28/07/2025
· 9 phút đọc
28
Chặng đi thêm của API gateway chỉ mất 19,5% — quên keep-alive mới là chỗ mất thêm 74%
Dựng API Gateway bằng Vert.x rồi đo: giá của chặng trung gian, cái bẫy gom kết nối, và vì sao ghép song song đôi khi không nhanh hơn tuần tự chút nào.
29/07/2025
· 11 phút đọc
29
Bộ giới hạn 1 000/giây lặng lẽ cho qua 8 000 — bốn cách đếm và cái bẫy bộ đếm trong Verticle
Bốn kiểu giới hạn tần suất viết trên event loop Vert.x, đo độ chính xác ở ranh giới cửa sổ, chi phí mỗi lần kiểm và bộ nhớ mỗi khoá.
30/07/2025
· 12 phút đọc
30
Ba tầng mỗi tầng thử lại 3 lần: một request của khách hoá 27 lượt dội vào dịch vụ đang sập
Đo mức nhân lên của retry qua chuỗi ba dịch vụ Vert.x, cách truyền hạn chót cắt nó xuống, và phép đo cho thấy rung ngẫu nhiên làm gì — cùng thứ nó không làm được.
31/07/2025
· 11 phút đọc
31
Một hạ nguồn chậm bóp chết đường nhanh chẳng liên quan — thông lượng rớt 11 nghìn lần, log 0 lỗi
Đo hiện tượng cạn pool khi hai phụ thuộc dùng chung một WebClient, rồi vá bằng hai kiểu vách ngăn. Kèm cùng cái bẫy đó trên pool luồng chặn của Vert.x.
01/08/2025
· 10 phút đọc
32
runOnContext trông như đã quay về đúng chỗ — nhưng bạn về 'một' context, không phải 'cái' context
Đo xem context local của Vert.x còn sót lại ở chặng bất đồng bộ nào, bốn chỗ nó rơi mất, cách vá từng chỗ, và chi phí thật của việc mang ngữ cảnh đi khắp nơi.
02/08/2025
· 9 phút đọc
33
Service proxy làm lời gọi trông như hàm thường — nhưng nó vẫn là một chặng event bus, đắt gấp 20 lần
Service Proxy của Vert.x sinh mã từ interface. Đo chi phí thật so với gửi event bus bằng tay, kèm cái bẫy hâm nóng JIT đã làm phép đo đầu tiên sai hoàn toàn.
03/08/2025
· 10 phút đọc
34
Reactive vs JDBC hoà nhau từng req/s — vì cả hai nghẽn ở cùng chỗ, và reactive mua thứ không nằm trong bảng
Nối PostgreSQL 16 thật bằng Vert.x PG Client và JDBC ở cùng mức đồng thời. Thông lượng ngang nhau, khác biệt nằm ở số luồng và bộ nhớ. Luồng ảo chậm nhất.
04/08/2025
· 9 phút đọc
35
Nới pool từ 20 lên 200: p50 đẹp gấp đôi, p99 sụp gấp 4,7 lần — và biểu đồ của bạn chỉ khoe nửa đẹp
Đo tác động của kích thước pool lên độ trễ đuôi trên PostgreSQL thật, cách withTransaction lùi lại, cursor bắt buộc nằm trong giao dịch, và cache prepared statement không cho khác biệt nào.
05/08/2025
· 10 phút đọc
36
Handler Kafka làm việc nặng ngay trên event loop: HTTP tụt 375 lần, không một dòng lỗi
Vert.x Kafka client trên broker 3.9 thật: gửi bất đồng bộ nhanh hơn chờ từng bản tin 129 lần, và handler chạy ngay trên event loop là chỗ hỏng lớn nhất.
06/08/2025
· 8 phút đọc
37
Consumer RabbitMQ trên event loop làm HTTP chết hẳn 50 giây — broker đẩy 100k bản tin, không phanh
Vert.x RabbitMQ client trên broker 4.3.5 thật: publisher confirm đắt 177 µs nếu chờ từng bản tin, prefetch là công tắc sống còn, và RabbitMQ 4.x đã bỏ hàng đợi transient.
07/08/2025
· 8 phút đọc
38
Benchmark đầu tiên báo 72 triệu lệnh/giây trên Redis đơn luồng — con số bất khả thi cứu cả bài
Vert.x Redis client trên Redis 7.4 thật: gom lệnh thành lô nhanh gấp 73 lần gửi từng cái, maxPoolWaiting mặc định 24, và cách một benchmark im lặng đo nhầm thất bại.
08/08/2025
· 9 phút đọc
39
find() đọc hết vào RAM chạy ngon suốt — tới ngày bảng đủ lớn thì OOM hạ cả tiến trình
Vert.x Mongo client trên MongoDB 7 thật: truy vấn thiếu chỉ mục chậm 116 lần, bulkWrite nhanh 23 lần, và find() chết OOM ở đúng chỗ findBatch sống khoẻ.
09/08/2025
· 8 phút đọc
40
Đọc theo luồng còn tốn RAM hơn nạp hết vào bộ nhớ — cho tới khi tôi thêm bảy dòng
Nối RowStream PostgreSQL vào HTTP response với 20 client đọc chậm. Ba cách viết, ba kết cục: nạp hết OOM 5 lần, streaming trần OOM 8 lần, streaming có áp lực ngược 0 lần và tốn ít hơn 18 lần.
10/08/2025
· 8 phút đọc
41
Cãi nhau xem lớp bọc reactive nào nhanh hơn — trong khi nó chỉ chiếm 0,15% thời gian một request
Viết cùng một luồng gọi ba dịch vụ bằng bốn phong cách rồi đo cả bốn. Thông lượng như nhau, chi phí lớp bọc chỉ vài chục nano giây, khác biệt thật nằm ở chỗ khác.
11/08/2025
· 8 phút đọc
42
Cụm Vert.x mặc định gửi lưu lượng cho node chết suốt 60 giây — và hai API 'toàn cụm' ném lỗi lúc chạy
Dựng cụm Vert.x ba node bằng Hazelcast 5.5: thời gian gia nhập, chia tải event bus, dữ liệu chung sống sót qua mất node, và hai API trong lõi Vert.x không chạy được.
12/08/2025
· 9 phút đọc
43
getLock chạy ngon trên máy bạn, ném lỗi ngay khi lên cụm — cái khoá hỏng đúng lúc cần nó nhất
Đo ba kiểu chia sẻ dữ liệu của Vert.x trong và ngoài cụm: LocalMap 26 ns, AsyncMap cụm 49,5 µs, và LocalMap sao chép lúc get chứ không phải lúc put.
13/08/2025
· 9 phút đọc
44
Bảng độ trễ đứng yên 13,9 ms trong khi khách chờ 600 ms — chỉ số mặc định nói dối rất thuyết phục
Bật Micrometer cho Vert.x: 23 họ chỉ số có sẵn, một điểm mù lớn không ai nói tới, và sáu chỉ số đáng đặt cảnh báo cho ứng dụng event loop.
14/08/2025
· 9 phút đọc
45
Log ERROR qua Logback mặc định làm thông lượng sụp 150 lần — chính đoạn mã ghi sự cố nhân sự cố lên
Stack trace mất ngữ cảnh qua các chặng bất đồng bộ, chi phí thật của log trên event loop, và bốn giá trị mặc định của Logback biến ghi log thành điểm chết.
15/08/2025
· 9 phút đọc
46
Hai test khẳng định 200 == 999 mà vẫn xanh — vì sao test bất đồng bộ viết sai không đỏ
Bốn cách viết test bất đồng bộ, tất cả cùng một khẳng định sai. Hai cái xanh giả, hai cái bắt được. Kèm đo thời gian bộ test viết bằng sleep so với VertxTestContext.
16/08/2025
· 8 phút đọc
47
Ảnh native khởi động nhanh 13 lần nhưng thông lượng đỉnh chậm 26% — chọn cái nào tuỳ vòng đời
Đo ba cách đóng gói Vert.x: fat jar trên JRE, runtime jlink, và ảnh native GraalVM. Kích thước, thời gian khởi động, bộ nhớ và thông lượng đỉnh — kèm ba lỗi khi dựng native.
17/08/2025
· 8 phút đọc
48
Đỉnh event loop nằm ở 2 trên máy 16 nhân — 'một loop mỗi nhân' là lời khuyên sai chỗ
Quét số bản sao Verticle, eventLoopPoolSize và kích thước pool worker trên Vert.x. Hai thứ đạt đỉnh sớm rồi tụt, một thứ tuyến tính — và một phép đo sai vì lỗi shell.
18/08/2025
· 8 phút đọc
49
Vert.x thắng WebFlux 35% — cho tới khi tôi đếm luồng và thấy 200 luồng Tomcat lạc trong bên thua
Đo Vert.x và Spring WebFlux cạnh nhau trên năm kiểu route. Sau khi dọn sạch classpath, hai bên gần như ngang nhau ở mọi thứ trừ thời gian khởi động.
19/08/2025
· 9 phút đọc
50
Sáu sự cố nghiêm trọng, không một dòng ngoại lệ — chốt 50 bài đo Vert.x
Chốt sê-ri Vert.x: danh sách kiểm trước khi lên sản xuất, mười phép đo đi ngược trực giác, và những lần chính tôi đo sai rồi phải sửa.
20/08/2025
· 10 phút đọc