Trong bài viết ngày hôm nay mình sẽ chia sẻ với các bạn về một dịch vụ khá mới của Microsoft Azure được “gã khổng lồ phần mềm” giới thiệu trong sự kiện Connect(); // 2016 của họ với tên gọi Azure Functions, một dịch vụ serverless compute (tạm dịch là dịch vụ điện toán serverless, hay được gọi tắt là dịch vụ serverless) dựa trên cơ chế xử lý theo sự kiện (event-based) chạy trên nền tảng điện toán đám mây Microsoft Azure. Serverless là gì? Serverless có lợi ích gì và Azure Functions đóng vai trò gì trong câu chuyện serverless? Hãy cùng tìm câu trả lời trong bài viết này.
Serverless là gì?
Để trả lời cho câu hỏi serverless là gì, trước hết mình muốn cùng các bạn nhìn lại lịch sử sử dụng các máy chủ (server) của chúng ta.
Vào những năm 1990, sự bùng nổ của Internet mang đến cho các công ty những cơ hội kinh doanh mới, họ đầu tư vào việc phát triển những ứng dụng web nhằm mang đến cho khách hàng của họ những trải nghiệm mới lạ và thú vị khi sử dụng dịch vụ của họ. Vào thời điểm này, để một ứng dụng web chạy được họ cần phải làm rất nhiều việc, lấy ví dụ đơn giản nhất là họ cần phải có server để host ứng dụng web của họ, sau đó từ câu chuyện cần có server, họ phải đối mặt với các bài toán về hạ tầng liên quan như hệ thống điện, UPS, hệ thống dây mạng, chuyên viên IT, người giám sát,… đi kèm với đó là những công việc quản lý, vận hành xoay quanh hạ tầng đó, những công việc tốn rất nhiều thời gian và tiền bạc.
Để giải quyết các vấn đề phức tạp liên quan đến hạ tầng, vào năm 2008, các dịch vụ ứng dụng mô hình Cloud Computing – Công nghệ điện toán Đám mây bùng nổ, một nền tảng công nghệ giúp các công ty đơn giản hóa việc phát triển các ứng dụng của mình với việc giảm bớt gánh nặng về xử lý các bài toán liên quan đến hạ tầng cho ứng dụng. Tại thời điểm này, các dịch vụ cloud được cung cấp chủ yếu là các dịch vụ IaaS – Infrastructure as a Service. Với IaaS, mặc dù đã giúp giảm đi rất nhiều gánh nặng về hạ tầng, nhưng vẫn còn khá nhiều công việc liên quan đến quản lý hạ tầng hay cụ thể là quản lý các dịch vụ IaaS mà các công ty cần phải thực hiện như nâng cấp OS cho server hay backup dữ liệu của hệ thống server, …
Một bước tiến khác của Cloud Computing đó là vào khoảng năm 2012, các dịch vụ PaaS – Platform as a Service nở rộ. Với các dịch vụ PaaS, các công việc liên quan đến quản lý hạ tầng ở phía các công ty được giảm nhẹ, việc nâng cấp OS hay backup dữ liệu hệ thống máy chủ được thực hiện bởi các nhà cung cấp dịch vụ cloud và phía công ty chỉ cần tập trung phát triển ứng dụng và lựa chọn cấu hình, kích thước phù hợp của dịch vụ cho ứng dụng của họ. Mặc dù với tính chất “mỳ ăn liền” của các dịch vụ PaaS, tuy nhiên vẫn còn một số vấn đề liên quan đến hạ tầng mà các công ty cần phải quan tâm như tính toán cấu hình hệ thống sao cho phù hợp hay xử lý bài toán scale hạ tầng cho ứng dụng.
Và mô hình serverless ra đời, một mô hình điện toán đám mây được phát triển để giải quyết “gần như” triệt để các vấn đề về phía hạ tầng cho người sử dụng bằng việc cung cấp một dịch vụ cloud đóng gói, lập trình viên chỉ việc đẩy code của mình lên dịch vụ serverless này và nhà cung cấp dịch vụ cloud sẽ lo từ “A đến Z” các vấn đề về phía hạ tầng để chạy được code của họ cũng như giúp xử lý bài toán scale cho ứng dụng.
Khái niệm serverless dưới góc nhìn kỹ thuật?
serverless hay còn được biết đến với một thuật ngữ khác là Function-as-a-Service (FaaS), là một mô hình máy tính trên cloud, giúp thực thi các đoạn code của lập trình viên được đẩy lên trong các máy tính stateless (phi trạng thái/không lưu trữ trạng thái), được xử lý/trigger theo sự kiện, hoạt động tạm thời (có thể chỉ tồn tại cho một lần sử dụng) và hoàn toàn được quản lý bởi bên thứ 3 ở đây là nhà cung cấp dịch vụ cloud. Với kiến trúc serverless, lập trình viên chỉ cần tập trung vào viết các đoạn code logic mà không phải quan tâm về việc vận hành server để đoạn code logic đó chạy được.
Microsoft trong câu chuyện serverless?
Serverless được coi là tương lai của dịch vụ điện toán đám mây và tất nhiên với những gì là xu hướng thì Microsoft sẽ không chịu đứng ngoài cuộc. Gã khổng lồ phần mềm này đã cho ra mắt cộng đồng dịch vụ Azure Functions, được xây dựng với những tối ưu để hỗ trợ việc triển khai các hệ thống ứng dụng sử dụng mô hình kiến trúc serverless một cách dễ dàng dựa trên nền dịch vụ điện toán đám mây Microsoft Azure của mình. Vậy chính xác Azure Functions là gì?
Azure Functions là gì?
Azure Functions là dịch vụ cho phép bạn có thể chạy các đoạn code có độ phức tạp của nghiệp vụ không cao hay được gọi là các “function” (các hàm) để giải quyết một bài toán cụ thể nào đấy trên cloud mà không muốn bận tâm tới các thành phần khác liên quan trong ứng dụng cũng như hạ tầng để chạy được function này.
Một số điểm hay của Azure Functions
- Hỗ trợ nhiều ngôn ngữ lập trình khác nhau như C#, F#, Node.js, PHP hay Phython.
- Chỉ phải trả cho thời gian mà function của bạn chạy. Cái hay của Azure Functions là thay vì phải trả một con số cố định & không hề rẻ để thuê server để chạy function của bạn thì với gói Consumption của Azure Functions, bạn chỉ cần phải trả cho thời gian mà function của bạn chạy mà thôi. Tránh láng phí một số tiền cố định mà bạn phải trả cho quãng thời gian mà function của bạn không được sử dụng tới. Ngoài ra, Azure Functions còn cho bạn miễn phí 1 triệu lần chạy function của bạn đầu tiên với 400.000 GB-s (Gigabyte Seconds) mỗi tháng. Chi tiết tham khảo tại đây.
- Hỗ trợ các thư viện bên ngoài từ Nuget hay NPM do đó bạn có thể dễ dàng thêm các thư viện yêu thích bên ngoài vào function của bạn.
- Hỗ trợ tích hợp với các giải pháp xác thực OAuth như Azure Active Directory, Facebook, Google, Twitter, hay Microsoft Account.
- Có khả năng nhanh chóng tích hợp với các dịch vụ của Azure hoặc các dịch vụ của bên thứ 3 như Azure Storage, Azure Mobile Apps, Azure Event Hubs, GitHub, …
- Cho phép xây dựng function của bạn ngay trực tiếp trên giao diện web của Azure Functions hoặc sử dụng các trình IDE quen thuộc của bạn như Visual Studio, Xcode, Eclipse, …
- Azure Functions được phát triển sử dụng Azure WebJobs SDK runtime và bộ runtime này được open source cho cộng đồng. Mã nguồn của bộ runtime này hiện có trên GitHub tại đây.
Kiến trúc của Azure Functions

Như nhắc tới ở trên, Azure Functions được xây dựng sử dụng bộ WebJobs SDK runtime, với việc sử dụng bộ runtime này cho phép Azure Functions nhanh chóng phản hồi lại các sự kiện cũng như xử lý dữ liệu mà vẫn vẫn đảm bảo giữ nguyên được mô hình abstract.
Mô hình abstract ở đây là gì?
Azure Functions được thiết kế với mô hình “dual abstraction”:

Với mô hình kiến trúc serverless, Azure Functions làm mờ đi khái niệm về máy tính hay có thể hiểu ở đây là server, lập trình viên không cần phải bận tâm quá nhiều tới việc quản lý, vận hành server khi sử dụng Azure Functions.
Ngoài ra, Azure Functions sử dụng cơ chế “binding” để tương tác với các dịch vụ bên ngoài, với cơ chế binding này Azure Functions cũng làm mờ đi việc tương tác với các dịch vụ bên ngoài được sử dụng trong Azure Functions, giúp lập trình viên dễ dàng tương tác với các dịch vụ này mà không cần phải tốn nhiều sức vào việc thiết lập kết nối giữa Azure Functions với các dịch vụ này.
Azure Functions hoạt động ra sao và có thể làm được những gì?
Azure Functions được xây dựng dựa trên 2 cơ chế trigger và binding. Hiểu một cách đơn giản, trigger được sử dụng để làm cho function của bạn chạy, nó sẽ dựa vào một sự kiện nào đấy để kích hoạt function của bạn. Còn binding là cách để khai báo các dịch vụ được sử dụng để đơn giản hóa việc tương tác với dữ liệu đầu vào (input data) và dữ liệu đầu ra (output data). Không có giới hạn về số lượng binding input data và binding output data của một function. Tuy nhiên, một function chỉ có thể binding một trigger duy nhất. Tham khảo hình sau:

Hình trên là đoạn code của một function được viết bằng C# thể hiện rõ các thành phần trong một function cơ bản bao gồm: trigger, input data, output data và code của bạn.
Azure Functions hỗ trợ khá nhiều trigger & các dịch vụ có thể binding, cho phép bạn xây dựng được các giải pháp như xử lý dữ liệu, tích hợp hệ thống, các giải pháp cho IoT, hay xây dựng các API và microservice đơn giản.

Một vài ví dụ về trigger được Azure Functions hỗ trợ:
- HTTPTrigger: Kích hoạt function của bạn thông qua các request bằng HTTP. Bạn có thể sử dụng trigger này để xây dựng các REST API đơn giản.
- BlobTrigger: Trigger này sẽ kích hoạt function của bạn khi có một blob (hiểu đơn giản là một tập tin) được lưu vào container (hiểu đơn giản là một thư mục) trên Azure Storage.

- TimerTrigger: Kích hoạt function của bạn theo lịch đặt sẵn. Bạn có thể xây dựng các function như dọn dẹp hoặc các tác vụ thu thập dữ liệu (data crawling) theo một lịch trình được đặt sẵn.

- EventHubTrigger: Trigger này sẽ kích hoạt function của bạn khi mà có một sự kiện được gửi tới Azure Event Hub. Trigger này rất hữu dụng cho các bài toán về IoT, các bài toán về xử lý hành vi người dùng, các ứng dụng đo đạc thông tin, …

Các bạn có thể xem thêm về các trigger được Azure Functions hỗ trợ tại đây.
Một quy trình phát triển giải pháp serverless sử dụng Azure Functions như thế nào?
Cùng xem biểu đồ biểu diễn quy trình xây dựng một giải pháp serverless sử dụng Azure Functions:
Trước tiên, lập trình viên cần lựa chọn 1 trigger phù hợp (1) Trigger) cũng như binding những input data cần thiết (2) Input Binding) cho function của mình. Sau khi binding trigger và input data phù hợp, lập trình viên sẽ cần xây dựng (code) function của mình. Azure Functions hỗ trợ lập trình viên có thể xây dựng function ngay trực tiếp trên trình duyệt web (3) Develop) hoặc sử dụng các IDE quen thuộc của mình để phát triển function như Visual Studio, IntelliJ IDEA, Eclipse, … (7) Develop Locally). Sau khi xây dựng function và publish nó lên Azure Functions thành công, function sẽ ở trạng thái “đợi được chạy”/”lắng nghe sự kiện” dựa vào trigger mà lập trình viên lựa chọn. Khi function được chạy, dữ liệu sẽ được lưu lại/trả về theo thiết lập binding của output data (5) Output Binding). Lập trình viên có thể sử dụng các giải pháp insights như Azure Application Insights (xem thêm về Application Insights tại đây) để theo dõi tình trạng của function (số lượng người sử dụng, tỉ lệ crash, tỉ lệ lỗi, …) của mình từ đó có thể đưa ra được những cải tiến về sau (6) Monitor and Improve).
Lợi ích của việc sử dụng Azure Functions?
Để nói về lợi ích của việc sử dụng Azure Functions thì theo mình nên nói về lợi ích của việc áp dụng kiến trúc serverless trước.
Serverless có gì lợi?
- Lợi ích đầu tiên mà có thể thấy rõ ràng được luôn đó chính là giảm được gánh nặng & các vấn đề về việc vận hành, quản lý server. Với việc sử dụng các dịch vụ serverless chuyên nghiệp và cụ thể ở đây là Azure Functions, công việc vận hành, quản lý server sẽ do những người có chuyên môn cao của nhà cung cấp dịch vụ thực hiện, đảm bảo được sự ổn định của hệ thống.
- Giảm thiểu các chi phí: Việc giảm thiểu chi phí này đến từ 3 phía: chi phí điều hành, chi phí phát triển và chi phí sử dụng:
- Chi phí điều hành có thể giảm đi thông qua việc sử dụng các dịch vụ serverless chuyên nghiệp. Với những nhà cung cấp dịch vụ điện toán đám mây lớn như Microsoft hay Amazon, họ có những công nghệ tân tiến và đội ngũ kỹ sư “lành nghề” chuyên tập trung vào việc phát triển & quản lý dịch vụ serverless của họ, ngoài ra, dịch vụ của họ không chỉ cung cấp riêng cho 1, 2 cá nhân sử dụng mà là rất nhiều do vậy số tiền bỏ ra để thuê dịch vụ sẽ rẻ hơn rất nhiều so với việc thuê một người có chuyên môn cao chỉ để vận hành riêng server của bạn.
- Còn về chi phí phát triển, với việc tối giản các công việc liên quan đến vận hành đồng nghĩa với việc tối giản thời gian phát triển. Với thời gian phát triển được rút ngắn, chi phí cho việc phát triển cũng được giảm đi theo là điều dễ hiều.
- Cuối cùng là về chi phí sử dụng, với mô hình tính tiền theo số lần function được gọi sẽ giúp tối ưu được rất nhiều về chi phí hoạt động của ứng dụng khi chỉ cần phải trả tiền cho thời gian mà function chạy thay vị trả cố định một khoản tiền hàng tháng cho server.
- Tập trung vào việc phát triển code logic nghiệp vụ. Khi các yếu tố làm sao nhãng sự tập trung của nhà phát triển để code ra các logic nghiệp vụ như cấu hình server, thiết lập kết nối giữa các dịch vụ liên quan, … được giảm đi thì đồng nghĩa với việc sự tập trung của lập trình viên vào việc code logic được bảo toàn và từ đó phần nào đảm bảo được chất lượng của các đoạn code logic mà lập trình viên viết ra.
- Đưa sản phẩm ra thị trường nhanh hơn. Hiển nhiên rằng khi thời gian phát triển được giảm đi thì đồng nghĩa với việc rút ngắn được thời gian đưa sản phẩm ra thị trường.
- Điều chỉnh được chi phí linh hoạt. Với các nhà cung cấp dịch vụ serverless lớn như Microsoft hay Amazon, họ cung cấp những giải pháp “scaling” linh hoạt, cho phép nhà phát triển có thể thiết lập bằng tay hoặc tự động điều chỉnh cấu hình server của function “giãn nở” theo mức độ sử dụng của function từ đó điều chỉnh được chi phí sử dụng.
- Giảm DevOps. Một điều hiển nhiên đó là serverless giúp lập trình viên không phải lo về hạ tầng đồng nghĩa với việc các vấn đề về quản lý, vận hành hạ tầng sẽ không cần được quan tâm, giảm được các DevOps liên quan.
Azure Functions có gì hay hơn so với các đối thủ như AWS Lambda, IBM OpenWhisk hay Google Cloud Functions?
Một điểm hay duy nhất tính đến thời điểm này mà mình thấy của dịch vụ Azure Functions so với các đối thủ đó là cơ chế binding rất tiện lợi! Với việc abtract tương tác giữa function với các dịch vụ liên quan một cách dễ dàng thông qua cơ chế binding giúp lập trình viên nhanh trong triển khai các function của mình trên Azure Functions mà không cần phải tốn quá nhiều thời gian để tìm hiểu cách tích hợp dịch vụ bên ngoài.
Dùng Azure Functions như thế nào?
Có 2 hướng tiếp cận để bạn có thể dùng Azure Functions:
- Tạo dịch vụ Azure Functions trong Microsoft Azure Portal. Hướng này đòi hỏi bạn cần phải có subscription của Microsoft Azure.
- Nếu bạn chưa có subscription của Microsoft Azure hoặc muốn nhanh trong “vọc” Azure Functions, Microsoft xây dựng 1 chương trình cho phép bạn có thể dùng thử Azure Functions trong 1 tiếng đồng hồ mà không cần có subscription của Microsoft Azure.
Truy cập vào đây để vọc Azure Function trong 1 giờ hoàn toàn miễn phí!
Trên là bài viết giới thiệu tổng quan về mô hình kiến trúc serverless và dịch vụ Azure Functions của Microsoft. Hy vọng phần nào mang đến cho các bạn những kiến thức cơ bản nhất về serverless và dịch vụ serverless của Microsoft Azure. Trong bài viết tới, mình sẽ cùng các bạn phân tích một số ví dụ cụ thể ứng dụng mô hình serverless và rút ra các “best practices” khi phát triển giải pháp serverless và cụ thể là sử dụng Azure Functions.
Nếu các bạn muốn trao đổi về các nội dung được chia sẻ ở trên, phần comment bên dưới là cách tương tác rất hữu ích :)!
hay đấy Dũng! trong bài tiếp theo hi vọng sẽ được nghe những chia sẻ về pros & cons của serverless cùng với các best practices
Chắc chắn rồi @Tùng!
Hay quá, Mình đang tìm hiểu cái này, tuy là tổng quan nhưng mình nhìn ra được 1 chút vấn đề. Cảm ơn cậu nhé 🙂
Rất vui khi thấy bài viết hữu ích với bạn 🙂
Bài viết rất hay!
Cám ơn bạn!
Bài viết quá hay! Tác giả lại đẹp trai nữa chứ 🙂
Bài rất hay và chi tiết… thanks ad.