Hôm trước mình đã có bài Giới thiệu Azure Functions.
Hôm nay mình sẽ giới thiệu với mọi người về một phiên bản cao siêu hơn của nó đó là Azure Durable Functions.
Azure Durable Functions là gì?
Azure Durable Functions là một extension của Azure Functions. Nó cho phép chúng ta viết các hàm để xử lý việc đổi trạng thái trong môi trường không máy chủ và có thể định nghĩa quy trình công việc trong code. Với extension này nó sẽ cho phép chúng ta định nghĩa ra được trạng thái của quy trình công việc bằng một loại hàm gọi là orchestration function (dịch tiếng việt ra thấy nó hơi tào lao nên chỗ này mình viết tiếng anh luôn nha :P)
Ưu điểm:
- Định nghĩa workflow trong code
- Không cần JSON schemas hay giao diện
- Có thể gọi các functions khác đồng bộ hoặc bất đồng bộ
- Output của các hàm được gọi có thể lưu vào biến local
- Nó tự động kiểm tra progress bất cứ khi nào các function đang chờ đợi.
- Trạng thái cục bộ không bao giờ bị mất nếu tiến trình recycle hoặc các máy ảo được reboot lại.
Vậy nếu áp dụng vào ngữ cảnh thực tế thì cụ thể nó được sử dụng như thế nào?
Bài Toán
Giả sử hệ thống của mình có một chức năng upload file. Khi file này được up lên thì sẽ gọi tới 1 cái service để quét virus mà service đó tách rời chứ ko cùng hệ thống. Và khi việc scan hoàn tất thì mình sẽ trả kết quả là file đó Passed hay là có virus về cho user biết.
Giải Pháp
Với bài toán trên, ban đầu mình sẽ thiết kế hệ thống kiểu Azure Function. Mình sẽ tạo ra 2 cái queue là scan request và scan response. Khi user upload file lên thì mình sẽ bắn message vào scan request queue. Antivirus Service sẽ luôn lắng nghe khi có message ở scan request queue thì sẽ bắt đầu tiến trình quét virus. Và sau khi hoàn thành thì sẽ bắn message trả kết quả tới scan response queue.
Lúc đó hệ thống của mình có 1 cái function sẽ luôn lắng nghe cái scan response queue này, nếu có bất cứ message nào bắn vào thì nó sẽ lấy response đó ra để bắt đầu xử lý kết quả rồi cập nhật status vào 1 column trên database.
Đồng thời mình cũng tạo ra 1 cái API để frontend có để call long polling để lấy status này ra và hiển thị ra cho user biết là file đó có virus hay không.
Nhưng giả sử nếu tình huống là user up lên 1 file nặng thiệt nặng, Antivirus service chết nghẻo giữa chừng thì kết quả của mình sẽ đi về đâu?
Lúc này mình sẽ chỉnh sửa lại hệ thống 1 tẹo là mình sẽ dùng theo kiểu Durable Function với kiến trúc như sau
Mình sẽ có tổng cộng 3 queues: scan start, scan request và scan response thay vì là 2 queue như ở trên. Và mỗi lần scan thì mình sẽ có kèm 1 cái orchestrator chạy với 1 khoảng thời gian timeout x gì đó. Nếu vẫn chưa nhận được kết quả trả về thì mình sẽ cập nhật status vào database là Failed luôn.
Đầu tiên, khi upload, mình sẽ bắn 1 message lên scan start queue.
Lúc này Azure Functions ScanStart của mình sẽ lắng nghe scan start queue, mỗi lần có message mới thì nó sẽ trigger, bắt đầu gọi Orchestrator start lên.
Theo như mô hình ở trên thì Orchestrator Function sẽ gọi các Activity Function thực hiện 1 dàn tác vụ mà chúng ta mong muốn.
Chẳng hạn như Scan Request Activity dùng để bắn message vô scan request queue để yêu cầu Antivirus service nhận và thực hiện quét virus. Và Scan Response Activity dùng để xử lý kết quả trả về.
Ngoài ra, mình cũng có 1 cái Azure Function để trigger việc nhận message được gửi từ scan response queue. Mà để cho đồng bộ thì mình không tự xử lý kết quả trả về ở đây mà mình sẽ Raise event lên để Orchestrator nhận và xử lý các bước tiếp theo.