Chia sẻ trải nghiệm Azure CDN cho Azure App Service

Dạo gần đây, team mình có triển khai sử dụng Azure App Service để hosting sản phẩm cho khách hàng của mình. Tuy nhiên do em yêu khoa học và khoái apply cái gì đó mới mẻ nên mình âm thầm gắng Azure CDN cho cái App Service luôn.

Sơ sơ về Azure CDN.

Tại thời điểm mình viết bài này thì Azure support một vài profile như Standard Akamai, Premium Verizon, Standard Microsoft. Giá và tính năng từng sản phẩm mình thấy nó không khác nhau mấy.

Azure CDN Profiles

Ban đầu mình bắt đầu thử xài profile Akamai, tuy nhiên sau 2 ngày mình đã thấy thời gian nó load dữ liệu lâu quá (mình đợi cả ngày vẫn chưa chạy). Mình quyết định sẽ đồng hành cùng S3 Standard Microsoft.  

Xài nó thế nào?

Thông thường thì các bác search CDN thì người ta sẽ gắn CDN cho một cái storage nào đó như Azure Blob Storage các thể loại như hình bên dưới. Azure Storage  này sẽ lưu hình ảnh, CDN sẽ cache những tấm hình này lên server của nó khắp thế giới.

Tuy nhiên Azure App Service thì cái storage của nó không gắn được trực tiếp vào CDN được và mình cũng không rõ nó là thể loại storage gì. Bạn nào biết có thể dùng thông não giúp mình.

Như dụ án mình làm là một dạng website tĩnh là chính nên nội dung rất ít khi thay đổi. Do đó một cách có thể áp dụng là để CDN pull dữ liệu trực tiếp từ App service và  trả content đó tới người dùng luôn. Tức là cache toàn bộ cái site luôn. Toàn bộ request sẽ vào CDN và không được route vào cái App Service của mình. Mình có phát họa lại mô hình mình triển khai như hình bên dưới.

Azure CDN và App Service

Cách hoạt động của CDN khi backend của nó là App service là khi có request tới nó thì nó sẽ kiểm tra hiện tại trong cache có resource đó không, nếu không sẽ request resource đó từ App Service. Resource sẽ được cache lại trên CDN trong thời gian được quy định theo Cache-Control header của Http response từ App Service. Ví dụ như phần lớn những file js, css của mình đều có cache-control: max-age=2592000 nên những resources này sẽ được phục vụ trực tiếp từ CDN luôn và cache trong 1 tháng.

Các bạn tham khảo tại đây về chi tiết các hoạt động của nó nhé.

https://learn.microsoft.com/en-us/azure/cdn/cdn-how-caching-works

Với cách làm này mình sẽ được một vài ưu điểm như sau:

  • Nhanh, và nhanh, đôi khi là cái gì qua CDN thì nó nhanh một cách vô lý!
  • Phần lớn traffic sẽ được phục vụ từ CDN, do đó mình có thể dùng App service với cấu hình tương đối thấp (hiện tại mình chọn cái plan rẻ nhất luôn).
  • HTTPS cert mình để azure quản lý luôn, nên không còn phải quan tâm việc hàng năm quên renew lại.
  • Xài 100% service, không có 1 cái máy ảo nào trong đây cả. Điều này làm giảm việc mình phải quản lý server và dễ đạt được SLA.

Sản phẩm mình máy chủ đặt ở châu Âu nên thời gian tải trang sẽ khá chậm nếu mình truy cập nó từ nước mình. Trước khi có CDN thì tải trang mất khoản hơn 1s, nếu mình gắn thêm vào tốc độ tải trang khoản vài chục ms tới vài trăm ms.

Azure CDN tại việt nam

Tốc độ này nếu so với mấy site có máy chủ ở nước mình thì sẽ không thể so sánh được. Tuy nhiên với 1 site ở tân trời tây như thế theo mình đã là khá ổn rồi.

Azure CDN có gì không tốt?

Nói nãy giờ bảo cách làm này sướng kiểu này, tốt kiểu khác các kiểu. Nói thật giờ làm xong rồi, thì đôi khi lại muốn gỡ nó ra thôi. Có một vài cái nhược mà mình cũng chưa có giải pháp rõ ràng.

Theo Azure thì Etag,  Last-Modified chưa support cho CDN Standard Microsoft. Nên để toàn bộ cái website chạy sau CDN như mình làm thì sẽ phát sinh chuyện là đôi khi content của html nó thay đổi nhưng nội dung CDN có thay đổi hay không thì mình cũng không kiểm soát được, kiểu kiểu lúc nó cache lại, lúc lại không…

khi Nên mình phải sử dụng Rule Engine để bypass cho request document.

Azure CDN Standard/Premium from Verizon supports ETag by default, while Azure CDN Standard from Microsoft and Azure CDN Standard from Akamai do not.

Và kết quả của việc này là cái request đầu tiên đẻ lấy document về chậm hơn gần gấp đôi vì nó phải đi đường vòng (browser => CDN => App Service). LoL

Một vấn đề khác là những resource như hình của mình có Cache-Control: <1 tháng>nên admin muốn đổi tấm hình đó thì phải tạo mới tấm hình đó để nó có url mới, chứ replace tấm hình đó thì url của tấm hình đó không thay đổi và phải đợi 1 tháng sau mới thấy tấm hình đó xuất hiện!!!.

Kết

Do thời gian phát triển dự án có giới hạn (vài ngày), resource cũng không nhiều nên sản phẩm mình làm demo chỉ có thế phát triển tới mức như vậy. Azure CDN theo mình cho thời gian load content khá nhanh ở nước mình. Đôi khi mình thấy nó gần bằng những CDN của https://thegioididong.com như nó kéo images về chỉ khoản 30ms mà thôi.

Với cái giá tương đối hợp lý cho một dịch vụ ở mức global, mình thiết nghĩ anh em nên cân nhắc khi triển khai sản phẩm của mình trong tương lai.