🏋 Top Posts

👉 Git Rebase vs Git Merge và cuộc tranh cãi không có hồi kết - Đàm đạo về Git

Git rebase và merge đều có chung một nhiệm vụ đó là hợp nhất các branch (nhánh) lại với nhau, nhưng có một sự khác biệt rõ ràng đó chính là lịch sử các commit sau khi bạn hợp nhất nhánh này đến nhánh khác.

👉 Full-text search with RediSearch Nodejs

RediSearch là một công cụ full-text search, có nghĩa là bạn có thể sử dụng thay cho elasticsearch nếu muốn, bài viết này giúp bạn hiểu sâu hơn về cách thực hiện tìm kiếm trong database và những ưu điểm khi sử dụng redisearch.

👉 Cách thiết kế Database đáp ứng truy xuất cao lên đến 1 triệu

Lượng dữ liệu mới được thêm vào trong một bảng duy nhất đạt 250.000 mỗi ngày! Số lượng yêu cầu mỗi giây trong thời kỳ cao điểm lên tới 10.000! Con số thật là ấn tượng. Shopee có thể đã vượt qua con số đó tại thời điểm tôi đang viết bài này.

🏋 New Posts

👉 Web App, Mobile App TRYBUY chính thức ra mắt (FE: vite, react, BE: Nestjs, Aws...)

TRYBUY - (FE: Vite, React, React Native | BE: NestJS, TypeORM, Redis, Elasticsearch, AWS...), một cái tên có lẽ sẽ sớm trở nên quen thuộc. Đây là một dự án với ý tưởng đơn giản nhưng cực kỳ thực tế: xây dựng một sàn thương mại điện tử, một mạng xã hội dành riêng cho anh em lập trình viên chúng ta. Nơi đây sẽ là "chợ" để mua bán, trao đổi những món "vũ khí" đã làm nên tên tuổi của bạn: từ chiếc PC, con Laptop đã cùng bạn qua bao mùa deadline, cho đến cái bàn phím cơ gõ "sướng" cả tay.

👉 [Chuyện cuối tuần #17] Người rời đi, nhưng di sản là code của AI... Người ở lại thở dài...

Vài hôm trước có một cậu em rời TEAM vì một số lý do. Thật ra có hai lý do có thể ĐÚNG đó là TIỀN và MÔI TRƯỜNG. Nhưng câu chuyện không phải đề cập ở đó mà là về những task của bạn ấy được xây dựng bởi AI.

👉 Trải nghiệm backend khi Optimizing Connection Pools - Tối ưu kết nối Database chuyên sâu - Phiên bản Business

Mở kết nối database bao nhiêu cho hợp lý? Có công thức này nghe có vẻ hợp lý, ok được rồi, chúng ta sẽ xem xét việc quản lý connect trong api cũng như tiết kiệm nhất có thể cho doanh nghiệp. Bắt tay thử nghiệm với các ngôn ngữ như JAVA và GO...

👉 Solution Architecture xxxx_CHAT: Tối ưu dữ liệu MYSQL trong chế độ Chat GROUPs (10.000 members)

Hãy nhìn vào thực tế một Group có 10.000 thành viên thì việc khi userX gửi một tin nhắn đến GROUP này, lúc này giả sử có 80% đang online giờ cao điểm có nghĩa rằng một tin nhắn sẽ được lưu vào box của mỗi thành viên, đồng nghĩa với việc là lưu 8.000 lần với một tin nhắn đến. Vậy có cách nào giảm I/O trong MySQL hay không nếu bạn là một SA.

👉 Hành trình tối ưu MySQL của Lập Trình Viên A cho dự án B - Chi tiết

Thực tế nếu như chúng ta là A, bắt đầu nhận một nhiệm vụ mới với một dự án B. Trong đó B sử dụng nhiều công nghệ trong đó và trong đó có sử dụng MySQL để làm dữ liệu tập trung cho ứng dụng. Giả sử, khi sử dụng prometheus và grafana thì chúng ta thấy hiệu suất truy vấn MySQL cực kỳ chậm, vậy A sẽ bắt đầu lộ trình tối ưu như thế nào? Nếu tôi là A thì sẽ như thế này?

👉 Khi user LOGIN với Tiktok, Instagram... Dữ liệu hàng tỷ được PULL những vẫn mượt mà | CỰU CHIẾN BINH ĐI QUA GIÔNG BÃO CÔNG NGHỆ

Sau khi một user login thành công, để người dùng có sự trải nghiệm mượt mà (như PULL list Friends, Groups) thì các lập trình viên luôn phải tối ưu hiệu suất thông qua nhiều cách, trong đó thuật toán mà họ trải nghiệm đóng góp rất quan trọng cho việc cải thiện song song với đó là cơ sở hạ tầng luôn hỗ trợ đắc lực. Hôm nay chúng ta nói về điều đó.

👉 Solution Architecture xxxx_CHAT: User X login, làm sao Y, Z biết X đang Online? Dữ liệu chat trong group được tổ chức như thế nào?

Trong kỹ thuật phát triển Application đặc biệt là app về realtime giống như Messenger, WhatsApp, Line... Thì việc duy trình trạng thái online, offline giữa các User (Friends) hay Group (Chat Group) luôn đòi hỏi tính nhất quán MẠNH là một vấn đề kỹ thuật khó giải quyết trong phát triển app CHAT...

👉 Dự án đã CŨ - Tái hiện cấu trúc CODE từ MVC -> FEAT -> DDD Go Backend

Dự án MVC của chúng tôi vẫn còn hoạt động dù đã triển khai khá lâu, nhưng người dùng không hề biết nội tình trong đó chỉ có chúng tôi (be) mới hiểu được sự nghiêm trọng ần mình ở sau cấu trúc này

👉 JAVA: Đã 30 năm và hoài niệm về hành trình từ mức cơ bản

Có những thứ đơn giản nhưng lại bị bỏ quên để đi tìm những thứ rất phức tạp để học tập và giải quyết NHƯNG lại không bao giờ gặp hoặc ít những vấn đề đó trong cuộc sống.

👉 Series: 10 kịch bản đầu tiên về tối ưu hoá hiệu suất với vị trí Backend (Phần 1 - 10 Sessions)

Trong khi làm việc hay phỏng vấn thì chúng ta sẽ bắt gặp những câu hỏi như, bạn đã tối ưu hệ thống của bạn bao giờ chưa? Nếu có thì tối ưu ở cấp độ (ngôn ngữ hay tham gia stack hệ thống) nào? Và làm như thế nào? Thì đây là câu trả lời cho những bạn gặp trường hợp này.

👉 Tôi sử dụng Redis để lưu thông tin Cart( giỏ hàng) nhưng String hay Hash thì tốt hơn? Tình huống như sau...

Thông thường các lập trình viên sử dụng Redis để lưu thông tin giỏ hàng của khách hàng. Không có gì bàn cãi ở đây, vì giỏ hàng theo thống kê của hệ thống luôn có tỷ lệ truy cập xác xuất luôn cao, vì vậy tránh tình trạng query vào điểm cuối của dữ liệu thì dùng redis sẽ cung cấp và đáp ứng như cầu này. Nhưng việc lưu trữ nó như thế nào cho đúng? Chúng ta ta sẽ xem kịch bản sau đây.

👉 Phân tích chuyên sâu về chức năng Upload Large File: Đến lượt Backend nhờ vả ANH EM FrontEnd

Khi upload một File chúng tôi nhận thấy với 100Mb thì mất 5 giây, rất nhanh sau đó commit và đưa vào version Prod. Nhưng một sự việc đã xảy ra đó là khách hàng VIP muốn upload File có dung lượng 1Gb. Như vậy theo logic thì 5 * 10 = 50 seconds mới có thể upload được File. Sự phàn nàn là điều chính xác

👉 Phân tích chuyên sâu về chức năng đăng nhập: Quy trình thiết kế dữ liệu, xác minh bảo mật và phòng chống MA CÔ | CỰU CHIẾN BINH ĐI QUA GIÔNG BÃO CÔNG NGHỆ

Nhìn vào thì tôi đoán rằng ai cũng rõ vì sao lại sử dụng đúng không? Nó cho chúng ta biết? Thằng nào vào nhà mình, đi bằng cửa nào? đi bằng phương tiện gì? Lúc mấy giờ và để lại dấu vân tay hay không? Điều đó rất tốt cho quá trình lấy dữ liệu để cung cấp cho police điều tra phá án rằng: `Thằng nào vào nhà mình thăm dò, mà không phải là hợp pháp?

👉 Cung cấp câu hỏi phỏng vấn: Bạn đọc tuyển dụng của Bank này, bạn thấy muốn vượt qua thì phải làm gì đúng không?

Bạn đã đọc và thấy đúng không? Chính xác là những nhà tuyển dụng họ rất quan tâm đến việc triển khai nhiều `transaction` cùng một lúc. Vì vậy trọng tâm là bạn muốn apply vào vị trí đó thì nếu như có kịch bản đó xảy ra thì bạn sẽ làm gì?

👉 4 Mức Độ Cô Lập Theo Chuẩn SQL (và MySQL hỗ trợ tất cả!) | CỰU CHIẾN BINH ĐI QUA GIÔNG BÃO CÔNG NGHỆ

Để đơn giản cho việc hiểu về MVCC thì có một kịch bản như sau, cùng một thời điểm thì sẽ xảy ra hiện tượng gì? User X đang xem giá và số lượng sản phẩm Z còn hay không trên hệ thống YYYY, User Y đang order sản phẩm Z và giảm số lượng tồn kho trên hệ thông YYYY...

👉 [JAVA - Excel] Tăng hiệu suất x lần import/export với cách truyền thống: CỰU CHIẾN BINH ĐI QUA GIÔNG BÃO CÔNG NGHỆ

OK xem như đã nắm được kịch bản với 1.000.000 rows và khoảng 50M. Bắt tay vào. NHIỆM VỤ CHÍNH đó là chúng ta phải cải thiện từ `2 phút theo cách thông thường, chúng ta phải giảm xuống 10 seconds`, sau đó sẽ cải thiện tiếp theo cho từng version.

👉 [Kafka - RabbitMQ] Message Queue: CỰU CHIẾN BINH ĐI QUA GIÔNG BÃO CÔNG NGHỆ

Lúc đầu hệ thống triển khai chấm công trên `10.000 công nhân`. Hiện tại API đã cung cấp cho nhiều dịch vụ khác đến lấy dữ liệu của trung tâm. Tôi có thể tóm tắt như sau và hy vọng bạn sẽ hiểu được bản chất của MQ cụ thể là Kafka, RabbitMQ.

👉 API timeline: RPC vs GRPC - Tản mạn ngày xa xưa

RPC vs GRPC: Mặc dù hơi thô nhưng nó đúng là vậy, muốn hiểu về nguyên lý bom ba càng thì hay hỏi các CỰU CHIẾN BINH là có thể hiểu rõ nhất, có đúng không?

👉 [Chuyện cuối tuần #16] - 100% là ai cũng có thể trở thành LẬP TRÌNH VIÊN. Kẻ yếu hay phàn nàn về môi trường...

Kẻ yếu phàn nàn về môi trường, kẻ mạnh tự thay đổi bản thân. Nó đơn giản tới mức hầu như tôi không thể nào áp dụng đúng 100%.

👉 Phỏng vấn GO Backend: Nếu MySQL gặp sự cố trong khi thực hiện transaction, điều gì sẽ xảy ra khi nó được khôi phục (restored)?

Phỏng vấn GO Backend: Hôm nay quả là một ngày thật tuyệt, tôi đã nhận được một câu trả lời từ một anh chàng và có thể nói rằng với câu phỏng vấn "Nếu MySQL gặp sự cố trong khi thực hiện transaction" thì anh ấy đã làm tốt hơn tôi rất nhiều.

👉 MySQL: Tình tờ TEAM đi mua sắm là lụm được bí kíp Table lưu trữ và truy vấn nhanh với hàng trăm triệu dữ liệu

Điều cần làm lúc này là gì? Hôm nay chúng ta sẽ tham khảo một thủ thuật của những người đi trước, họ không có nguồn lực, không có chi phí cao như ngày nay. Nhưng đổi lại họ đã tìm cách vượt qua điều này như thế nào, chúng ta cùng xem xét.

👉 [Chuyện cuối tuần #15] - Sau 6 năm tôi từ bỏ GraphQL, cuộc cãi vã nảy lửa..

Với GraphQL. Tôi cảm thấy đã đủ mệt mỏi với những làn danh giới giữa FE và BE. Việc tự build linh kiện máy tính, bắt buộc bạn phải là người chuyên nghiệp về khía cạnh đó. Hãy trở thành người chơi GAME xuất sắc, thay vì trở thành người mua máy tính chuyên nghiệp, nếu làm tốt bạn là con người tuyệt vời.

👉 [Chuyện cuối tuần #14] - 2025 năm nay chúng tôi sẽ tốt nghiệp và tôi đã sẵn sàng.

Có bạn comment rằng, `lớp chúng tôi 70% không xin được việc làm`. Uhm, tôi nghĩ rằng còn lại 30% là có nghĩa rằng sẽ có việc làm NHƯNG đi đúng ngành thì chắc 20% còn lại 10% là sẽ chọn không đúng NGÀNH.

👉 Hệ thống ĐỒNG THỜI CAO là phải đạt bao nhiêu? QPS = 1.000.000 req/second đúng không?

Hôm nay tôi và các đại ca bàn luận về `high concurrency` và nhân tiện trong bài viết này tôi cũng nói thêm về một số trường hợp xử lý khi bạn bị mặc kẹt trong vấn đề này, thông qua một số biện pháp của một số anh em backend

👉 Cải thiện hiệu suất SELECT COUNT(*) từ 4,2s xuống 0.002s với 13 triệu dữ liệu có đánh đổi gì không?

Tôi có hai table mỗi table có 13 triệu records. Và vẫn là câu lệnh SELECT COUNT(*) nhưng một table mất 4.2s và một table mất 0.002s... Vì sao? Chúng ta sẽ đi tìm hiểu

👉 Với 13 triệu dữ liệu và 4Gb chúng tôi cải thiện tìm kiếm từ 6s còn 1s trong MYSQL không sử dụng ElasticSearch

Đây là một kịch bản có thật được thực hiện lại với một table `(products)` trong MySQL có 13 triệu dữ liệu. Và có 3 tính huống tìm kiếm. Và mỗi tình huống có 3 cách, trong đó có 2 cách sử dụng toán tử `LIKE = '%keySearch%'` và `LIKE = 'keySearch%'`. Như sau:

👉 40 tuổi của ngành lập trình viên tôi chấp nhận buông bỏ...

Tôi biết tôi đang ở đâu và hơn 15 năm kinh nghiệm trong lĩnh vực lập trình dường như không mang lại lợi thế gì khi bạn chấp nhận trong ngành nghề này.

👉 Source Go JAVA API: vetautet - Tích hợp master, slave, sentinel và local cache cải thiện performance API (Link đính kèm)

Dự án vetautet giải quyết bài toán cải thiện hiệu suất READ API, WRITE API, Data consistency, Distributed Transactions, Distributed data... Ngoài java, go còn có nestjs và nodejs...

👉 Thu hồi JWT - Cách hiệu quả vô hiệu hoá devices (iPad, iMac) khi iPhone thay đổi password!

CV quá tốt, như vậy thì hệ thống xxxx.com bạn triển khai cho phép một user login trên được nhiều thiết bị phải không?

👉 JWT Skills: Kịch bản tốt nhất ở đây là gì? Khi JWT khi User logout trên iPhone mà iPad, iMac vẫn hoạt động

Ngoài ra một kịch bản khác nữa được đưa ra ngoài chuyện Logout. Khi logout thì token này đã có trong `tokenBlackList` vì vậy khi một ai đó vô tình lấy lại token này để sử dụng or token này bị rò rỉ (leak) và thời gian token này chưa hết hạn...

👉 #07: OpenSource ShareScreen Go và Nodejs Low latency / High resolution

Mục này sẽ cung cấp hai `OpenSource` về web app ShareScreen được phát triển bởi Go và Nodejs với nhiều tính năng được cải thiện về hình ảnh, độ trễ...

👉 DDD - Project: vetautet - Điều gì khiến bạn lo lắng khi đi phỏng vấn với vị trí Senior? Khấu trừ hàng tồn kho?

Đầu tiên, đừng vội vồ vập, vì chúng ta là những người đã kinh qua không gì phải vội. Hãy nhấn mạnh với họ rằng, công ty bạn đang trừ hàng tồn kho ở giai đoạn nào?

👉 Ở vị trí Front-End gần 2 năm và giờ đây tôi ở vị trí Full-Stack tiệm cận Backend nay tôi muốn chia sẻ lộ trình...

Nhưng nói thêm rằng, nếu từ FE muốn chuyển qua `Back-End(BE)` thì Nest.js không đủ để làm chuyện đó. Vì sao? Tôi có thể kết luận như thế này..

👉 Nestjs, JAVA vì sao chúng ta phải cần IoC (Inverse of Control)

Nếu bạn xuất thấn từ JAVA`, GO và Nestjs thì có lẽ cụm từ `IoC` sẽ xuất hiện tấn suất rất nhiều trong dự án và trong các lần phỏng vấn đúng không?

👉 Khấu trừ hàng tồn kho thì backend sẽ chọn cách nào trong 3 cách sau đây.

Nếu một lập trình viên backend hiểu về hệ thông bán hàng đồng thời CAO hoặc kiến ​​trúc đồng thời cao, bạn có thể thấy rằng khấu trừ hàng tồn kho trong Database này không hoàn hảo và nó có vấn đề ở đây.

👉 Đánh bại sự mông lung của ngành nghề Lập Trình Viên

Trường hợp thứ hai ví dụ muốn xử lý một data trong một `Array()` thì bạn cần phải nắm hai khái niệm chính đó là xử lý `for` với cấp độ bình thường, nhưng khi xử lý một `Array()` lớn thì `for` thôi là chưa đủ, mà thêm khái niệm `Stream()`...

👉 DDD - Project: vetautet.com: Redis Master/Slave: Từng Bước Để Đạt Hiệu Năng Cao (50,000 Orders/Giây)

Vì vậy hãy suy nghĩ nếu như Master bị hẻo thì ai sẽ là người ghi `Slave-01` hay `Slave-02` hoặc `Slave-0N`... Là ai? Công thức nào? Và setup thế nào?

👉 [Cuối tuần #13] - Chúng tôi phụ thuộc quá nhiều vào AI, để bây giờ không thể tự suy nghĩ mỗi ngày...

Vì sao tôi vẫn là một nông dân CODE. Với tôi, tôi sẽ cố gắng không phụ thuộc vào AI trừ khi tôi không còn suy nghĩ được vấn đề gì nữa...

👉 DDD - Project: vetautet.com: Kafka ở cấp độ doanh nghiệp, bài viết này là đủ hãy thêm vào CV của chúng ta.

Thật sự mà nói thời điểm đó khi tôi bắt đầu học về kafka thì lúc đó trên internet có khác ít những blog hay video để triển khai những khái niệm rất mơ hồ như `HW, LEO, LSO, LW` hoặc `ISR và AR là viết tắt của từ gì trong Kafka? Tỷ lệ ISR có nghĩa là gì?` rất khó tìm được đáp án.

👉 Nguyên tắc phân trang trong MySQL với limit X,Y? Vì sao X càng lớn thì timeResponse lại cao...

Chúng ta đều đồng ý rằng, trong MySQL dữ liệu càng nhiều thì query càng chậm. Thực tế như sau, khi sử dụng `limit X,Y` để truy vấn, giá trị `X` càng lớn thì tốc độ truy vấn càng chậm.