Lời mở đầu
Lâu rồi mới viết lại, âu cũng do KPI đã đặt thì phải thực hiện thôi 🥲. Ok, hôm nay tôi sẽ giới thiệu cho các bạn ngôn ngữ Wing mới ra gần đây.
Bài viết này hướng tới người đọc:
- Đang làm việc với Cloud: AWS, Azure, Google, ...
- Đang nghiên cứu Cloud
- Đang gặp khó khăn trong việc tiếp cận Cloud
Thời điểm viết bài này là 9:31 pm ngày mùng 5/9/2024. Sau khoảng thời gian đó mà repo có bước phát triển mới thì bài viết của tôi sẽ bị outdated, vậy nên mong mọi người thông cảm.
Giới thiệu
Trước khi đi vào khái niệm của Wing thì tôi sẽ kể cho bạn nghe trải nghiệm của tôi sau khi vọc vạch Google Cloud Platform. Đầu tiên, tôi phải công nhận là Cloud tiện thật, nhưng bất tiện cũng nhiều 😀. Dưới đây là ưu và khuyết của Cloud mà tôi ngộ ra trong quá trình làm việc.
Ưu điểm:
- Với những doanh nghiệp vừa và nhỏ có mong muốn phát hành sản phẩm thì Cloud là một lựa chọn tối ưu cả về chi phí và thời gian: họ đỡ phải quan tâm tới việc xây dựng cơ sở hạ tầng (infrastructure), xây dựng web server, hệ thống network, ...
- Tính bảo mật cao: rule, policy, IAM service, login, authentication, ...
- Cloud cung cấp nhiều dịch vụ, phục vụ nhu cầu riêng biệt của mỗi doanh nghiệp
- ...
Khuyết điểm:
- Lằng nhằng, phức tạp, khó tùy chỉnh hệ thống theo nhu cầu (giới hạn request, quotas, limit, ...)
- Chi phí cao, gia tăng theo số lượng dịch vụ, cấu hình máy ảo, thời lượng sử dụng máy ảo, số lượng request, ...
- Khó khăn trong việc kiểm thử, thí nghiệm, ...
- ...
Với tôi, một tay mơ về Cloud, làm việc trên Cloud vừa là cực hình, vừa là sung sướng. Có khuynh hướng tự ngược vãi 😁
Còn với một chuyên gia về Cloud, họ cần phải có nhiều kinh nghiệm (master), thông hiểu về các lớp trong cloud stack, IAM roles, network, các công cụ cần thiết, test và debug, ...
Tuy vậy, điểm chung của cả tay mơ và chuyên gia là thời gian phát triển. Trong một dự án dài hơi, thời gian phát triển lâu đi kèm chu kỳ lặp lại nhiều (test, debug, ...) sẽ dẫn đến sức sáng tạo của lập trình viên dần dần mất đi.
Vì vậy, một ngôn ngữ lập trình dành cho Cloud được sinh ra: Wing. Wing sẽ "chữa lành" cho bạn bằng cách giả lập Cloud tại local cũng như cung cấp các công cụ cần thiết để kiểm tra code. Nói chung là thay vì tốn quá nhiều thời gian đọc tài liệu được cung cấp bởi Cloud Provider và làm quen với Cloud Platform thì bạn chỉ cần tập trung cho logic, nghiệp vụ của bạn.
Khái niệm
Về cơ bản, ứng dụng trên Cloud khác với ứng dụng trên một máy do nó là một hệ thống phân tán (distributed systems) phụ thuộc vào cơ sở hạ tầng trên cloud.
Vì vậy để trở thành một ngôn ngữ dành cho Cloud, Wing phải thực thi 2 giai đoạn: preflight
cơ sở hạ tầng (infrastructure) và inflight
runtime code.
Preflight
được thực thi trong quá trình biên dịch và cung cấp cấu hình của cơ sở hạ tầng cho ứng dụng (ví dụ: Terraform, CloudFormation, ...)
Inflight
được biên dịch thành JavaScript và được thực thi trong môi trường giả lập Cloud của Node.js
Ví dụ về 1 đoạn code của Wing:
bring cloud; let queue = new cloud.Queue();
let counter = new cloud.Counter();
let bucket = new cloud.Bucket(); queue.setConsumer(inflight (message) => { let i = counter.inc(); bucket.put("file-{i}.txt", message);
});
Ok, đoạn code này chia ra 2 phần:
Preflight
objects:cloud.Queue
,cloud.Counter
vàcloud.Bucket
. Các objects này đại diện cho tài nguyên cơ sở hạ tầng (infrastructure resources). Khi được biên dịch tới một cloud provider chỉ định (chẳng hạn như AWS), một file Terraform sẽ được tạo ra. Phương thứcqueue.setConsumer()
là một phương thứcpreflight
cấu hình cơ sở hạ tầng, phương thức này sẽ gọi tới một hàminflight
cho mỗi một message có trong queue.Inflight
function: để tương tác vớicounter
vàbucket
objects của cloud thì chúng ta có thể dùng các phương thứcinflight
:counter.inc()
vàbucket.put()
. Những phương thức này chỉ có thể gọi trong phạm vi của hàminflight
.
Well, cái ví dụ trên cho thấy cách vận hành đơn giản của Wing. Trong việc phát triển ứng dụng trên cloud, Wing có vẻ là một công cụ hỗ trợ rất tốt, làm giảm đi mức độ khó khăn khi tiếp cận với Cloud:
- Biến các Cloud Services về dạng class để tiện gọi, phân tách ra 2 giai đoạn: cơ sở hạ tầng và runtime code.
- Cung cấp thư viện Wing Cloud Library tiện cho việc viết code tập trung một chỗ và linh hoạt trong việc chuyển giao code.
- Tùy chỉnh Cloud Platforms : tùy chỉnh cơ sở hạ tầng và kiểm tra các chính sách.
- Tương thích với Terraform
- Tương thích với JavaScript
- Tự động sinh các chính sách IAM (IAM policies): role, principal, ...
- Cung cấp Wing Console giúp bạn có thể dùng các lệnh CLI trên terminal
- Cung cấp một trình giả lập (simulator giúp bạn thử nghiệm và sửa lỗi nhanh.
- Hỗ trợ Json format
- ...
Tiếp theo, chúng ta cùng dạo một vòng Wing qua một khóa học của họ: https://www.winglang.io/learn/
Thực hành
Mục tiêu: Xây dựng một "smart queue". Mỗi một message nằm trong queue sẽ được lưu vào file latest.txt
và đẩy lên bucket của AWS.
Khởi tạo tài nguyên Cloud
Ở đây tôi sẽ tạo 1 object cloud.Queue
bằng từ khóa new
. Kết quả sẽ hiện lên trình giả lập của Wing
Như vậy, tôi đã tạo được một ứng dụng cloud đầu tiên với Wing
Đẩy message vào queue
Trong trình giả lập ở hình trên, tôi có thể tương tác với node màu xanh lá cây Queue
bằng cách ấn vào. Khi ấn vào sẽ hiện lên panel phía bên tay phải.
Điền một cái message chà bá vào cái khung Push Message
rồi ấn nút Push
để đẩy message vào queue. Ở đây tôi điền 2 messages thôi: "First time" và "Second time". Để ý nó có timeout 30s, sau 30s queue sẽ tự động xóa message.
Gọi hàm và hiển thị log
Ở bước này, tôi sẽ tạo cloud.Function
. Đây là một tài nguyên của cloud, thực thi code và phản hồi kết quả. Tôi sẽ dùng function này để đẩy message vào queue. Trong hàm dưới đây có từ khóa inflight
biểu thị là đoạn code này sẽ được thực thi sau khi hệ thống được deploy
Node xanh nước biển Function
được tạo ra. Khi ấn vào sẽ hiện lên panel bên tay phải, sau đó ấn vào nút Invoke
sẽ thực thi hàm và hiển thị log bên dưới.
Đẩy message vào queue bằng function
Trong hàm mà tôi đã nêu bên trên, thêm dòng q.push(s)
nhằm gửi payload của hàm (message) tới queue.
Sau khi thêm dòng code kia thì trình giả lập sẽ hiển thị mối quan hệ giữa node Function
và node Queue
. Điều này rất quan trọng khi bạn làm việc với Cloud, bởi vì các dịch vụ của Cloud kết nối với nhau và tạo ra các stack layer, không những thế mối quan hệ tự động suy ra chính sách bảo mật (IAM).
Lưu message cuối tới bucket
Ở bước gần cuối này, tôi sẽ dùng phương thức queue.setConsumer()
để đăng ký một handler. handler này sẽ được gọi mỗi khi một message mới được đẩy vào queue.
Tôi cũng sẽ tạo một bucket mới và đẩy file chứa message cuối cùng lên bucket này.
Sau khi viết xong đoạn code trên hãy kiểm tra xem trình giả lập thay đổi như thế nào. Sơ đồ sẽ hiển thị mối quan hệ của Function
, Queue
và Bucket
.
Khi bạn điền message vào payload của Function
rồi ấn invoke thì hãy kiểm tra Bucket
bằng cách ấn vào latest.txt
, file này sẽ hiển thị message mà mình vừa điền ở Function
.
Compile bằng Terraform
Sau khi xây dựng và thử nghiệm code xong, tôi sẽ compile nó lại để deploy lên cloud.
Như các bạn thấy thì đoạn code vừa rồi đã được trình giả lập biên dịch lại thành tài nguyên (assets) trong Terraform. Sau đó thì bạn có thể dùng Terraform để cấu hình cơ sở hạ tầng và thực thi code trên Cloud Platform.
Lời kết
Cám ơn các bạn đã đọc đến đây.
Bài viết này chỉ giới thiệu đơn giản về Wing. Để đào sâu thêm thì cần phải thực hành nhiều hơn và đọc tài liệu do nhà phát triển Wing cung cấp. Biết đâu tôi lại cho ra lò thêm bài viết về Wing trong tương lai. Mà thực ra bí ý tưởng viết bài thì tôi cũng quay lại chủ đề này mà thôi 🤣
Tôi thấy ngôn ngữ này tiềm năng phết, nếu ông nào cảm thấy khó khăn trong việc thử nghiệm và sửa lỗi trên Cloud Platform thì có thể thử trên trình giả lập của Wing trước xem sao.
Tóm lại, ai đi qua cho tôi xin 1 upvote, tuy không biết upvote được cái gì không nhưng thấy mọi người like bài viết là tâm trạng tốt hơn hôm sau rồi 🙇