Vấn đề của Microservices

Vấn đề của Microservices

Tin ngắn hàng ngày dành cho bạn
  • Cảm ơn threads.net của nhà Meta vì nó là nguồn cảm hứng cho mình tạo ra chuyên mục này trên blog. Ban đầu hơi nghi ngờ về việc liệu tạo ra các bài viết ngắn như thế này có thu hút được người dùng, có ai ngày qua ngày quay trở lại đọc không, hay tất cả chỉ như dã tràng xe cát? Như mình đã nói rất nhiều là làm ra một tính năng không khó, nhưng vận hành nó làm sao cho hiệu quả mới là điều cần phải bận tâm.

    Giờ đây thời gian đã chứng minh tất cả. Chuyên mục Bài viết ngắn luôn đứng trong tốp 5 trang có lượt truy cập nhiều nhất trong ngày/tuần/tháng. Điều đó có nghĩa bạn đọc đã có thói quen quay trở lại nhiều hơn. Tại sao mình lại khẳng định như thế? Vì chuyên mục này gần như không hề được SEO trên các công cụ tìm kiếm như Google.

    Lại kể về thời xa xưa một chút. Thời gian đầu mình rất chịu khó đăng bài trên threads.net với hy vọng thu hút được nhiều người theo dõi, để từ đó khéo léo giới thiệu họ trở thành người dùng blog của mình. Nhưng càng về sau càng thấy "đuối" vì thuật toán của Threads ngày càng không phù hợp với định hướng của mình. Hay nói cách khác là nội dung tạo ra không ăn khách.

    Ví dụ các bài viết của mình thường mang khuynh hướng chia sẻ thông tin, tin tức, hoặc kinh nghiệm cá nhân rút ra sau khi học hoặc làm một cái gì đó. Dường như những bài viết như vậy không được đánh giá cao và thường bị chôn vùi chỉ sau hơn... 100 lượt xem. Hmm... Liệu vấn đề có phải là do mình? Biết thế sao không chịu thay đổi nội dung theo hướng phù hợp hơn với nền tảng?

    Mình đã quan sát Threads, các nội dung dễ lan toả nhất là có yếu tố gây tranh cãi hoặc một định kiến về vấn đề gì đó, đôi khi chỉ đơn giản là phát biểu "ngây ngô" một vấn đề gì đó mà họ biết chắc chắn có tương tác. Mà mình thì gần như là không hề thích định hướng người dùng theo nội dung kiểu này. Mọi người có thể bảo mình bảo thủ, mình chấp nhận. Mỗi người có định hướng nội dung và khán giả khác nhau, lựa chọn nằm ở họ.

    Thế là từ đó mình chủ yếu viết trên này. Chỉ thi thoảng có phát hiện hay lắm thì mới lên Threads "khoe". Ở đây hàng ngày vẫn có người vào đọc, dù cho bạn là ai thì mình tin chắc rằng các bạn nhận ra được thông điệp mà mình muốn truyền tải thông qua mỗi bài viết. Ít nhất chúng ta có chung một định hướng về nội dung. Đôi khi điều sợ nhất không phải là viết ra không ai đọc, mà là họ đọc xong rồi lãng quên trong phút chốc. Số lượng là quan trọng, nhưng chất lượng mới là thứ mang chúng ta lại gần nhau hơn.

    Cảm ơn tất cả 🤓

    » Xem thêm
  • Zed chắc là cộng đồng những nhà phát triển chịu khó lắng nghe người dùng nhất quả đất. Mới đây họ thêm tuỳ chọn để tắt tất tần tật tính năng AI có trong Zed. Trong khi nhiều bên khác đang muốn tích hợp sâu hơn và làm nhiều hơn với AI Agent. Quả là một nước đi táo bạo 🤔

    You Can Now Disable All AI Features in Zed

    » Xem thêm
  • Hôm nay mình đã cố gắng đi hẳn 8k bước trong một phiên để đo lường cho các bạn thấy. Quả là không ngoài dự đoán khi thời gian đi lên đến hơn 1 giờ và quãng đường ~6km 🤓

    À vài hôm nữa là hết tháng, tức là cũng tròn 1 tháng mình bắt đầu thói quen đi bộ mỗi ngày với mục tiêu 8k bước. Để đầu tháng sau mình tổng kết lại xem thế nào luôn ha.

    » Xem thêm

Vấn đề

Microservices có lẽ không cần phải giới thiệu thêm nhiều nữa, trong vài năm đổ lại đây nó đang nổi lên như một hiện tượng. Microservices là một kỹ thuật phát triển phần mềm, cấu trúc một ứng dụng như một tập hợp các dịch vụ được ghép lỏng lẻo. Trái ngược với Microservices là Monolithic, nơi tất cả thành phần của ứng dụng được đặt chung với nhau thành một thể thống nhất.

Vào thời của tôi hoặc cũng có thể là nhiều anh chị đi trước được tiếp xúc với Monolithic là chính. Nếu như bạn đọc chưa biết, trước kia tôi vốn là một lập trình viên PHP. PHP có rất nhiều Framework, chúng được tổ chức theo cách đặt tất cả logic xử lý ứng dụng vào trong đó. Một và chỉ một dự án là đủ. Sau khi sửa, tải nó lên Hosting là bản cập nhật có hiệu lực ngay lập tức.

Khi đi thực tập ở công ty trong vai trò JavaScript. Tôi được tham gia vào nhiều dự án thực tế và hết sức ngạc nhiên khi thấy ứng dụng lúc này không chỉ đơn thuần triển khai bằng một bước như trước nữa, mà đó là nơi có chứa những mảnh ghép rời rạc từ nhiều phần tạo nên hệ thống. Từng thành phần giao tiếp với nhau thông qua một cách nào đó như gọi API hoặc lắng nghe Message Queue. Khi tìm hiểu sâu hơn, tôi biết đây là một lối kiến trúc mang hơi hướng của Microservices

Microservices hiện đại. Điều đó đúng. Tôi đã thấm nhuần cái tư tưởng của Microservices là hãy biến hệ thống của bạn trở nên lỏng lẽo nhất có thể. Bất cứ thành phần nào cũng có thể tách ra, thay bằng thành phần khác. Mỗi mảnh ghép đảm nhiệm một nhiệm vụ duy nhất, nằm độc lập với nhau, khiến cho hệ thống trở nên minh bạch hơn bao giờ hết.

Sau này khi chuyển công ty, hầu hết là những doanh nghiệp còn non trẻ hay còn gọi là Startup. Kiểu kiến trúc này vẫn được ưa chuộng. Từ đó mình càng được tiếp xúc nhiều hơn. Mưa dần thấm lâu, trời sinh ra Microservices tại sao còn sinh ra Monolithic? Chẳng phải một kiến trúc rõ ràng như Microservices đã đánh bại Monolithic ngay bây giờ, ngay lúc này rồi sao? Microservices đang đánh bay đi sự lề mề, ục ịch của Monolithic.

Cho đến một ngày...

Đó là thời gian tôi bắt tay vào xây dựng cho mình một trang blog. Bạn nghĩ như thế nào nếu một anh thợ phụ đã có gạch và vữa trong tay, chuẩn bị xây ngôi nhà đầu tiên cho chính mình? Thứ duy nhất mà anh thiếu chắc hẳn là kinh nghiệm. Sau lần xây dựng trang blog theo lối kiến trúc Microservices, sau đó là quá trình đập đi xây lại theo phong cách Monolithic. Tôi như tự tay tát vào mặt mình về những tuyên bố hùng hồn ở trên, mới vỡ lẽ ra một sự thật rằng Microservices không phải là viên đạn bạc.

Trong bài viết này tôi sẽ trình bày lại với bạn đọc về quãng thời gian u tối do áp dụng Microservices vào dự án cá nhân của mình. Dĩ nhiên không có ý đánh đồng rằng Microservices là tệ. Nó chỉ tệ khi gây cản trở đến quá trình vận hành. Hy vọng qua bài viết này bạn đọc sẽ hình dung ra thông điệp mà tôi muốn truyền đạt và mong nhận được những lời khuyên thích đáng.

Từ Monolithic sang Microsevice

Để xây dựng ứng dụng theo kiến trúc Microsevice nói tóm gọn là tách biệt các thành phần xử lý logic thành các khối riêng biệt nếu có thể. Triển khai chúng bằng bất kỳ cách nào, bất kỳ ngôn ngữ nào, cho chúng giao tiếp với nhau thông qua một cách nào đó ví dụ như HTTP, gRPC, Webhook...

Hệ thống mà tôi xây dựng chia thành nhiều thành phần nhỏ. Trong đó có thể kể đến giao diện blog (page), trang quản trị (admincp), api, một service quản lý hình ảnh (image), một service xử lý tác vụ chạy ngầm (background) và một vài cái lặt vặt nữa không nhớ rõ lắm. Các thành phần chủ yếu giao tiếp với nhau thông qua REST API. Bạn biết không, sau khi làm xong tất cả mọi thứ, tôi đặt chúng vào trong cùng một máy chủ, trong các container của Docker. Bằng cách nào đó, nghe nó như Microsevice nhưng lại rất Monolithic.

Trong quá trình vận hành, ưu điểm lớn nhất nhìn thấy là sự minh bạch. Các thành phần được tách biệt với nhau rất dễ dàng để nhận biết hoặc thêm thắt tính năng. Nhưng khi làm đủ lâu, sự thật khủng khiếp mới dần hé lộ.

Thứ nhất là quá trình gỡ lỗi hết sức khó khăn. Các mấu nối giữa các hệ thống lỏng lẻo nhưng phụ thuộc vào nhau. Nếu trong quá trình gỡ lỗi, nghi ngờ chỗ nào, thành phần nào có khả năng lỗi nhất buộc chúng ta phải kết nối chúng lại với nhau để tái hiện lỗi. Hay nói cách khác là bạn cần phải chuẩn bị đầy đủ service, khởi động chúng cùng với nhau để bắt đầu. Lặp lại quy trình này liên tục giữa các service cho đến khi tìm thấy lỗi.

Thứ hai là vấn đề truy vết. Nhiều người sẽ nghĩ cách tốt nhất là ghi lại nhật ký (logs) hệ thống. Nhưng quản lý logs lại là công việc ở một phạm trù khác. Bạn cần quản lý được đống nhật ký đó và biết cách móc nối chúng lại với nhau để tìm cho mình được thông tin có giá trị. Nếu không tất cả chỉ giống như là viên thuốc giả dược. Cứ ghi lại tất cả những gì xảy ra nhưng lại không biết cách làm thế nào để phát hiện được chúng. Nếu sau này dữ liệu nhiều lên còn phát sinh thêm nhiều vấn đề khác như lưu trữ và rác.

Quản lý các service này không hề dễ dàng với nguồn nhân lực hạn chế. Nếu hệ thống có 2 services, không thành vấn đề. Nhưng sau đó nó mở rộng ra đến 3, 4, 5... thậm chí là đến hàng chục services thì câu chuyện lúc đó sẽ như thế nào? Hãy tưởng tượng công việc thường ngày bạn làm trên một dự án? Từ quản lý mã nguồn, tài liệu, phiên bản, các gói phụ thuộc... cho đến quá trình CI/CD, triển khai. Thì ngần ấy công việc được nhân lên tương ứng với số lượng dự án mà bạn đang có. Tin tôi đi, điều đó như là một cơn ác mộng vậy.

Một ý nữa là nó phức tạp hơn mức cần thiết. Tránh rơi vào cái bẫy mọi thứ nên hoàn hảo ngay từ đầu. Hãy thiết kế một hệ thống phù hợp với tình hình hiện tại chứ không phải là để chịu tải được hàng triệu người cùng lúc, trong khi thực tế chúng ta không có nổi 100 lượt xem hàng ngày. Hãy đối diện với sự thật và đừng gây thêm gánh nặng cho mình.

Từ Microsevice sang Monolithic

Với những lý do trên khiến tôi tiến tới đập đi xây lại blog của mình sau nhiều lần đắn đo suy nghĩ. Gộp tất cả những thứ đang có thành một khối thống nhất, như thể đó là Monolithic. Quả thật đây chính là điều đúng đắn nhất mà nên làm sớm hơn.

Monolithic tỏ ra hợp lý với cách vận hành cá nhân, mà theo tôi nghĩ nó cũng phù hợp với một đội nhỏ. Giờ đây tôi chỉ cần tập trung vào một dự án duy nhất. Dễ gỡ lỗi, dễ truy vết và không mất thêm thời gian để quản lý dự án theo cấp số nhân nữa. Vậy mới thấy Microservices không phải là viên đạn bạc và Monolithic là một giải pháp phù hợp hơn trong hoàn cảnh này.

Đập đi xây lại blog là một quá trình tốn nhiều thời gian. Nhiều người có thể nghĩ việc tổ chức theo Microservices trước đó là quãng thời gian vô ích, nhưng đối với tôi nó lại là một khoảng thời gian quý giá để rút ra được nhiều bài học. Một trong số đó là nhìn nhận ra những mặt tốt/xấu của Microservices.

Tóm lại là

Microservices là một kỹ thuật phát triển phần mềm hiện đại, nhưng không dành cho tất cả mọi người. Việc phát triển ứng dụng theo kiểu kiến trúc này đòi hỏi rất nhiều nỗ lực vận hành, kiểm soát hệ thống. Nếu không bạn chẳng thực sự biết điều gì đang xảy ra bên trong ứng dụng của mình cả. Nếu bạn chỉ có một mình hoặc một đội nhỏ, hãy thử cân nhắc sang Monolithic - truyền thống, đơn giản và dễ tiếp cận.

Bên cạnh đó tôi tin là vẫn có rất nhiều người biết cách vận hành hệ thống microservices của mình. Hãy chia sẻ lại câu chuyện của bạn xuống phần bình luận cho tôi và mọi người cùng biết nhé. Xin cảm ơn.

Cao cấp
Hello

Tôi & khao khát "chơi chữ"

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.

Bình luận (0)

Nội dung bình luận...