Ngân hàng đề — Microsoft Azure Developer

Tìm thấy 409 câu.

Câu 301
You are developing an online game that includes a feature that allows players to interact with other players on the same team within a certain distance. The calculation to determine the players in range occurs when players move and are cached in an Azure Cache for Redis instance.

The system should prioritize players based on how recently they have moved and should not prioritize players who have logged out of the game.

You need to select an eviction policy.

Which eviction policy should you use?
  1. A allkeys-Iru
  2. B volatile-Iru
  3. C allkeys-lfu
  4. D volatile-ttl
Xem giải thích

🧩 Phân tích chi tiết nội dung câu hỏi

Câu hỏi tập trung vào việc phát triển một trò chơi trực tuyến sử dụng Azure Cache for Redis để lưu trữ vị trí người chơi (cached khi họ di chuyển). Tính năng cho phép người chơi tương tác với đồng đội trong khoảng cách nhất định, và hệ thống cần tính toán người chơi trong tầm dựa trên dữ liệu cache.

Yêu cầu chính của hệ thống:

  • Ưu tiên (prioritize) người chơi dựa trên thời gian di chuyển gần đây nhất (how recently they have moved): Nghĩa là giữ lại lâu hơn những key (dữ liệu người chơi) được cập nhật gần đây, và loại bỏ (evict) những key cũ nhất trước.
  • Không ưu tiên người chơi đã đăng xuất (logged out): Những người chơi này không nên được giữ lại ưu tiên, tức là hệ thống nên dễ dàng loại bỏ họ khi cache đầy (evict họ trước các key khác).

Vấn đề cốt lõi: Khi cache đầy, cần chọn eviction policy phù hợp để tự động loại bỏ key cũ/thấp ưu tiên, đảm bảo hiệu suất trò chơi mượt mà. Azure Cache for Redis (dựa trên Redis OSS phiên bản mới nhất đến 2026, hỗ trợ Redis 7.x) cho phép cấu hình các policy eviction để xử lý tình huống này. 🛠️

Bối cảnh kỹ thuật:

  • Key cache đại diện cho vị trí người chơi, cập nhật khi move (tương đương "used" gần đây).
  • Người chơi logged out có thể được set expire/TTL để tự động hết hạn.
  • Policy phải chỉ evict key có expire (volatile) để tránh ảnh hưởng người chơi đang online (no expire), và ưu tiên LRU (Least Recently Used) để loại key ít di chuyển gần đây.

✅ Đáp án đúng: volatile-Iru

Lý do lựa chọn:

  • volatile-lru (viết chuẩn: volatile-lru) chỉ evict các key có expire set (volatile keys), và trong số đó ưu tiên loại bỏ key ít được sử dụng gần đây nhất (Least Recently Used - LRU).
  • Phù hợp hoàn hảo:
    • Ưu tiên recently moved → LRU giữ key cập nhật gần đây (khi move → key được "touch" hoặc updated).
    • Không ưu tiên logged out → Giả sử logged out set expire (TTL), chúng nằm trong volatile keys và dễ bị evict nếu LRU thấp.
    • Tránh evict key không expire (người chơi online đang active).
  • Đây là policy mặc định khuyến nghị cho workload game realtime với TTL-based cleanup. 📈

📋 Giải thích tất cả các phương án

  • allkeys-Iru ❌
    Sai vì: Policy này evict LRU từ tất cả key (allkeys), bao gồm cả key không expire (người chơi online). Sẽ vô tình loại bỏ dữ liệu người chơi đang active dù họ di chuyển gần đây, vi phạm yêu cầu ưu tiên recently moved và không an toàn cho logged out (có thể evict nhầm active keys). Không phân biệt volatile keys.

  • volatile-Iru ✅
    Đúng vì: Như giải thích trên, chỉ target key có expire (logged out thường set TTL), và evict theo LRU → ưu tiên giữ recently moved, loại logged out/low-activity trước. Hoàn hảo cho scenario game với TTL cho inactive users. 🏆

  • allkeys-lfu ❌
    Sai vì: Evict Least Frequently Used (LFU - ít truy cập nhất) từ tất cả key. Không tập trung vào "recently moved" (LRU tốt hơn cho recency), và evict cả active keys không expire, dẫn đến mất dữ liệu người chơi online thường xuyên di chuyển nhưng ít freq cao.

  • volatile-ttl ❌
    Sai vì: Chỉ evict key có expire với TTL ngắn nhất (Time To Live). Không dựa trên recency (recently moved), nên key moved gần đây nhưng TTL dài vẫn bị giữ, còn key cũ TTL ngắn bị evict trước → không ưu tiên đúng "how recently moved", và kém linh hoạt cho logged out nếu TTL không chính xác.

📘 Tài liệu tham khảo

  • Microsoft Docs (Azure Cache for Redis - Eviction policies): Azure Cache for Redis eviction overview (cập nhật 2024-2026, hỗ trợ Redis 7.2+ với LRU/LFU maxmemory).
  • Redis OSS Docs: Eviction policies (volatile-lru là best practice cho TTL-mixed workloads).
  • Azure Pricing Tier: Premium/Enterprise tiers hỗ trợ custom eviction như volatile-lru. 🧑‍💻

Hy vọng phân tích này giúp bạn nắm vững! Nếu cần code sample config Redis eviction, hãy hỏi thêm nhé! 🚀

Câu 302
You are developing a road tollway tracking application that sends tracking events by using Azure Event Hubs using premium tier.
Each road must have a throttling policy uniquely assigned.
You need to configure the event hub to allow for per-road throttling.
What should you do?
  1. A Use a unique consumer group for each road.
  2. B Ensure each road stores events in a different partition.
  3. C Ensure each road has a unique connection string.
  4. D Use a unique application group for each road.
Xem giải thích

🧩 Phân tích chi tiết câu hỏi trắc nghiệm

📖 Nội dung câu hỏi:
Câu hỏi mô tả một ứng dụng theo dõi đường thu phí (road tollway tracking application) đang phát triển, nơi các sự kiện theo dõi (tracking events) được gửi đến Azure Event Hubs sử dụng premium tier. Yêu cầu chính là mỗi đường (road) phải có chính sách throttling (giới hạn tốc độ) riêng biệt và duy nhất. Nhiệm vụ là cấu hình Event Hub để hỗ trợ throttling theo từng đường (per-road throttling).

✅ Mục tiêu cốt lõi: Trong Azure Event Hubs Premium tier (phiên bản cập nhật đến 2026), throttling mặc định áp dụng ở mức namespace, nhưng để đạt throttling chi tiết theo từng ứng dụng/tenant (như per-road) trong kịch bản multi-tenant, cần cơ chế phân tách producer/consumer để áp dụng giới hạn riêng (ví dụ: throughput units - TU riêng cho từng nhóm). Điều này giúp tránh tình trạng một road "lấn át" tài nguyên của road khác, đảm bảo hiệu suất ổn định.

✅ Đáp án đúng:
Use a unique application group for each road.

🛠️ Lý do chọn đáp án đúng (theo phiên bản Azure Event Hubs Premium mới nhất 2026):
Trong Azure Event Hubs Premium và Dedicated Cluster (cập nhật feature từ 2023-2026), Application Groups là tính năng cho phép tạo các nhóm ứng dụng riêng biệt trong cùng namespace, mỗi nhóm có throttling policy độc lập (bao gồm producer/consumer throughput limits, connection limits). Bằng cách gán mỗi road một unique Application Group, bạn có thể cấu hình per-group throttling qua Azure portal/ARM template/CLI, ví dụ: road A có 1,000 TPS, road B có 500 TPS. Điều này lý tưởng cho multi-tenancy mà không cần tách namespace (tiết kiệm chi phí). Feature này được hỗ trợ đầy đủ trong Premium tier với hierarchical namespace (HNS) enabled.

📋 Giải thích tất cả các phương án (đúng/sai)

  • ❌ Use a unique consumer group for each road.
    Phân tích sai: Consumer Group chỉ dùng để phân tách consumer đọc dữ liệu độc lập (mỗi group đọc full stream từ partitions), không ảnh hưởng đến throttling producer-side hoặc per-road limits. Throttling vẫn áp dụng chung namespace, không hỗ trợ policy riêng per-group. Sử dụng nhiều consumer group chỉ tăng complexity mà không giải quyết per-road throttling.

  • ❌ Ensure each road stores events in a different partition.
    Phân tích sai: Partitions là cơ chế scaling song song (dựa trên partition key), nhưng throttling không per-partition – tất cả partitions chia sẻ TU chung của namespace. Gán road khác partition không tạo policy throttling riêng; nếu overload, toàn bộ Event Hub vẫn bị throttle, không isolate per-road.

  • ❌ Ensure each road has a unique connection string.
    Phân tích sai: Unique connection string (dựa trên SAS token hoặc Authorization Rule) chỉ cung cấp access control (read/write permissions), nhưng throttling vẫn namespace-level, không per-connection. Nhiều connection string cùng namespace vẫn chia sẻ limits chung, không đạt per-road isolation (dù hữu ích cho auth).

  • ✅ Use a unique application group for each road.
    Phân tích đúng (chi tiết bổ sung): Như đã giải thích, Application Groups (feature Premium tier, GA từ ~2022, enhanced 2026) cho phép custom throttling metrics per-group qua API/portal (e.g., set maxProvisionedThroughput riêng). Producer của road gửi với group identifier → Event Hubs apply limits tương ứng. Hoàn hảo cho per-road trong cùng Event Hub.

📘 Tài liệu tham khảo (cập nhật 2026)

Hy vọng phân tích này giúp bạn nắm vững! 🚀 Nếu cần code sample, hỏi thêm nhé!

Câu 303
You develop an Azure App Service web app and deploy to a production environment. You enable Application Insights for the web app.

The web app is throwing multiple exceptions in the environment.

You need to examine the state of the source code and variables when the exceptions are thrown.

Which Application Insights feature should you configure?
  1. A Smart detection
  2. B Profiler
  3. C Snapshot Debugger
  4. D Standard test
Xem giải thích

🧩 Phân tích nội dung câu hỏi

Câu hỏi tập trung vào tình huống phát triển và triển khai một ứng dụng web trên Azure App Service (một dịch vụ PaaS của Microsoft Azure để host web app). Ứng dụng đã được deploy lên môi trường production và kích hoạt Application Insights (công cụ monitoring toàn diện của Azure để theo dõi hiệu suất, lỗi và hành vi ứng dụng).

Hiện tại, web app đang gặp nhiều exceptions (lỗi ngoại lệ) trong production. Yêu cầu là cần kiểm tra trạng thái source code và các biến (variables) tại chính thời điểm exceptions xảy ra, mà không làm gián đoạn ứng dụng.

🛠️ Mục tiêu chính: Xác định tính năng nào trong Application Insights giúp debug sâu, capture trạng thái runtime (như giá trị biến, call stack, dòng code cụ thể) khi lỗi xảy ra, đặc biệt phù hợp cho môi trường production mà không cần redeploy hoặc attach debugger thủ công. Đây là kiến thức chuẩn từ Azure Monitor/App Insights phiên bản mới nhất (cập nhật đến 2026, với hỗ trợ .NET, Java, Node.js và cải tiến snapshot capture tự động).

✅ Đáp án đúng: Snapshot Debugger

Lý do lựa chọn:
Snapshot Debugger là tính năng chuyên biệt của Application Insights, được thiết kế chính xác để capture "ảnh chụp" (snapshot) toàn bộ trạng thái ứng dụng tại thời điểm exception xảy ra. Nó cho phép developer xem:

  • Dòng code đang thực thi.
  • Giá trị của tất cả variables cục bộ/toàn cục.
  • Call stack đầy đủ.
  • Không gây overhead lớn ở production (chỉ trigger khi có exception đủ điều kiện).

🧠 Tính năng này hoạt động tự động sau khi enable, hỗ trợ nhiều ngôn ngữ (bao gồm .NET Core/5+, Java 8+, Node.js), và dữ liệu được lưu trữ an toàn trong Azure. Theo tài liệu Azure 2026, nó đã được tối ưu hóa với AI-assisted debugging và tích hợp GitHub Copilot cho phân tích nhanh hơn. Đây là giải pháp lý tưởng cho production debugging mà không cần stop app.

📝 Giải thích tất cả các phương án

Dưới đây là phân tích chi tiết từng lựa chọn, giữ nguyên văn bản gốc bằng tiếng Anh. Mỗi phương án được đánh giá đúng/sai kèm lý do cụ thể dựa trên chức năng thực tế của Application Insights (phiên bản mới nhất 2026):

  • Smart detection ❌ SAI
    Smart Detection (nay gọi là Anomaly Detection trong Azure Monitor) sử dụng AI để phát hiện tự động các vấn đề bất thường như failure rate tăng đột biến hoặc hiệu suất kém. Nó gửi alert nhưng KHÔNG capture trạng thái code/variables cụ thể khi exception xảy ra. Thích hợp cho proactive monitoring, không phải debug sâu.

  • Profiler ❌ SAI
    Profiler là công cụ phân tích hiệu suất (performance profiling), thu thập dữ liệu về CPU, memory, và call paths để tìm bottleneck. Nó KHÔNG tập trung vào exceptions mà chỉ ghi lại traces định kỳ hoặc on-demand, không capture trạng thái variables/code tại thời điểm lỗi. Phù hợp cho optimization, không phải debugging exceptions.

  • Snapshot Debugger ✅ ĐÚNG
    Như đã giải thích ở trên, đây là tính năng chính xác nhất để examine source code và variables khi exceptions thrown. Nó attach "không xâm lấn" vào app production, chỉ kích hoạt trên failed requests cụ thể, và hiển thị debugger-like view trực tiếp trong Azure Portal. Hoàn hảo cho kịch bản câu hỏi.

  • Standard test ❌ SAI
    Standard test không tồn tại như một tính năng trong Application Insights. Có thể nhầm lẫn với Availability Tests (kiểm tra uptime/ping web) hoặc các load tests, nhưng chúng chỉ verify tính sẵn sàng, KHÔNG liên quan đến debug exceptions, code state hay variables. Đây là lựa chọn giả/mồi nhử.

📘 Tài liệu tham khảo

Hy vọng phân tích này giúp bạn nắm vững! 🚀 Nếu cần demo code enable Snapshot Debugger, hãy cho biết nhé!

Câu 304 Chọn nhiều đáp án
You develop and deploy an ASP.NET Core application that connects to an Azure Database for MySQL instance.
Connections to the database appear to drop intermittently and the application code does not handle the connection failure.
You need to handle the transient connection errors in code by implementing retries.
What are three possible ways to achieve this goal? Each correct answer presents part of the solution.
NOTE: Each correct selection is worth one point.
  1. A Close the database connection and immediately report an error.
  2. B Disable connection pooling and configure a second Azure Database for MySQL instance.
  3. C Wait five seconds before repeating the connection attempt to the database.
  4. D Set a maximum number of connection attempts to 10 and report an error on subsequent connections.
  5. E Increase connection repeat attempts exponentially up to 120 seconds.
Xem giải thích

🧩 Phân tích nội dung câu hỏi

Câu hỏi này thuộc lĩnh vực phát triển ứng dụng ASP.NET Core kết nối với Azure Database for MySQL. Vấn đề chính là kết nối database bị ngắt quãng tạm thời (transient connection errors), và mã ứng dụng chưa xử lý lỗi này. Nhiệm vụ là triển khai cơ chế retry (thử lại kết nối) trong code để xử lý các lỗi tạm thời này.

📌 Chi tiết vấn đề:

  • Transient errors thường xảy ra do bảo trì, tải cao, hoặc sự cố mạng ngắn hạn ở Azure MySQL (ví dụ: lỗi code 2013, 4031).
  • Mục tiêu: Xử lý bằng cách retry tự động thay vì báo lỗi ngay.
  • Đây là câu hỏi multi-select (chọn nhiều đáp án đúng), mỗi đáp án đúng chiếm 1 điểm, và có 3 cách đúng để đạt mục tiêu.
  • Phiên bản cập nhật: Theo tài liệu Microsoft Azure mới nhất (2024-2026), khuyến nghị sử dụng exponential backoff, max retries, và delay hợp lý (docs: Azure MySQL Retry Logic và Handling Transient Errors).

✅ Đáp án đúng và lý do lựa chọn

Ba đáp án đúng là:

  • Wait five seconds before repeating the connection attempt to the database.
  • Set a maximum number of connection attempts to 10 and report an error on subsequent connections.
  • Increase connection repeat attempts exponentially up to 120 seconds.

Lý do chọn: Những cách này là các best practices để xử lý transient errors trong code ASP.NET Core với Azure MySQL. Chúng triển khai retry logic hiệu quả: delay trước khi retry (5 giây), giới hạn số lần thử (max 10), và exponential backoff (tăng dần đến 120s) để tránh overload hệ thống. Điều này tuân thủ Enterprise Library Retry Policy hoặc Polly library (khuyến nghị từ Microsoft). Không retry ngay lập tức mà chờ đợi thông minh giúp kết nối thành công sau khi sự cố tạm thời qua đi. 🛠️

📋 Giải thích chi tiết từng phương án

Dưới đây là phân tích tất cả 5 phương án, giữ nguyên văn bản gốc tiếng Anh. Mỗi phương án được đánh giá ✅ (đúng) hoặc ❌ (sai), kèm giải thích rõ ràng:

  • Close the database connection and immediately report an error.
    ❌ Sai: Phương án này không triển khai retry, chỉ đóng kết nối và báo lỗi ngay lập tức. Điều này làm ứng dụng crash hoặc fail mà không thử lại, trái với yêu cầu xử lý transient errors (lỗi tạm thời cần retry). Không phù hợp với best practice Azure. 🛑

  • Disable connection pooling and configure a second Azure Database for MySQL instance.
    ❌ Sai: Việc tắt connection pooling và tạo instance thứ hai không liên quan đến retry trong code. Connection pooling giúp quản lý kết nối, nhưng transient errors vẫn cần retry logic. Tạo instance thứ hai là giải pháp failover (không phải retry), tốn kém và phức tạp hơn. Microsoft không khuyến nghị cho vấn đề này. 🚫

  • Wait five seconds before repeating the connection attempt to the database.
    ✅ Đúng: Đây là cách fixed delay đơn giản trước khi retry (5 giây là khoảng thời gian hợp lý cho transient errors). Giúp tránh retry quá nhanh gây tải cao, cho database thời gian phục hồi. Có thể implement bằng Task.Delay(5000) trong Polly hoặc custom loop. 📈

  • Set a maximum number of connection attempts to 10 and report an error on subsequent connections.
    ✅ Đúng: Đặt giới hạn max retries = 10 ngăn chặn infinite loop nếu lỗi kéo dài. Sau 10 lần, báo lỗi để ứng dụng graceful degrade. Đây là phần thiết yếu của retry policy (ví dụ: RetryPolicy với maxRetryAttempts=10). Tránh tình trạng retry vô tận. 🔢

  • Increase connection repeat attempts exponentially up to 120 seconds.
    ✅ Đúng: Sử dụng exponential backoff (tăng delay theo cấp số nhân: 1s → 2s → 4s... đến max 120s) là best practice hàng đầu từ Microsoft cho Azure services. Giảm tải hệ thống bằng cách retry chậm dần, phù hợp với transient failures (docs: Polly Exponential Backoff). ⏱️

📘 Tài liệu tham khảo

Hy vọng phân tích này giúp bạn hiểu rõ! Nếu cần code sample ASP.NET Core với Polly, hãy hỏi thêm. 🚀

Câu 305
You are building a B2B web application that uses Azure B2B collaboration for authentication. Paying customers authenticate to Azure B2B using federation.
The application allows users to sign up for trial accounts using any email address.
When a user converts to a paying customer, the data associated with the trial should be kept, but the user must authenticate using federation.
You need to update the user in Azure Active Directory (Azure AD) when they convert to a paying customer.
Which Graph API parameter is used to change authentication from one-time passcodes to federation?
  1. A resetRedemption
  2. B Status
  3. C userFlowType
  4. D invitedUser
Xem giải thích

🧩 Phân tích chi tiết nội dung câu hỏi

Câu hỏi xoay quanh việc xây dựng một ứng dụng web B2B sử dụng Azure B2B collaboration để xác thực người dùng trên Azure Active Directory (Azure AD) (nay là Microsoft Entra ID).

  • Tình huống cụ thể:
    • Khách hàng trả phí (paying customers) xác thực qua federation (liên kết với identity provider bên thứ ba).
    • Người dùng đăng ký tài khoản thử nghiệm (trial) bằng bất kỳ địa chỉ email nào, thường sử dụng one-time passcodes (OTP) để redeem invitation.
    • Khi chuyển sang khách hàng trả phí, cần giữ nguyên dữ liệu trial nhưng buộc phải xác thực qua federation.
    • Nhiệm vụ: Cập nhật user trong Azure AD bằng Microsoft Graph API, cụ thể là tham số nào để chuyển phương thức xác thực từ OTP sang federation.

📘 Bối cảnh kỹ thuật: Đây là quy trình cập nhật invitation trong Azure AD B2B. Ban đầu, invitation dùng OTP cho trial. Khi convert, phải reset redemption status để user redeem lại với federation, đồng thời giữ dữ liệu liên kết với user account.

🛠️ API liên quan: Sử dụng PATCH /invitations/{invitationId} trong Microsoft Graph API (phiên bản mới nhất 2024-2026, không thay đổi cơ bản từ Graph REST v1.0/beta).

✅ Đáp án đúng: resetRedemption

Lý do lựa chọn:

  • Tham số resetRedemption (boolean, đặt thành true) được sử dụng để reset trạng thái redemption của invitation.
  • Điều này cho phép user redeem invitation lại một lần nữa với phương thức xác thực mới (federation), thay vì OTP cũ, mà không mất dữ liệu trial (vì dữ liệu gắn với user principal name/email).
  • Quy trình: Lấy invitationId từ trial, PATCH với { "resetRedemption": true, "invitedUserEmailAddress": "email@federated.com" } để liên kết federation.
  • Đây là giải pháp chính thức từ Microsoft cho trường hợp chuyển đổi B2B từ OTP sang federation.

📋 Giải thích tất cả các phương án

  • resetRedemption ✅ Đúng
    🛠️ Tham số này reset redemption status của invitation, buộc user phải redeem lại bằng federation. Giữ nguyên dữ liệu user, phù hợp hoàn hảo với yêu cầu. (Xác nhận từ docs Microsoft Graph: invitation resource).

  • Status ❌ Sai
    🧩 Status chỉ là thuộc tính read-only mô tả trạng thái invitation (e.g., "PendingAcceptance", "Accepted", "Completed"). Không dùng để thay đổi phương thức xác thực, và không hỗ trợ update qua PATCH.

  • userFlowType ❌ Sai
    📘 userFlowType thuộc về Azure AD B2C user flows (self-service sign-up), không liên quan đến B2B invitations hoặc Graph API cho B2B collaboration. Không tồn tại trong invitation object.

  • invitedUser ❌ Sai
    🛠️ invitedUser là object read-only chứa thông tin user được mời (displayName, userPrincipalName). Không phải tham số để update auth method, chỉ dùng để hiển thị dữ liệu.

📚 Tài liệu tham khảo (cập nhật mới nhất 2024-2026)

Hy vọng phân tích này giúp bạn nắm vững! 🚀 Nếu cần code sample Graph API, hãy hỏi thêm nhé!

Câu 306 Chọn nhiều đáp án
You are developing an application to store business-critical data in Azure Blob storage.

The application must meet the following requirements:

•Data must not be modified or deleted for a user-specified interval.
•Data must be protected from overwrites and deletes.
•Data must be written once and allowed to be read many times.

You need to protect the data in the Azure Blob storage account.

Which two actions should you perform? Each correct answer presents part of the solution.

NOTE: Each correct selection is worth one point.
  1. A Configure a time-based retention policy for the storage account.
  2. B Create an account shared-access signature (SAS).
  3. C Enable the blob change feed for the storage account.
  4. D Enable version-level immutability support for the storage account.
  5. E Enable point-in-time restore for containers in the storage account.
  6. F Create a service shared-access signature (SAS).
Xem giải thích

🧩 Phân tích chi tiết nội dung câu hỏi

Câu hỏi này thuộc chủ đề bảo vệ dữ liệu (immutability) trong Azure Blob Storage, tập trung vào việc lưu trữ dữ liệu kinh doanh quan trọng (business-critical data). Ứng dụng cần đáp ứng 3 yêu cầu chính:

  • Dữ liệu không được phép sửa đổi (modify) hoặc xóa (delete) trong khoảng thời gian do người dùng chỉ định (user-specified interval). 📅
  • Dữ liệu được bảo vệ khỏi ghi đè (overwrites) và xóa (deletes). 🔒
  • Dữ liệu chỉ được ghi một lần (write once) và đọc nhiều lần (read many times - WORM model). 📝➡️🔄

Nhiệm vụ là chọn 2 hành động (actions) để bảo vệ dữ liệu trong tài khoản lưu trữ Azure Blob. Đây là câu hỏi multiple correct answers (mỗi lựa chọn đúng đáng 1 điểm), dựa trên tính năng immutable storage của Azure (cập nhật mới nhất đến năm 2026, theo Azure Storage Blob docs phiên bản 2024+ với hỗ trợ version-level immutability).

Mục tiêu chính: Sử dụng các chính sách retention và immutability để khóa dữ liệu, ngăn chặn mọi thay đổi trái phép, phù hợp với quy định compliance như SEC Rule 17a-4(f), FINRA.

📘 Tài liệu tham khảo:

✅ Đáp án đúng (2 lựa chọn hoàn chỉnh giải pháp)

Các đáp án đúng là:

  1. Configure a time-based retention policy for the storage account.
  2. Enable version-level immutability support for the storage account.

Lý do lựa chọn 🛠️:

  • Time-based retention policy thiết lập khoảng thời gian giữ dữ liệu (retention interval), blobs không thể delete hoặc overwrite trong thời gian đó, trực tiếp đáp ứng yêu cầu "user-specified interval" và bảo vệ khỏi deletes/overwrites.
  • Version-level immutability kích hoạt chế độ WORM tại mức version blob, đảm bảo dữ liệu write-once-read-many, kết hợp với retention để khóa hoàn toàn. Hai tính năng này bổ trợ nhau, tạo lớp bảo vệ mạnh mẽ nhất cho tài khoản storage (áp dụng từ Azure Storage v2023-11-03+, hỗ trợ GPv2 accounts). Không có tính năng đơn lẻ nào đáp ứng đầy đủ cả 3 yêu cầu.

📋 Giải thích tất cả các phương án (đúng/sai)

Dưới đây là phân tích từng lựa chọn một cách chi tiết, dựa trên tính năng Azure mới nhất:

✅ Configure a time-based retention policy for the storage account.

  • Đúng vì: Tính năng này áp dụng chính sách giữ dữ liệu theo thời gian (ví dụ: 7 năm), ngăn chặn mọi lệnh delete hoặc overwrite blob/container cho đến khi hết hạn. Hoàn hảo cho yêu cầu "user-specified interval" và bảo vệ deletes/overwrites. Có thể thiết lập tại mức account/container/blob level. 🛡️

❌ Create an account shared-access signature (SAS).

  • Sai vì: SAS chỉ cấp quyền truy cập tạm thời (account-level), cho phép read/write/delete tùy quyền, nhưng không ngăn chặn overwrite/delete từ các key khác (như account key). Không liên quan đến immutability hay WORM, chỉ là authorization tool. 🚫

❌ Enable the blob change feed for the storage account.

  • Sai vì: Blob change feed chỉ ghi log các thay đổi (create/update/delete) để audit/debug, không ngăn chặn bất kỳ hành động modify/delete nào. Không đáp ứng yêu cầu bảo vệ dữ liệu. 📊

✅ Enable version-level immutability support for the storage account.

  • Đúng vì: Kích hoạt immutability tại mức version (kết hợp versioning), blobs trở thành immutable sau khi ghi, hỗ trợ WORM model và bảo vệ khỏi deletes/overwrites. Bổ sung cho retention policy, đặc biệt hữu ích với dữ liệu kinh doanh (hỗ trợ từ API version 2021-06-08+). 🔒✨

❌ Enable point-in-time restore for containers in the storage account.

  • Sai vì: Point-in-time restore chỉ cho phép khôi phục dữ liệu từ backup (lên đến 14 ngày trước), không ngăn chặn delete/overwrite thời gian thực. Chỉ là recovery tool, không phải immutability. 🔄

❌ Create a service shared-access signature (SAS).

  • Sai vì: Service SAS (blob/container level) tương tự account SAS, chỉ kiểm soát quyền truy cập dịch vụ cụ thể, nhưng không khóa dữ liệu khỏi modify/delete từ quyền cao hơn. Không hỗ trợ retention hay WORM. 🚫

Kết luận 🎯: Kết hợp 2 đáp án đúng tạo giải pháp toàn diện, tuân thủ best practices Azure cho compliance data. Nếu triển khai, dùng Azure Portal/CLI để config! 🧑‍💻

Câu 307 Chọn nhiều đáp án
You are developing a web app that is protected by Azure Web Application Firewall (WAF). All traffic to the web app is routed through an Azure Application
Gateway instance that is used by multiple web apps. The web app address is contoso.azurewebsites.net.
All traffic must be secured with SSL. The Azure Application Gateway instance is used by multiple web apps.
You need to configure the Azure Application Gateway for the web app.
Which two actions should you perform? Each correct answer presents part of the solution.
NOTE: Each correct selection is worth one point.
  1. A In the Azure Application Gateway's HTTP setting, enable the Use for App service setting.
  2. B Convert the web app to run in an Azure App service environment (ASE).
  3. C Add an authentication certificate for contoso.azurewebsites.net to the Azure Application Gateway.
  4. D In the Azure Application Gateway's HTTP setting, set the value of the Override backend path option to contoso22.azurewebsites.net.
Xem giải thích

🧩 Phân tích chi tiết câu hỏi trắc nghiệm

📖 Nội dung câu hỏi:
Câu hỏi mô tả tình huống bạn đang phát triển một ứng dụng web (web app) được bảo vệ bởi Azure Web Application Firewall (WAF). Toàn bộ lưu lượng truy cập (traffic) đến web app được định tuyến qua một instance Azure Application Gateway được chia sẻ (shared) cho nhiều web app khác nhau. Địa chỉ của web app là contoso.azurewebsites.net. Yêu cầu chính là tất cả traffic phải được bảo mật bằng SSL/TLS. Application Gateway này được sử dụng chung cho nhiều web app.
Nhiệm vụ: Cấu hình Azure Application Gateway đặc biệt cho web app này. Câu hỏi là dạng multiple correct answers (chọn 2 hành động đúng, mỗi lựa chọn đúng đáng 1 điểm).
🔍 Mục tiêu cốt lõi: Tích hợp Application Gateway (làm frontend với WAF và SSL termination) với backend là Azure App Service (web app) trong môi trường multi-tenant, đảm bảo traffic HTTPS end-to-end, hỗ trợ SNI (Server Name Indication) và host header đúng cho tên miền tùy chỉnh của App Service. (Kiến thức cập nhật Azure 2024-2026: Application Gateway v2 hỗ trợ tích hợp native với App Service qua HTTP settings đặc biệt).

✅ Đáp án đúng (chọn 2):

Hai hành động đúng là:

  1. In the Azure Application Gateway's HTTP setting, enable the Use for App service setting.
    (Lý do: Bật tùy chọn này trong HTTP settings để Application Gateway tự động override host header và SNI cho backend App Service, tránh lỗi kết nối HTTPS ở môi trường multi-tenant.)

  2. Add an authentication certificate for contoso.azurewebsites.net to the Azure Application Gateway.
    (Lý do: Cần thêm chứng chỉ xác thực (authentication certificate) cho hostname backend chính xác của web app để Application Gateway verify SSL certificate của App Service khi kết nối HTTPS backend.)

🛠️ Lý do chọn hai đáp án này: Đây là quy trình chuẩn theo tài liệu Microsoft để integrate Application Gateway với App Service mà không cần ASE. Đảm bảo traffic SSL an toàn, WAF hoạt động, và routing đúng cho web app cụ thể trong shared gateway.

📋 Giải thích tất cả các phương án (đúng/sai)

Dưới đây là phân tích từng lựa chọn giữ nguyên văn bản gốc bằng tiếng Anh, kèm giải thích chi tiết bằng tiếng Việt. Tôi đánh dấu ✅ cho đúng, ❌ cho sai, dựa trên best practices Azure mới nhất (Application Gateway v2, App Service Standard/Premium).

  • ✅ In the Azure Application Gateway's HTTP setting, enable the Use for App service setting.
    Giải thích đúng: Tùy chọn "Use for App Service" (trong phần HTTP settings của backend pool) là bắt buộc khi dùng shared Application Gateway với App Service multi-tenant. Nó tự động set host header = backend FQDN (contoso.azurewebsites.net) và enable SNI cho kết nối HTTPS backend, tránh lỗi 502/503 do mismatch hostname. Không bật sẽ fail kết nối SSL. (Cập nhật 2024: Tính năng này được khuyến nghị thay thế pick-hostname-from-backend-path cũ).

  • ❌ Convert the web app to run in an Azure App service environment (ASE).
    Giải thích sai: ASE (App Service Environment) là môi trường isolated/private (v1/v2/v3), dùng cho workload cao hoặc private IP, không cần thiết ở đây vì web app đang ở public multi-tenant (*.azurewebsites.net). Việc convert sang ASE tốn kém, phức tạp, và không giải quyết vấn đề config gateway shared với SSL. Đây là overkill, không phải giải pháp cho WAF/gateway integration.

  • ✅ Add an authentication certificate for contoso.azurewebsites.net to the Azure Application Gateway.
    Giải thích đúng: Trong listener/backend HTTP settings, phải upload authentication certificate (public cert của App Service, tải từ Kudu hoặc portal) cho hostname chính xác contoso.azurewebsites.net. Điều này cho phép gateway verify SSL cert backend khi dùng HTTPS, hỗ trợ multi-site SNI trên shared gateway. Không có cert sẽ lỗi kết nối backend.

  • ❌ In the Azure Application Gateway's HTTP setting, set the value of the Override backend path option to contoso22.azurewebsites.net.
    Giải thích sai: "Override backend path" chỉ dùng để rewrite đường dẫn (path) sau backend FQDN (ví dụ: /api thay vì /), không phải để set hostname/FQDN. Hơn nữa, giá trị sai (contoso22 thay vì contoso), sẽ gây routing fail. Không liên quan đến SSL hoặc App Service integration; dùng sai sẽ break traffic.

📘 Tài liệu tham khảo (Microsoft Docs cập nhật 2024-2026)

Hy vọng phân tích này giúp bạn nắm vững! Nếu cần demo PowerShell/ARM template, hỏi thêm nhé 🚀.

Câu 308 Chọn nhiều đáp án
You are updating an application that stores data on Azure and uses Azure Cosmos DB for storage. The application stores data in multiple documents associated with a single username.

The application requires the ability to update multiple documents for a username in a single ACID operation.

You need to configure Azure Cosmos DB.

Which two actions should you perform? Each correct answer presents part of the solution.

NOTE: Each correct selection is worth one point.
  1. A Create a collection sharded on username to store documents.
  2. B Configure Azure Cosmos DB to use the Gremlin API.
  3. C Create an unsharded collection to store documents.
  4. D Configure Azure Cosmos DB to use the MongoDB API.
Xem giải thích

🧩 Phân tích chi tiết câu hỏi trắc nghiệm

📖 Nội dung câu hỏi được giải thích rõ ràng:
Câu hỏi mô tả một ứng dụng đang cập nhật, lưu trữ dữ liệu trên Azure sử dụng Azure Cosmos DB. Ứng dụng lưu nhiều tài liệu (documents) liên kết với một username duy nhất. Yêu cầu chính là cập nhật nhiều documents cho cùng một username trong một hoạt động ACID duy nhất (Atomicity, Consistency, Isolation, Durability – đảm bảo tính toàn vẹn giao dịch).
Nhiệm vụ là cấu hình Azure Cosmos DB bằng cách chọn hai hành động đúng (mỗi lựa chọn đúng trị giá 1 điểm).
🔑 Vấn đề cốt lõi: Azure Cosmos DB hỗ trợ giao dịch ACID đa tài liệu (multi-document transactions) chỉ trong một logical partition duy nhất. Với API MongoDB, tính năng này chỉ khả dụng trên unsharded collections (single-partition containers), không hỗ trợ trên sharded/partitioned collections, dù các documents có cùng partition key (như username). Điều này dựa trên tài liệu Microsoft cập nhật đến 2024-2026 (không có thay đổi lớn ở phiên bản mới nhất).

✅ Đáp án đúng và lý do lựa chọn

Hai đáp án đúng:

  • Create an unsharded collection to store documents.
  • Configure Azure Cosmos DB to use the MongoDB API.

Lý do chọn (chi tiết):
🛠️ Unsharded collection: Tạo container không phân vùng (single-partition), tất cả documents nằm trong một logical partition duy nhất, cho phép giao dịch ACID cập nhật nhiều documents (của cùng username) mà không vượt partition. Điều này phù hợp hoàn hảo với yêu cầu, vì MongoDB API chỉ hỗ trợ multi-document transactions trên loại container này.
🛠️ MongoDB API: API này mô phỏng MongoDB v4.2+, hỗ trợ multi-document ACID transactions một cách tự nhiên qua các lệnh như session.startTransaction(). Kết hợp với unsharded collection, đảm bảo cập nhật nhiều documents cho username trong một giao dịch duy nhất.
✅ Kết hợp hai hành động này giải quyết vấn đề scalable ở mức nhỏ, phù hợp ứng dụng yêu cầu ACID strict.

❌ Phân tích tất cả các phương án (đúng/sai)

  • Create a collection sharded on username to store documents. ❌ SAI
    Phương án này tạo container phân vùng (sharded/partitioned) với partition key là "username", giúp nhóm documents của cùng user vào một partition. Tuy nhiên, với MongoDB API (hoặc các API khác), multi-document transactions KHÔNG được hỗ trợ trên partitioned collections. Giao dịch chỉ giới hạn single-document hoặc cần stored procedures phức tạp ở SQL API. Không đáp ứng yêu cầu ACID đa documents.

  • Configure Azure Cosmos DB to use the Gremlin API. ❌ SAI
    Gremlin API dành cho graph database (lưu trữ nút và cạnh), không phải document model. Không hỗ trợ documents hoặc multi-document transactions ACID như yêu cầu. Sử dụng sẽ làm ứng dụng không tương thích với dữ liệu documents liên kết username.

  • Create an unsharded collection to store documents. ✅ ĐÚNG
    Tạo container không phân vùng (single-partition, giới hạn ~10-20GB tùy config), tất cả documents ở một partition duy nhất. Kết hợp MongoDB API, cho phép ACID transactions trên nhiều documents mà không lo cross-partition, lý tưởng cho dữ liệu username cụ thể.

  • Configure Azure Cosmos DB to use the MongoDB API. ✅ ĐÚNG
    API này hỗ trợ MongoDB wire protocol, bao gồm multi-document transactions ACID chỉ trên unsharded collections. Ứng dụng có thể dùng withTransaction hoặc sessions để cập nhật nhiều documents cho username trong một ACID operation, đảm bảo tính nhất quán.

📘 Tài liệu tham khảo (cập nhật mới nhất đến 2026)

💡 Lời khuyên từ Azure Developer: Nếu scale lớn, cân nhắc SQL API + Stored Procedures với partition key=username. Unsharded phù hợp dữ liệu nhỏ! 🚀

Câu 309
You deploy an Azure App Service web app. You create an app registration for the app in Azure Active Directory (Azure AD) and Twitter.
The app must authenticate users and must use SSL for all communications. The app must use Twitter as the identity provider.
You need to validate the Azure AD request in the app code.
What should you validate?
  1. A ID token header
  2. B ID token signature
  3. C HTTP response code
  4. D Tenant ID
Xem giải thích

🧩 Phân tích chi tiết nội dung câu hỏi

Câu hỏi này thuộc lĩnh vực xác thực và ủy quyền (authentication & authorization) trong Microsoft Azure App Service kết hợp với Azure Active Directory (Azure AD, nay là Microsoft Entra ID) và Twitter (nay là X) làm nhà cung cấp danh tính (identity provider - IdP).

  • Bối cảnh: Bạn triển khai một ứng dụng web trên Azure App Service. Ứng dụng này được đăng ký (app registration) ở cả Azure AD và Twitter.
    • Ứng dụng phải xác thực người dùng (authenticate users).
    • Sử dụng SSL/TLS cho tất cả giao tiếp (để đảm bảo an toàn).
    • Twitter là IdP chính (nghĩa là người dùng đăng nhập qua Twitter, không phải trực tiếp Azure AD).
  • Yêu cầu cụ thể: Trong mã nguồn ứng dụng (app code), bạn cần xác thực (validate) yêu cầu từ Azure AD. Điều này liên quan đến quy trình OpenID Connect (OIDC) hoặc OAuth 2.0, nơi Azure AD đóng vai trò trung gian để trao đổi token từ Twitter và phát hành ID token (JWT token chứa thông tin người dùng).
  • Mục tiêu: Đảm bảo ID token nhận được từ Azure AD là hợp lệ, không bị giả mạo, bằng cách kiểm tra các yếu tố bảo mật chuẩn trong OIDC/JWT validation flow (theo RFC 7519 & OIDC specs).

🛠️ Kiến thức cốt lõi (cập nhật đến 2026): Trong Microsoft Entra ID (Azure AD v2), khi tích hợp external IdP như Twitter/X qua App registrations hoặc Enterprise applications, ứng dụng phải validate ID token theo các bước:

  • Kiểm tra issuer (iss), audience (aud), expiration (exp).
  • Quan trọng nhất: Xác minh chữ ký (signature) bằng public key từ endpoint JWKS (JSON Web Key Set) của Entra ID.
  • Điều này áp dụng cho cả Azure AD B2C (social logins) và workforce apps với federated IdP.

📘 Tài liệu tham khảo:

✅ Đáp án đúng: ID token signature

Lý do lựa chọn:

  • Trong mã ứng dụng, bước validate ID token signature là bắt buộc và quan trọng nhất để xác minh tính toàn vẹn và nguồn gốc của token từ Azure AD.
  • Signature được tạo bằng private key của Azure AD và được verify bằng public key từ JWKS endpoint (https://login.microsoftonline.com/{tenant}/discovery/v2.0/keys).
  • Nếu bỏ qua, ứng dụng dễ bị tấn công token replay hoặc signature forgery. Đây là thực hành chuẩn theo OIDC Core 1.0 (RFC 6749 & OIDC specs, không thay đổi đến 2026).
  • Với Twitter làm IdP, Azure AD vẫn phát hành ID token riêng, cần validate signature để tin tưởng.

🧩 Giải thích tất cả các phương án (đúng/sai)

  • ❌ ID token header
    Phương án này sai vì header của ID token (JWT header) chỉ chứa metadata như thuật toán mã hóa (alg: RS256/ES256) và loại token (typ: JWT). Nó không đủ để validate tính xác thực. Header dễ bị thay đổi nếu token bị tamper, và chỉ kiểm tra header không ngăn chặn tấn công. Theo docs, header chỉ là bước kiểm tra sơ bộ (thuật toán blacklist như "none"), không thay thế signature verification.

  • ✅ ID token signature
    Phương án này đúng như đã giải thích ở trên. Đây là bước core validation trong mọi app code xử lý ID token từ Azure AD/Entra ID, đảm bảo token không bị sửa đổi và đúng từ issuer. Sử dụng thư viện như MSAL.js, jsonwebtoken (Node.js) hoặc Microsoft.Identity.Web (.NET) để tự động verify.

  • ❌ HTTP response code
    Phương án này sai vì HTTP response code (như 200 OK) chỉ kiểm tra mức mạng/transport layer (SSL đã đảm bảo), không validate nội dung token. Nó không liên quan đến Azure AD request validation trong app code. Response code hữu ích cho error handling (ví dụ: 401 Unauthorized), nhưng không phải để confirm ID token legitimacy.

  • ❌ Tenant ID
    Phương án này sai vì Tenant ID (trong claim tid của ID token) chỉ xác định Azure AD tenant phát hành token (multi-tenant apps). Nó không phải bước validate chính, chỉ là kiểm tra bổ sung sau signature. Với Twitter IdP, tenant ID vẫn cần match nhưng không đủ để chống giả mạo token. Sai lầm phổ biến: nhầm với issuer validation (iss claim).

🛠️ Lời khuyên thực hành: Sử dụng thư viện official như Microsoft.Identity.Web (cho .NET trên App Service) để tự động handle toàn bộ validation flow, bao gồm signature! 🚀

Câu 310 Chọn nhiều đáp án
You develop an ASP.NET Core app that uses Azure App Configuration. You also create an App Configuration containing 100 settings.

The app must meet the following requirements:

•Ensure the consistency of all configuration data when changes to individual settings occur.
•Handle configuration data changes dynamically without causing the application to restart.
•Reduce the overall number of requests made to App Configuration APIs.

You must implement dynamic configuration updates in the app.

What are two ways to achieve this goal? Each correct answer presents part of the solution.

NOTE: Each correct selection is worth one point.
  1. A Create and register a sentinel key in the App Configuration store. Set the refreshAll parameter of the Register method to true.
  2. B Increase the App Configuration cache expiration from the default value.
  3. C Decrease the App Configuration cache expiration from the default value.
  4. D Create and configure Azure Key Vault. Implement the Azure Key Vault configuration provider.
  5. E Register all keys in the App Configuration store. Set the refreshAll parameter of the Register method to false.
  6. F Create and implement environment variables for each App Configuration store setting.
Xem giải thích

🧩 Giải thích nội dung câu hỏi

Câu hỏi này thuộc lĩnh vực phát triển ứng dụng ASP.NET Core sử dụng Azure App Configuration (một dịch vụ quản lý cấu hình tập trung của Azure). Ứng dụng có 100 settings lưu trữ trong App Configuration store. Các yêu cầu chính bao gồm:

  • Đảm bảo tính nhất quán của toàn bộ dữ liệu cấu hình khi có thay đổi ở một setting cá nhân (tránh tình trạng một số setting cập nhật muộn).
  • Xử lý thay đổi động (dynamic updates) mà không cần restart ứng dụng.
  • Giảm số lượng requests đến API của App Configuration (tối ưu hiệu suất bằng cách giảm polling liên tục).

Mục tiêu là triển khai dynamic configuration updates với hai cách (mỗi cách đúng chiếm 1 điểm). Đây là câu hỏi kiểu multi-select (chọn nhiều đáp án đúng), tập trung vào tính năng reactive refresh và cache management của Azure App Configuration .NET provider (phiên bản mới nhất đến 2026: hỗ trợ .NET 8+ với Microsoft.Extensions.Configuration.AzureAppConfiguration v6.x+).

📘 Tài liệu tham khảo:

✅ Đáp án đúng (hai phương án)

Hai đáp án đúng là:

  1. Create and register a sentinel key in the App Configuration store. Set the refreshAll parameter of the Register method to true.
    🛠️ Lý do chọn: Sentinel key là một "key giám sát" đặc biệt. Khi sentinel thay đổi (ví dụ: admin cập nhật giá trị của nó), provider sẽ tự động refresh toàn bộ cấu hình (refreshAll=true), đảm bảo tính nhất quán cho tất cả 100 settings mà không restart app. Điều này hỗ trợ reactive mode (push-based), giảm requests không cần thiết vì chỉ poll khi có thay đổi thực sự.

  2. Increase the App Configuration cache expiration from the default value.
    🛠️ Lý do chọn: Giá trị mặc định cache expiration là 30 giây. Tăng lên (ví dụ: 5-10 phút) giúp giảm tần suất polling requests đến API, tối ưu hiệu suất cho app lớn với 100 settings. Vẫn hỗ trợ dynamic refresh qua cache invalidate khi cần, không ảnh hưởng restart.

📋 Giải thích tất cả các phương án (đúng/sai)

Dưới đây là phân tích chi tiết từng lựa chọn, giữ nguyên văn bản gốc tiếng Anh:

✅ Create and register a sentinel key in the App Configuration store. Set the refreshAll parameter of the Register method to true.
🛠️ Phương án ĐÚNG. Như đã giải thích ở trên, sentinel key kích hoạt refresh toàn bộ (refreshAll=true) khi thay đổi, đảm bảo consistency và dynamic updates với ít requests hơn.

✅ Increase the App Configuration cache expiration from the default value.
🛠️ Phương án ĐÚNG. Tăng cache expiration giảm số requests polling (pull mode), phù hợp yêu cầu giảm API calls, vẫn hỗ trợ dynamic refresh.

❌ Decrease the App Configuration cache expiration from the default value.
🛠️ Phương án SAI. Giảm cache (ví dụ: từ 30s xuống 10s) sẽ tăng số requests đến API (polling thường xuyên hơn), trái ngược yêu cầu "reduce overall number of requests". Không cải thiện consistency mà còn làm kém hiệu suất.

❌ Create and configure Azure Key Vault. Implement the Azure Key Vault configuration provider.
🛠️ Phương án SAI. Key Vault dùng cho secrets an toàn (không phải dynamic config refresh). Nó không hỗ trợ refreshAll hay cache cho App Configuration settings thông thường, chỉ tích hợp references. Không giải quyết consistency cho 100 settings hay giảm requests trực tiếp.

❌ Register all keys in the App Configuration store. Set the refreshAll parameter of the Register method to false.
🛠️ Phương án SAI. Đăng ký tất cả 100 keys với refreshAll=false chỉ refresh key cá nhân khi thay đổi, dẫn đến không nhất quán (một số settings cũ). Tăng chi phí ban đầu và requests cao hơn so với sentinel (chỉ cần 1 key).

❌ Create and implement environment variables for each App Configuration store setting.
🛠️ Phương án SAI. Environment variables là tĩnh (static), yêu cầu restart app để áp dụng thay đổi, không hỗ trợ dynamic updates. Không liên quan App Configuration APIs, không giảm requests hay đảm bảo consistency cho 100 settings.

🎯 Tóm tắt: Kết hợp sentinel key (reactive refresh) + tăng cache expiration là giải pháp tối ưu nhất theo docs Azure mới nhất, phù hợp scale lớn!