mirror of
https://github.com/tiennm99/miti99.git
synced 2026-09-17 16:20:43 +00:00
feat: update newsletter no.28
This commit is contained in:
+138
-138
@@ -9,24 +9,24 @@ categories: [ "Newsletter" ]
|
||||
|
||||
## [How Airbnb Measures Listing Lifetime Value](https://medium.com/airbnb-engineering/how-airbnb-measures-listing-lifetime-value-a603bf05142c)
|
||||
|
||||
Bài viết từ Airbnb Engineering chia sẻ cách họ đo lường và tính toán Listing Lifetime Value (LTV) - một metric quan trọng để hiểu giá trị kinh tế dài hạn của mỗi listing trên nền tảng. Đây là một bài viết kỹ thuật chi tiết về cách xây dựng hệ thống đo lường metrics phức tạp trong môi trường production quy mô lớn.
|
||||
Bài viết từ Airbnb Engineering chia sẻ cách họ đo lường và tính toán Giá Trị Vòng Đời Danh Sách (Listing Lifetime Value - LTV) - một chỉ số quan trọng để hiểu giá trị kinh tế dài hạn của mỗi danh sách trên nền tảng. Đây là một bài viết kỹ thuật chi tiết về cách xây dựng hệ thống đo lường các chỉ số phức tạp trong môi trường sản xuất quy mô lớn.
|
||||
|
||||
Airbnb đã phát triển một framework toàn diện để đo lường LTV của listings, bao gồm việc xử lý các thách thức như:
|
||||
Airbnb đã phát triển một khung làm việc toàn diện để đo lường LTV của các danh sách, bao gồm việc xử lý các thách thức như:
|
||||
|
||||
**Các thách thức chính:**
|
||||
|
||||
- **Tính toán giá trị dự đoán**: Làm thế nào để dự đoán lifetime value của một listing khi chưa biết được nó sẽ hoạt động trong bao lâu
|
||||
- **Xử lý dữ liệu thời gian thực**: Cập nhật metric này khi có booking mới, cancellation, hay thay đổi giá
|
||||
- **Tính toán trên quy mô lớn**: Xử lý hàng triệu listings với hàng tỷ data points
|
||||
- **Tính toán giá trị dự đoán**: Làm thế nào để dự đoán giá trị vòng đời của một danh sách khi chưa biết được nó sẽ hoạt động trong bao lâu
|
||||
- **Xử lý dữ liệu thời gian thực**: Cập nhật chỉ số này khi có đặt chỗ mới, hủy bỏ, hay thay đổi giá
|
||||
- **Tính toán trên quy mô lớn**: Xử lý hàng triệu danh sách với hàng tỷ điểm dữ liệu
|
||||
|
||||
**Kiến trúc kỹ thuật:**
|
||||
|
||||
- Sử dụng data pipeline để xử lý streaming data
|
||||
- Áp dụng machine learning models để dự đoán behavior patterns
|
||||
- Implement caching strategies để đảm bảo performance
|
||||
- Thiết kế hệ thống monitoring và alerting cho data quality
|
||||
- Sử dụng đường ống dữ liệu để xử lý dữ liệu luồng
|
||||
- Áp dụng mô hình học máy để dự đoán mẫu hành vi
|
||||
- Triển khai chiến lược caching để đảm bảo hiệu suất
|
||||
- Thiết kế hệ thống giám sát và cảnh báo cho chất lượng dữ liệu
|
||||
|
||||
Bài viết cũng đề cập đến việc balance giữa accuracy và computational cost, cách handle edge cases, và làm thế nào để validate kết quả của model trong môi trường thực tế.
|
||||
Bài viết cũng đề cập đến việc cân bằng giữa độ chính xác và chi phí tính toán, cách xử lý các trường hợp ngoại lệ, và làm thế nào để xác thực kết quả của mô hình trong môi trường thực tế.
|
||||
|
||||
## [Six JDK 24 Features You Should Know About](https://foojay.io/today/six-jdk-24-features-you-should-know-about/)
|
||||
|
||||
@@ -36,233 +36,233 @@ Bài viết từ foojay.io giới thiệu 6 tính năng quan trọng nhất tron
|
||||
|
||||
### 1. JEP 483: Ahead-of-time Class Loading & Linking
|
||||
|
||||
- Thuộc về Project Leyden nhằm giảm startup time của Java applications
|
||||
- Cho phép classes được load và link sẵn khi JVM khởi động, tránh overhead của việc loading/verifying/linking lặp đi lặp lại
|
||||
- Thuộc về Project Leyden nhằm giảm thời gian khởi động của các ứng dụng Java
|
||||
- Cho phép các lớp được tải và liên kết sẵn khi JVM khởi động, tránh chi phí phụ của việc tải/xác minh/liên kết lặp đi lặp lại
|
||||
- Cải thiện đáng kể thời gian khởi động ứng dụng
|
||||
|
||||
### 2. JEP 485: Stream Gatherers
|
||||
|
||||
- Mở rộng Streams API với khả năng tạo custom intermediate operations
|
||||
- Tương tự như Collector interface cho terminal operations, Gatherer interface cho phép developers tạo các custom intermediate operations
|
||||
- Tăng tính linh hoạt và khả năng tái sử dụng trong functional programming
|
||||
- Mở rộng Streams API với khả năng tạo các thao tác trung gian tùy chỉnh
|
||||
- Tương tự như Collector interface cho các thao tác đầu cuối, Gatherer interface cho phép các nhà phát triển tạo các thao tác trung gian tùy chỉnh
|
||||
- Tăng tính linh hoạt và khả năng tái sử dụng trong lập trình hàm
|
||||
|
||||
### 3. JEP 491: Synchronize Virtual Threads Without Pinning
|
||||
|
||||
- Giải quyết limitation quan trọng của virtual threads khi sử dụng synchronized blocks/methods
|
||||
- Trước đây, virtual threads sẽ "pin" platform thread khi trong synchronized block, giờ monitor được associate với virtual thread thay vì platform thread
|
||||
- Cải thiện đáng kể scalability của applications sử dụng virtual threads
|
||||
- Giải quyết giới hạn quan trọng của virtual threads khi sử dụng synchronized blocks/methods
|
||||
- Trước đây, virtual threads sẽ "ghim" platform thread khi trong synchronized block, giờ monitor được liên kết với virtual thread thay vì platform thread
|
||||
- Cải thiện đáng kể khả năng mở rộng của các ứng dụng sử dụng virtual threads
|
||||
|
||||
### 4. JEP 486: Permanently Disable Security Manager
|
||||
|
||||
- Loại bỏ hoàn toàn Security Manager - tính năng đã deprecated từ JDK 17
|
||||
- Mặc dù có vẻ giảm security, thực tế Security Manager đã lỗi thời và ít được sử dụng
|
||||
- Applications sử dụng tính năng này sẽ cần architectural changes để migrate lên JDK 24
|
||||
- Loại bỏ hoàn toàn Security Manager - tính năng đã bị loại bỏ dần từ JDK 17
|
||||
- Mặc dù có vẻ giảm bảo mật, thực tế Security Manager đã lỗi thời và ít được sử dụng
|
||||
- Các ứng dụng sử dụng tính năng này sẽ cần thay đổi kiến trúc để nâng cấp lên JDK 24
|
||||
|
||||
### 5. JEP 498: Warning for sun.misc.Unsafe Memory-Access Methods
|
||||
|
||||
- JVM sẽ warning khi sử dụng memory-access methods trong sun.misc.Unsafe
|
||||
- JVM sẽ cảnh báo khi sử dụng các phương thức truy cập bộ nhớ trong sun.misc.Unsafe
|
||||
- Khuyến khích chuyển sang sử dụng VarHandle API và Foreign Function & Memory API
|
||||
- Tiếp tục quá trình encapsulation của internal JDK APIs
|
||||
- Tiếp tục quá trình đóng gói của các API nội bộ của JDK
|
||||
|
||||
### 6. JEP 501: Deprecate 32-bit x86 Port for Removal
|
||||
|
||||
- Deprecate 32-bit x86 port trên Linux (Windows 32-bit đã bị remove từ JDK 21)
|
||||
- Phản ánh thực tế là rất ít hệ thống vẫn chạy 32-bit OS trong môi trường production hiện đại
|
||||
- Loại bỏ dần 32-bit x86 port trên Linux (Windows 32-bit đã bị gỡ bỏ từ JDK 21)
|
||||
- Phản ánh thực tế là rất ít hệ thống vẫn chạy hệ điều hành 32-bit trong môi trường sản xuất hiện đại
|
||||
|
||||
## [JavaOne 2025: Function and Memory Access in Pure Java](https://www.infoq.com/news/2025/04/foreign-function-minborg/)
|
||||
|
||||
Bài viết từ InfoQ tóm tắt bài presentation của Per-Åke Minborg tại JavaOne 2025 về Foreign Function & Memory API (FFM), một trong những tính năng quan trọng nhất được giới thiệu trong JDK 22. FFM API được phát triển dưới dự án Panama nhằm thay thế JNI (Java Native Interface) với cách tiếp cận hiện đại và an toàn hơn.
|
||||
Bài viết từ InfoQ tóm tắt bài thuyết trình của Per-Åke Minborg tại JavaOne 2025 về Foreign Function & Memory API (FFM), một trong những tính năng quan trọng nhất được giới thiệu trong JDK 22. FFM API được phát triển dưới dự án Panama nhằm thay thế JNI (Java Native Interface) với cách tiếp cận hiện đại và an toàn hơn.
|
||||
|
||||
**Vấn đề với JNI truyền thống:**
|
||||
|
||||
- Native-first programming model dễ bị lỗi với sự kết hợp giữa Java và C
|
||||
- Chi phí maintain và deploy cao
|
||||
- Passing data to/from JNI cumbersome và inefficient
|
||||
- Chỉ support primitive types và Java objects
|
||||
- Không có cách nào để deterministically free memory
|
||||
- Limited addressing space (~2GB)
|
||||
- Mô hình lập trình ưu tiên native dễ bị lỗi với sự kết hợp giữa Java và C
|
||||
- Chi phí bảo trì và triển khai cao
|
||||
- Truyền dữ liệu đến/từ JNI phức tạp và kém hiệu quả
|
||||
- Chỉ hỗ trợ các kiểu dữ liệu nguyên thủy và đối tượng Java
|
||||
- Không có cách nào để giải phóng bộ nhớ một cách xác định
|
||||
- Không gian địa chỉ bị giới hạn (~2GB)
|
||||
|
||||
**Foreign Memory API - Giải pháp cho memory access:**
|
||||
**Foreign Memory API - Giải pháp cho truy cập bộ nhớ:**
|
||||
|
||||
### Memory Segments và Arena
|
||||
|
||||
- `MemorySegment` interface cung cấp access đến continuous memory region với 64-bit addressing
|
||||
- Control thông qua Size (Out-Of-Bounds protection), Lifetime (Use-After-Free protection), và Thread Confinement
|
||||
- `Arena` interface quản lý lifecycle của native memory segments với các types:
|
||||
- **Global**: unbounded lifetime
|
||||
- **Auto**: automatic garbage-collected lifetime
|
||||
- **Confined**: explicitly bounded lifetime
|
||||
- **Shared**: explicitly bounded lifetime với multi-threaded access
|
||||
- Giao diện `MemorySegment` cung cấp quyền truy cập đến vùng bộ nhớ liên tục với địa chỉ 64-bit
|
||||
- Kiểm soát thông qua Kích thước (bảo vệ khỏi truy cập ngoài giới hạn), Vòng đời (bảo vệ khỏi sử dụng sau khi giải phóng), và Giới hạn luồng
|
||||
- Giao diện `Arena` quản lý vòng đời của các phân đoạn bộ nhớ native với các loại:
|
||||
- **Global**: vòng đời không giới hạn
|
||||
- **Auto**: vòng đời được thu gom rác tự động
|
||||
- **Confined**: vòng đời bị giới hạn rõ ràng
|
||||
- **Shared**: vòng đời bị giới hạn rõ ràng với truy cập đa luồng
|
||||
|
||||
### Value Layouts và VarHandle
|
||||
|
||||
- `ValueLayout` interface model values của basic data types với 3 attributes: Carrier Type, Endianness, Alignment
|
||||
- Sử dụng để obtain `VarHandle` instances từ `MemorySegment`
|
||||
- `MemoryLayout` interface mô tả memory segment contents một cách structured, giúp tránh manual offset computation
|
||||
- Giao diện `ValueLayout` mô hình hóa các giá trị của các kiểu dữ liệu cơ bản với 3 thuộc tính: Carrier Type, Endianness, Alignment
|
||||
- Sử dụng để lấy các thể hiện `VarHandle` từ `MemorySegment`
|
||||
- Giao diện `MemoryLayout` mô tả nội dung phân đoạn bộ nhớ một cách có cấu trúc, giúp tránh tính toán offset thủ công
|
||||
|
||||
**Foreign Function API - Interop với native libraries:**
|
||||
**Foreign Function API - Tương tác với thư viện native:**
|
||||
|
||||
### jextract Tool
|
||||
### Công cụ jextract
|
||||
|
||||
- Tool tự động generate Java bindings từ native library headers
|
||||
- Built upon FFM API, giúp mechanical generation thay vì manual coding
|
||||
- Ví dụ: call native quick sort function trực tiếp từ Java code
|
||||
- Công cụ tự động tạo các liên kết Java từ các header của thư viện native
|
||||
- Xây dựng trên nền tảng FFM API, giúp tạo mã tự động thay vì viết mã thủ công
|
||||
- Ví dụ: gọi hàm sắp xếp nhanh native trực tiếp từ mã Java
|
||||
|
||||
**Benefits của FFM API:**
|
||||
**Lợi ích của FFM API:**
|
||||
|
||||
- **Safe và efficient access** đến native memory với deterministic deallocation
|
||||
- **Direct và efficient access** đến native functions - 100% Java, không cần maintain native code
|
||||
- **Foundation for Project Panama** interoperability với tooling như jextract để generate layouts và handles
|
||||
- **Truy cập an toàn và hiệu quả** đến bộ nhớ native với khả năng giải phóng xác định
|
||||
- **Truy cập trực tiếp và hiệu quả** đến các hàm native - 100% Java, không cần bảo trì mã native
|
||||
- **Nền tảng cho Project Panama** khả năng tương tác với các công cụ như jextract để tạo layouts và handles
|
||||
|
||||
Đây là bước tiến quan trọng trong việc modernize Java's native interop capabilities, mang lại performance tốt hơn và developer experience được cải thiện đáng kể so với JNI truyền thống.
|
||||
Đây là bước tiến quan trọng trong việc hiện đại hóa khả năng tương tác native của Java, mang lại hiệu năng tốt hơn và trải nghiệm nhà phát triển được cải thiện đáng kể so với JNI truyền thống.
|
||||
|
||||
## [Ultimate Guide to Project Reactor, Thread-Locals and Context Propagation](https://4comprehension.com/ultimate-guide-to-project-reactor-thread-locals-and-context-propagation/)
|
||||
|
||||
Bài viết toàn diện từ 4comprehension.com giải thích chi tiết về một trong những thách thức phức tạp nhất khi làm việc với Project Reactor: context propagation và thread-local variables. Đây là vấn đề thường gặp trong reactive programming khi tasks có thể "nhảy" giữa các threads khác nhau, dẫn đến mất context quan trọng.
|
||||
Bài viết toàn diện từ 4comprehension.com giải thích chi tiết về một trong những thách thức phức tạp nhất khi làm việc với Project Reactor: truyền ngữ cảnh (context propagation) và biến cục bộ luồng (thread-local variables). Đây là vấn đề thường gặp trong lập trình phản ứng khi các tác vụ có thể "nhảy" giữa các luồng khác nhau, dẫn đến mất ngữ cảnh quan trọng.
|
||||
|
||||
**Vấn đề cốt lõi:**
|
||||
Trong traditional threading model, `ThreadLocal` variables hoạt động như một `Map<Thread, Value>` - mỗi thread có storage riêng biệt. Tuy nhiên trong reactive streams, execution có thể chuyển đổi giữa nhiều threads thông qua các operators như `publishOn()`, khiến ThreadLocal values bị mất.
|
||||
Trong mô hình luồng truyền thống, các biến `ThreadLocal` hoạt động như một `Map<Thread, Value>` - mỗi luồng có kho lưu trữ riêng biệt. Tuy nhiên trong luồng phản ứng, việc thực thi có thể chuyển đổi giữa nhiều luồng thông qua các toán tử như `publishOn()`, khiến các giá trị ThreadLocal bị mất.
|
||||
|
||||
**Các giải pháp được trình bày:**
|
||||
|
||||
### 1. Reactor's Context API
|
||||
|
||||
- Sử dụng `contextWrite()` để lưu trữ context values
|
||||
- Truy cập context thông qua `Mono.deferContextual()` trong `flatMap()`
|
||||
- Context được propagate tự động qua reactive chain
|
||||
- Sử dụng `contextWrite()` để lưu trữ các giá trị ngữ cảnh
|
||||
- Truy cập ngữ cảnh thông qua `Mono.deferContextual()` trong `flatMap()`
|
||||
- Ngữ cảnh được truyền tự động qua chuỗi phản ứng
|
||||
|
||||
### 2. Integration với ThreadLocal-based Tools
|
||||
### 2. Tích hợp với các công cụ dựa trên ThreadLocal
|
||||
|
||||
- Giải quyết vấn đề với Mapped Diagnostic Context (MDC) logging
|
||||
- Sử dụng execute-around pattern để restore ThreadLocal values
|
||||
- Tạo utility methods để giảm boilerplate code
|
||||
- Giải quyết vấn đề với ghi nhật ký Mapped Diagnostic Context (MDC)
|
||||
- Sử dụng mẫu execute-around để khôi phục các giá trị ThreadLocal
|
||||
- Tạo các phương thức tiện ích để giảm mã soạn sẵn
|
||||
|
||||
### 3. Accessing Context từ `doOnNext()`
|
||||
### 3. Truy cập ngữ cảnh từ `doOnNext()`
|
||||
|
||||
- Sử dụng `doOnEach()` thay vì `doOnNext()` để access context
|
||||
- Check signal type và extract context từ `Signal` object
|
||||
- Tạo wrapper methods cho clean code
|
||||
- Sử dụng `doOnEach()` thay vì `doOnNext()` để truy cập ngữ cảnh
|
||||
- Kiểm tra loại tín hiệu và trích xuất ngữ cảnh từ đối tượng `Signal`
|
||||
- Tạo các phương thức bao bọc cho mã sạch
|
||||
|
||||
### 4. Automatic Context Propagation
|
||||
### 4. Truyền ngữ cảnh tự động
|
||||
|
||||
- Enable với `Hooks.enableAutomaticContextPropagation()`
|
||||
- Register custom `ThreadLocalAccessor` cho automatic restoration
|
||||
- Trade-off giữa convenience và performance overhead
|
||||
- Kích hoạt với `Hooks.enableAutomaticContextPropagation()`
|
||||
- Đăng ký `ThreadLocalAccessor` tùy chỉnh cho việc khôi phục tự động
|
||||
- Đánh đổi giữa sự tiện lợi và chi phí hiệu năng
|
||||
|
||||
**Key takeaways:**
|
||||
**Những điểm chính:**
|
||||
|
||||
- Context propagation là challenge quan trọng trong reactive programming
|
||||
- Multiple approaches tùy thuộc vào use case cụ thể
|
||||
- Manual context management cho control tốt hơn, automatic approach cho convenience
|
||||
- Cần careful analysis để chọn approach phù hợp với performance requirements
|
||||
- Truyền ngữ cảnh là thách thức quan trọng trong lập trình phản ứng
|
||||
- Nhiều cách tiếp cận tùy thuộc vào trường hợp sử dụng cụ thể
|
||||
- Quản lý ngữ cảnh thủ công cho kiểm soát tốt hơn, cách tiếp cận tự động cho sự tiện lợi
|
||||
- Cần phân tích cẩn thận để chọn cách tiếp cận phù hợp với yêu cầu hiệu năng
|
||||
|
||||
## [JDK 24 G1/Parallel/Serial GC Changes](https://tschatzl.github.io/2025/04/01/jdk24-g1-serial-parallel-gc-changes.html)
|
||||
|
||||
Bài viết từ Thomas Schatzl (Oracle) tổng hợp những thay đổi quan trọng trong các garbage collectors của JDK 24. Mặc dù JDK 24 không có nhiều thay đổi breakthrough trong GC area, nhưng có những cải tiến đáng chú ý và roadmap hứa hẹn cho JDK 25.
|
||||
Bài viết từ Thomas Schatzl (Oracle) tổng hợp những thay đổi quan trọng trong các bộ thu gom rác của JDK 24. Mặc dù JDK 24 không có nhiều thay đổi đột phá trong lĩnh vực GC, nhưng có những cải tiến đáng chú ý và lộ trình hứa hẹn cho JDK 25.
|
||||
|
||||
**Parallel GC:**
|
||||
|
||||
- Loại bỏ một số synchronization không cần thiết trong evacuation loop (JDK-8269870)
|
||||
- Có thể giảm pause times trong một số tình huống cụ thể
|
||||
- Tập trung vào optimization cho hot path trong garbage collection
|
||||
- Loại bỏ một số đồng bộ hóa không cần thiết trong vòng lặp di tản (JDK-8269870)
|
||||
- Có thể giảm thời gian tạm dừng trong một số tình huống cụ thể
|
||||
- Tập trung vào tối ưu hóa cho đường dẫn nóng trong quá trình thu gom rác
|
||||
|
||||
**Serial GC:**
|
||||
|
||||
- Tiếp tục công việc cleanup và refactoring code base
|
||||
- Cải thiện maintainability và code quality
|
||||
- Tiếp tục công việc dọn dẹp và tái cấu trúc nền tảng mã
|
||||
- Cải thiện khả năng bảo trì và chất lượng mã
|
||||
- Chuẩn bị cho những thay đổi lớn hơn trong tương lai
|
||||
|
||||
**G1 GC - Những cải tiến quan trọng:**
|
||||
|
||||
### 1. Predictor Values Optimization (JDK-8343189)
|
||||
### 1. Tối ưu hóa giá trị dự đoán (JDK-8343189)
|
||||
|
||||
G1 sử dụng predictions để đạt được pause time goals, bao gồm cost của memory copying và reference updates. Trước đây, G1 sử dụng pre-baked values được xác định từ lâu trên máy SPARC "lớn" và không được update. Những values này rất conservative, khiến G1 mất khoảng 30 garbage collections để adapt với environment hiện tại.
|
||||
G1 sử dụng các dự đoán để đạt được mục tiêu thời gian tạm dừng, bao gồm chi phí của sao chép bộ nhớ và cập nhật tham chiếu. Trước đây, G1 sử dụng các giá trị được chuẩn bị sẵn được xác định từ lâu trên máy SPARC "lớn" và không được cập nhật. Những giá trị này rất bảo thủ, khiến G1 mất khoảng 30 lần thu gom rác để thích nghi với môi trường hiện tại.
|
||||
|
||||
Thay đổi mới cho phép actual values ghi đè trực tiếp pre-baked predictor values thay vì cộng dồn, giúp G1 adapt nhanh hơn với application và environment. Trade-off là có thể có nhiều pause time overshoots trong những garbage collections đầu tiên.
|
||||
Thay đổi mới cho phép các giá trị thực tế ghi đè trực tiếp lên các giá trị dự đoán được chuẩn bị sẵn thay vì cộng dồn, giúp G1 thích nghi nhanh hơn với ứng dụng và môi trường. Sự đánh đổi là có thể có nhiều lần vượt quá thời gian tạm dừng trong những lần thu gom rác đầu tiên.
|
||||
|
||||
### 2. Young Generation Remembered Sets Optimization (JDK-8336086)
|
||||
### 2. Tối ưu hóa bộ nhớ tập hợp thế hệ trẻ (JDK-8336086)
|
||||
|
||||
- G1 giờ quản lý remembered sets cho toàn bộ young generation như một single unit
|
||||
- Loại bỏ duplicates và tiết kiệm memory đáng kể
|
||||
- Giảm số lượng remembered set entries, từ đó giảm nhẹ garbage collection pauses
|
||||
- G1 giờ quản lý các tập hợp được ghi nhớ cho toàn bộ thế hệ trẻ như một đơn vị duy nhất
|
||||
- Loại bỏ các bản sao và tiết kiệm bộ nhớ đáng kể
|
||||
- Giảm số lượng mục trong tập hợp được ghi nhớ, từ đó giảm nhẹ thời gian tạm dừng thu gom rác
|
||||
- Kế thừa ý tưởng từ JDK 23 với những cải tiến bổ sung
|
||||
|
||||
**Roadmap JDK 25 - Những thay đổi lớn sắp tới:**
|
||||
**Lộ trình JDK 25 - Những thay đổi lớn sắp tới:**
|
||||
|
||||
### Write Barrier Overhaul
|
||||
### Cải tổ rào chắn ghi
|
||||
|
||||
- Một trong những thay đổi lớn nhất từ trước đến nay trong interaction giữa application và G1
|
||||
- Write barriers được thực thi cho mọi reference write có impact lớn đến application throughput
|
||||
- Dự kiến cải thiện throughput lên đến 10%, pause times ngắn hơn, code generation tốt hơn
|
||||
- Đang được chuẩn bị thành JEP để integrate trong những tháng tới
|
||||
- Một trong những thay đổi lớn nhất từ trước đến nay trong tương tác giữa ứng dụng và G1
|
||||
- Rào chắn ghi được thực thi cho mọi thao tác ghi tham chiếu có tác động lớn đến thông lượng ứng dụng
|
||||
- Dự kiến cải thiện thông lượng lên đến 10%, thời gian tạm dừng ngắn hơn, tạo mã tốt hơn
|
||||
- Đang được chuẩn bị thành JEP để tích hợp trong những tháng tới
|
||||
|
||||
### Old Generation Remembered Sets Merging (JDK-8343782)
|
||||
### Hợp nhất tập hợp được ghi nhớ của thế hệ cũ (JDK-8343782)
|
||||
|
||||
- Mở rộng ý tưởng merging remembered sets cho old generation regions
|
||||
- Tiết kiệm native memory còn lớn hơn nữa
|
||||
- Đã được integrate trong JDK 25
|
||||
- Mở rộng ý tưởng hợp nhất các tập hợp được ghi nhớ cho các vùng thế hệ cũ
|
||||
- Tiết kiệm bộ nhớ native còn lớn hơn nữa
|
||||
- Đã được tích hợp trong JDK 25
|
||||
|
||||
**Các discussions và projects đang diễn ra:**
|
||||
**Các thảo luận và dự án đang diễn ra:**
|
||||
|
||||
- **Automatic Heap Sizing**: Project mang tính năng tương tự ZGC đến stop-the-world collectors (đóng góp từ Microsoft và Google)
|
||||
- **G1 as True Default Collector**: Thảo luận về việc làm G1 thành default collector thay vì Serial GC trong môi trường nhỏ, vì G1 đang cho thấy performance tương đương hoặc tốt hơn Serial GC trong hầu hết metrics
|
||||
- **Automatic Heap Sizing**: Dự án mang tính năng tương tự ZGC đến các bộ thu gom dừng-thế-giới (đóng góp từ Microsoft và Google)
|
||||
- **G1 as True Default Collector**: Thảo luận về việc làm G1 thành bộ thu gom mặc định thay vì Serial GC trong môi trường nhỏ, vì G1 đang cho thấy hiệu năng tương đương hoặc tốt hơn Serial GC trong hầu hết các chỉ số
|
||||
|
||||
JDK 24 tập trung vào foundation improvements và optimization, đặt nền móng cho những breakthrough lớn hơn trong JDK 25, đặc biệt là write barrier overhaul hứa hẹn mang lại performance gains đáng kể.
|
||||
JDK 24 tập trung vào cải tiến nền tảng và tối ưu hóa, đặt nền móng cho những đột phá lớn hơn trong JDK 25, đặc biệt là cải tổ rào chắn ghi hứa hẹn mang lại những cải thiện hiệu năng đáng kể.
|
||||
|
||||
## [Making Makefiles for fun and profit](https://dev.to/aws/making-makefiles-for-fun-and-profit-kl6)
|
||||
|
||||
Bài viết từ AWS Developer Advocate Darko Mesaroš khám phá lại Makefiles - công cụ build automation 48 tuổi nhưng vẫn cực kỳ hữu ích trong development workflows hiện đại. Mặc dù Make được tạo ra từ năm 1976 để giải quyết vấn đề quên compile files trong development, ngày nay nó có thể làm được nhiều hơn thế rất nhiều.
|
||||
Bài viết từ Chuyên gia Ủng hộ Nhà phát triển AWS Darko Mesaroš khám phá lại Makefiles - công cụ tự động hóa xây dựng 48 tuổi nhưng vẫn cực kỳ hữu ích trong quy trình làm việc phát triển hiện đại. Mặc dù Make được tạo ra từ năm 1976 để giải quyết vấn đề quên biên dịch các tệp trong quá trình phát triển, ngày nay nó có thể làm được nhiều hơn thế rất nhiều.
|
||||
|
||||
**Tại sao Makefiles vẫn relevant:**
|
||||
**Tại sao Makefiles vẫn phù hợp:**
|
||||
|
||||
- **Tự động hóa các task lặp đi lặp lại**: Thay vì nhớ các commands phức tạp, chỉ cần `make deploy` hoặc `make clean`
|
||||
- **Dependency management thông minh**: Chỉ rebuild những parts thực sự cần thiết
|
||||
- **Standardization**: Tạo consistent workflows cho team development
|
||||
- **Cross-platform compatibility**: Hoạt động trên Unix, Linux, macOS và Windows
|
||||
- **Tự động hóa các tác vụ lặp đi lặp lại**: Thay vì nhớ các lệnh phức tạp, chỉ cần `make deploy` hoặc `make clean`
|
||||
- **Quản lý phụ thuộc thông minh**: Chỉ xây dựng lại những phần thực sự cần thiết
|
||||
- **Tiêu chuẩn hóa**: Tạo quy trình làm việc nhất quán cho nhóm phát triển
|
||||
- **Tương thích đa nền tảng**: Hoạt động trên Unix, Linux, macOS và Windows
|
||||
|
||||
**Các use cases thực tế được trình bày:**
|
||||
**Các trường hợp sử dụng thực tế được trình bày:**
|
||||
|
||||
### 1. Terraform Automation
|
||||
### 1. Tự động hóa Terraform
|
||||
|
||||
- Tự động switching environments và workspace management
|
||||
- Safety checks trước khi chạy `terraform destroy` với warnings đầy đủ
|
||||
- Environment variable management cho different deployment targets
|
||||
- Tự động chuyển đổi môi trường và quản lý không gian làm việc
|
||||
- Kiểm tra an toàn trước khi chạy `terraform destroy` với cảnh báo đầy đủ
|
||||
- Quản lý biến môi trường cho các đích triển khai khác nhau
|
||||
|
||||
### 2. Local Development Environment Setup
|
||||
### 2. Thiết lập môi trường phát triển cục bộ
|
||||
|
||||
- Automated Docker container spinning cho databases (Postgres, Redis)
|
||||
- Dynamic password generation và environment file creation
|
||||
- Cargo lambda development với proper environment variable injection
|
||||
- One-command setup cho complex development stacks
|
||||
- Tự động khởi chạy container Docker cho các cơ sở dữ liệu (Postgres, Redis)
|
||||
- Tạo mật khẩu động và tạo tệp môi trường
|
||||
- Phát triển Cargo lambda với tiêm biến môi trường thích hợp
|
||||
- Thiết lập bằng một lệnh cho các ngăn xếp phát triển phức tạp
|
||||
|
||||
### 3. AWS CDK Projects
|
||||
### 3. Dự án AWS CDK
|
||||
|
||||
- Multi-language build automation (TypeScript + Rust)
|
||||
- Separate deployment commands cho individual stacks vs. complete deployment
|
||||
- Local testing environment với DynamoDB Local integration
|
||||
- Comprehensive cleanup commands
|
||||
- Tự động hóa xây dựng đa ngôn ngữ (TypeScript + Rust)
|
||||
- Các lệnh triển khai riêng biệt cho các ngăn xếp riêng lẻ so với triển khai hoàn chỉnh
|
||||
- Môi trường kiểm thử cục bộ với tích hợp DynamoDB Local
|
||||
- Các lệnh dọn dẹp toàn diện
|
||||
|
||||
### 4. Static Website Deployment
|
||||
### 4. Triển khai trang web tĩnh
|
||||
|
||||
- Automated S3 upload với proper content-type headers
|
||||
- AWS Amplify deployment triggering
|
||||
- Dynamic AWS resource ID resolution
|
||||
- Tự động tải lên S3 với các tiêu đề content-type thích hợp
|
||||
- Kích hoạt triển khai AWS Amplify
|
||||
- Phân giải ID tài nguyên AWS động
|
||||
|
||||
**Modern approach với AI assistance:**
|
||||
**Cách tiếp cận hiện đại với sự hỗ trợ của AI:**
|
||||
|
||||
Bài viết showcase cách sử dụng Amazon Q Developer CLI để generate sophisticated Makefiles without cần phải master Make's byzantine syntax. AI tool có thể:
|
||||
Bài viết trình diễn cách sử dụng Amazon Q Developer CLI để tạo ra các Makefiles phức tạp mà không cần phải thành thạo cú pháp phức tạp của Make. Công cụ AI có thể:
|
||||
|
||||
- Tự động detect project structure và generate appropriate targets
|
||||
- Dynamic resource ID resolution (như Amplify app IDs)
|
||||
- Environment-specific configuration management
|
||||
- Best practices implementation cho different project types
|
||||
- Tự động phát hiện cấu trúc dự án và tạo các mục tiêu thích hợp
|
||||
- Phân giải ID tài nguyên động (như ID ứng dụng Amplify)
|
||||
- Quản lý cấu hình đặc thù cho từng môi trường
|
||||
- Triển khai các phương pháp tốt nhất cho các loại dự án khác nhau
|
||||
|
||||
**Key takeaways cho developers:**
|
||||
**Những điểm chính cho nhà phát triển:**
|
||||
|
||||
- Makefiles không chỉ dành cho C programming - chúng powerful cho bất kỳ automation workflow nào
|
||||
- Modern AI tools giúp overcome learning curve của Make syntax
|
||||
- Investment vào Makefile setup pays off long-term trong team productivity
|
||||
- Always remember `.PHONY` targets để avoid conflicts với actual files
|
||||
- Makefiles không chỉ dành cho lập trình C - chúng mạnh mẽ cho bất kỳ quy trình tự động hóa nào
|
||||
- Các công cụ AI hiện đại giúp vượt qua đường cong học tập của cú pháp Make
|
||||
- Đầu tư vào thiết lập Makefile mang lại lợi ích dài hạn trong năng suất của nhóm
|
||||
- Luôn nhớ các mục tiêu `.PHONY` để tránh xung đột với các tệp thực tế
|
||||
|
||||
Đây là reminder tuyệt vời rằng sometimes old tools are still the best tools, đặc biệt khi được enhance bởi modern AI assistance để lower barrier to entry.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user