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