#236 - Virtual Threads: Nền tảng mới cho các ứng dụng Java
Trong số này, chúng ta cùng tìm hiểu về:
Event Loop, Callbacks, Promises, Async/Await trong JavaScript
Cách Coupang xử lý lượng traffic khổng lồ với Cache
Virtual Threads trong Java 19
Lời giải bài Add Bold Tag in String
Ngoài ra các bạn vẫn có thể tiếp tục đặt mua ấn phẩm Dijkstra tập 2 tại đây.
News
Mark Zuckerberg says Meta will freeze hiring and cut costs
Sau một thập kỷ tăng trưởng bùng nổ, Meta (Facebook) hiện đang có kế hoạch cắt giảm nhân sự. Mark Zuckerberg đã công bố một kế hoạch đóng băng việc tuyển dụng và tái cơ cấu một số nhóm trong công ty tại một buổi all-hand nội bộ của công ty.
Cùng tìm hiểu những điểm nổi bật của Go trong 4 năm qua.
PostgreSQL: PostgreSQL 15 RC 1 Released!
Các bạn đã có thể tải và dùng thử phiên bản release candidate của PostgreSQL 15. Nếu không có vấn đề lớn nào xảy ra thì phiên bản chính thức của PostgreSQL 15 sẽ được phát hành vào ngày 15 tháng 10.
Webinar
Trong bài talk sau, tác giả đưa ra những gợi ý về cách tối ưu hiệu năng trên PostgreSQL.
Những bài viết hay
Lessons learned from handling massive traffic with cache
(by quangle)
Năm 2021, số lượng người dùng của ứng dụng TMĐT Coupang đã tăng 21%. Để đảm bảo điều phối thông tin dữ liệu đến cho khách hàng luôn nhanh chóng và có độ tin cậy cao, đội ngũ kỹ sư của Coupang đã xây dựng một hệ thống core microservice. Một trong những thử thách gặp phải khi triển khai nằm ở tầng cache của core services (được tổ chức thành 2 layers: read-through và real-time với mỗi layer có khoảng 60 - 100 nodes và xử lý gần 100 triệu request mỗi phút) được nhóm tác giả tóm tắt qua 4 bài học như sau:
1. Managing partial cache node failure: Dù có cơ chế circuit-breaker để cô lập node lỗi xảy ra trong cụm cluster nhưng việc một node lỗi chỉ gây ảnh hưởng rất ít đến tổng quan traffic, dẫn đến không đủ thông tin hoặc mất đến vài chục giây đến vài phút để detect được. Họ chọn giải pháp theo dõi tốc độ kết nối TCP, với thời gian phản hồi trung bình của lớp cache chỉ là milliseconds, những kết nối nào không phản hồi trong 1s sẽ bị đánh dấu có vấn đề và cô lập khỏi cluster.
2. Quickly recovering failed nodes: Khi một node fail, nó sẽ được khôi phục bằng cách full-sync dữ liệu từ master-node, trong lúc đó, những write requests đến master-node sẽ được lưu vào buffer. Tuy nhiên, vì traffic tăng cao vượt ngưỡng xử lý của buffer làm cho quá trình full-sync bị gặp lỗi, để chữa cháy, họ chọn cách tăng buffer size nhưng chỉ là giải pháp ngắn hạn. Khi đào sâu, đội ngũ phát hiện khi các replicas mới được sinh ra trong quá trình full-sync đang cung cấp empty data cho core service, dẫn đến core service mặc định cụm cache không có dữ liệu phù hợp sẽ đi lấy data từ db source và ghi lại vào master-node làm cho lệnh ghi tăng nhanh và tràn buffer. Giải pháp triệt để sẽ đi block traffic đến những replicas bị lỗi.
3. Balancing traffic between nodes: Thử thách thứ 3 nằm ở bài toán mất cân bằng tải giữa các node trong cụm cache. Thay vì hướng traffic đến các node cố định hoặc các node có thời gian phản hồi nhanh nhất, đội ngũ kỹ sư sẽ tổ chức việc lựa chọn một node ngẫu nhiên để hứng request để điều phối đồng đều giữa các cụm cache.
4. Handling traffic spikes using local cache: Trước đây, khi traffic tăng đột biến, để đảm bảo tính ổn định cho ứng dụng thì giải pháp tăng dung lượng lưu trữ server lên gấp 3 lần thường được lựa chọn nhưng việc này không tối ưu và rất tốn kém. Sau khi đánh giá, nhóm kỹ sư đã lựa chọn local-cache để giải quyết thử thách trên.
Để tìm hiểu chi tiết hơn về từng bài học kinh nghiệm mà nhóm kỹ sư tại Coupang đã đúc kết, mời bạn đọc cùng tham khảo thêm bài viết.
Understanding the Event Loop, Callbacks, Promises, and Async/Await in JavaScript
(by ndaadn & nhij)
JavaScript được thiết kế là một ngôn ngữ đơn luồng với mô hình xử lý đồng bộ. Một chương trình JavaScript sẽ được xử lý tuần tự các câu lệnh và chỉ xử lý một tác vụ tại một thời điểm. Điều này dẫn đến khi xử lý một tác vụ mà thời gian hoàn thành không dễ xác định, trình duyệt sẽ không thể xử lý bất kỳ một tương tác nào khác từ người dùng, ví dụ như nhấn nhập dữ liệu hay nhấn nút. Trạng thái này thường được gọi là blocking.
Để giải quyết vấn đề blocking, trình duyệt cung cấp các Web APIs để các chương trình có thể thực hiện các tác vụ bất đồng bộ, mở ra khả năng chạy song song các tác vụ trên trình duyệt. Giờ đây, người dùng vẫn có thể tiếp tục tương tác với trang web trong khi các tác vụ bất đồng bộ khác đang được xử lý.
Trong bài viết này, bạn đọc sẽ được tìm hiểu về cách sơ khai để xử lý các tác vụ bất đồng bộ sử dụng Callback, sau đó là Promises và mới nhất là async/await. Ngoài ra, để bạn đọc dễ hiểu hơn về các cách triển khai xử lý bất đồng bộ, trong bài viết cũng giải thích các thành phần cơ bản trong của JavaScript như event loop, stack và queue.
Virtual Threads: New Foundations for High-Scale Java Applications
(by lpv)
Virtual Threads là một tính năng mới sẽ bắt đầu được sử dụng kể từ Java 19. Đây có thể coi là một trong những thay đổi lớn nhất của Java suốt một thời gian dài. Virtual threads sẽ thay đổi cách Java runtime tương tác với hệ điều hành bên dưới, loại bỏ một cách đáng kể những trở ngại khi scale một ứng dụng Java, nhưng sẽ không thay đổi quá nhiều về cách xây dựng các ứng dụng. Gần như sẽ không có các API mới, các virtual threads vẫn sẽ hoạt động giống như thread mà chúng ta biết. Mời các bạn cùng đọc bài viết sau để tìm hiểu xem làm thế nào mà virtual threads lại có thể tăng khả năng scale của Java.
Góc Lập Trình
Đề ra tuần này: Zigzag Conversion
Chuỗi "PAYPALISHIRING" được viết dưới dạng zigzag với một số lượng hàng cho trước như sau:
Ví dụ: số hàng cho trước là 4
P I N
A L S I G
Y A H R
P I
Khi đọc cách viết trên theo hàng ngang, ta được kết quả “PINALSIGYAHRPI”.
Yêu cầu viết một hàm nhận vào một chuỗi “s” và số lượng hàng “rows” cho trước, trả về kết quả khi đọc cách viết zigzag tương ứng theo hàng ngang.
Lời giải đề bài tuần trước: Add Bold Tag in String
(by ndaadn)
Ta có thể duyệt qua chuỗi s để tìm vị trí xuất hiện của các từ “word” trong array “dict” cho trước một cách đơn giản. Ngoài ra, đề bài yêu cầu nếu 2 substring chồng lên nhau thì ta cần phải gộp chúng lại với chỉ một cặp bold tag.
Để giải quyết yêu cầu này, ta có thể sử dụng một mảng “mask” để đánh dấu vị trí xuất hiện của các từ word trong chuỗi s. Sau đó duyệt qua mảng mask này và thêm các cặp bold tag tương ứng.
Ví dụ:
- Với Input: s = “abcxyz123”, words = [“abc”, “123”] => mask = 111000111 => output = “<b>abc</b>xyz<b>123</b>”
- Với Input: s = “aaabbcc”, words = ["aaa","aab","bc"] => mask = 1111110 => output = “<b>aaabbc</b>c”
Độ phức tạp thuật toán là O(N*M*k) với N là độ dài chuỗi s, M là độ dài mảng dict, k là độ dài trung bình các phần tử trong mảng dict.
Code & Tools
Airflow 2.4.0 - Airflow 2.4.0 mới được ra mắt với những thay đổi đáng kể như giới thiệu về Data-aware scheduling, cải tiến Dynamic Task Mapping, giảm thiểu conflict với ExternalPythonOperator, ...
Skyplane - Công cụ open-source giúp transfer data nhanh hơn trên các nền tảng Cloud
Feedback
Bạn đánh giá nội dung số newsletter này thế nào?
(1 = Rất tệ / 5 = Rất tốt)
(Việc đánh giá của các bạn là rất quan trọng, sẽ giúp chúng tôi liên tục cải thiện nội dung newsletter tốt hơn)
Grokking mang lại cho các bạn những kiến thức mới mẻ và hữu ích thông qua:
Tech Talk: Là một hoạt động thường xuyên của Grokking từ những ngày đầu thành lập. Tại đây các diễn giả chia sẻ kiến thức xoay quanh Computer Science và Software Engineer. Các buổi Tech Talk đều được record và upload lên kênh youtube của Grokking.
Grokking Knowledge Graph: Tập hợp những nguồn kiến thức phong phú với hơn 1000 bài viết chọn lọc, các đầu sách, khóa học, v.v… Các bài viết đều được gán nhãn để giúp bạn đọc dễ dàng tìm kiếm.
Webinar: Là chương trình kết nối các kỹ sư Việt Nam và các kỹ sư đang làm việc tại các công ty công nghệ hàng đầu thế giới.
Dijkstra: Một ấn phẩm được xuất bản bởi các thành viên của Grokking. Với những bài viết đào sâu vào kỹ thuật và kiến thức khoa học máy tính.
Kipalog: Nền tảng chia sẻ kiến thức dành cho các lập trình viên.
Newsletter: Những bài viết hay về công nghệ sẽ được gửi tới bạn hàng tuần qua email.
Chúc các bạn sẽ tìm được nhiều điều mới mẻ khi đến với Grokking và xin hẹn gặp lại các bạn vào tuần sau.
Quotes
“C is memory with syntactic sugar.”
— Dennis Kubes