Micro-frontend Learning
Xử lý sự cố

Checklist debug và FAQ

Runbook debug micro-frontend theo bằng chứng: kiểm tra Network, Console, manifests, release versions, telemetry và xác nhận phục hồi.

Shell vẫn hiện header, catalog không mở được, còn cart chỉ lỗi trên một số tab sau deploy. Bạn nên kiểm tra URL, cache hay React trước? Bắt đầu bằng bước đầu tiên có bằng chứng sai, không bằng config dễ chỉnh nhất.

Trang này là checklist dùng xuyên suốt một lần điều tra: giữ lần lỗi ban đầu, xác định document đang dùng tổ hợp release nào, khoanh vùng boundary rồi chuyển sang runbook chuyên sâu. Mình ưu tiên mỗi lần thử chỉ thay một yếu tố; xóa cache, đổi URL và nâng dependency cùng lúc có thể làm lỗi biến mất nhưng không giải thích được nguyên nhân.

Phạm vi và cách dùng

Ví dụ dùng shop giả định gồm shell, catalog và cart. Lab webpack 5 dùng shell ở http://localhost:3000, catalog ở http://localhost:3001, container shop_catalog và public key ./CatalogPage. URL production, release IDs và dữ liệu incident bên dưới đều là minh họa, không phải deployment có sẵn trong repository tài liệu này.

Checklist áp dụng cho nhiều cách tích hợp; các kiểm tra webpack classic script, Module Federation enhanced, ESM và SSR được ghi rõ phạm vi. Khi đã xác định lớp lỗi, dùng bài chuyên sâu thay vì thử mọi nhánh trong checklist.

Mục lục

Trình tự xử lý khi đang có incident

Giảm ảnh hưởng

Xác định journey bị ảnh hưởng: mở catalog, xem sản phẩm hay thao tác cart. Nếu lỗi xuất hiện cùng rollout và đang lan rộng, pause rollout theo quy trình vận hành, giữ fallback do shell sở hữu và thông báo phần chức năng chưa dùng được.

Không biến một lỗi load thành thành công giả. Nếu thao tác ghi dữ liệu chưa rõ kết quả, kiểm tra trạng thái backend trước khi yêu cầu người dùng thử lại.

Giữ bằng chứng ban đầu

Ghi route, thao tác, thời điểm kèm timezone và release context trước khi reload. Bật Preserve log ở Network và Console cho lần tái hiện tiếp theo, rồi giữ request hoặc error đầu tiên liên quan.

Nếu log ban đầu đã mất, ghi rõ điều đó. Đừng gán response của lần reload sau cho lần lỗi trước.

Tìm boundary đầu tiên bị lỗi

Đi theo luồng phía dưới: document/config → resolve remote → entry/chunks → initialize/evaluate → mount/render → API và giao tiếp. Một lỗi xảy ra sớm có thể tạo nhiều lỗi downstream; xử lý nơi khởi phát trước.

Khi có bằng chứng đủ rõ, chuyển sang runbook trong bảng triệu chứng. Không cần kiểm tra shared React nếu request entry đang trả HTML.

Kiểm chứng giả thuyết rồi sửa đúng owner

Viết một giả thuyết có thể kiểm tra, chẳng hạn: “document pin catalog r18 nhưng chunk lazy r18 đã bị cleanup”. Ghi phép kiểm chứng và kết quả, sau đó chọn thay đổi nhỏ nhất ở đúng lớp.

Sau khi sửa, chạy lại journey ban đầu trên document cũ và mới nếu sự cố liên quan deploy. Chỉ một tab của người điều tra chạy được chưa đủ để kết luận production đã phục hồi.

Chọn nhánh điều tra theo triệu chứng

Triệu chứng quan sát đượcKiểm tra trướcRunbook phù hợp
Shell không khởi động, config parse/validate thất bạiDocument, config response, schema và bootstrap errorRuntime configuration
Không có request remote khi mở routeRoute/flag, alias resolution, Console blocked reasonRemote không tải được
Entry/chunk lỗi HTTP, MIME, CORS hoặc CSPRequest URL, body, redirect và browser policyRemote không tải được
Tab cũ lỗi sau deploy, lazy chunk không cònRelease pin trong tab, inventory origin, lớp cache trả responseCache lỗi thời và chunk errors
Shared version mismatch hoặc initialize thất bạiShare scope, provider được chọn, version constraintsShared version mismatch
Invalid hook callStack, Rules of Hooks, React identity và renderer compatibilityDuplicate React
Refresh 404, Back sai màn hình, CSS bị ảnh hưởngDocument routing, history owner, asset URL, winning declarationLỗi routing và CSS
Module tải được nhưng UI không ready hoặc API lỗiMount/render boundary, handshake và API/command outcomesObservability, Hợp đồng giao tiếp

Error string là chỉ dẫn chọn nơi xem, không phải kết luận. Ví dụ ChunkLoadError có thể do asset thiếu, sai publicPath, timeout hoặc policy chặn; nó không tự chứng minh cache sai.

Checklist bằng chứng tối thiểu

  • Môi trường, browser/version, route đã normalize và thao tác tái hiện cụ thể.
  • Lỗi xảy ra khi click trong app, mở trực tiếp, refresh, Back/Forward hay sau khi tab để lâu.
  • Thời điểm kèm timezone; thời điểm tab khởi động nếu biết; mốc deploy/config change liên quan.
  • Shell release thực tế, config revision đang dùng, remote release được chọn và release thực tế nếu đã có metadata.
  • Error đầu tiên, stack và boundary sở hữu lỗi; ghi riêng các lỗi xuất hiện sau đó.
  • Request URL liên quan, status hoặc blocked reason, response body/MIME, redirect chain và Initiator.
  • Response đến từ network, HTTP cache, service worker hay CDN; ghi unknown nếu chưa xác định.
  • Phạm vi ảnh hưởng từ telemetry: journey, cohort, tổ hợp release và nhóm đối chứng.
  • Những thử nghiệm đã làm, mỗi lần thay gì, kết quả và hành động giảm ảnh hưởng hiện tại.

Không ghi “latest” thay cho build ID. Không biết remote đã chạy release nào thì ghi chưa xác nhận, thay vì lấy version trên trang dashboard deploy để điền vào.

Rà soát dữ liệu trước khi chia sẻ

HAR, screenshot, stack, response body và Copy as cURL có thể chứa cookie, Authorization, signed URL, query hoặc dữ liệu người dùng. HAR sanitized của Chrome giảm rủi ro bằng cách bỏ một số headers nhạy cảm, nhưng không đảm bảo mọi URL và body đã sạch. Rà soát thủ công, chỉ giữ phần cần thiết và chia sẻ qua kênh được phép.

Không xóa toàn bộ storage, unregister service worker hay tắt browser security trước khi giữ bằng chứng. Những thao tác đó có thể mất session hoặc dữ liệu chưa lưu và làm thay đổi điều kiện tái hiện.

Kiểm tra Network và Console

Theo đường tải thực tế

direction: down
n0: "Document / config"
n1: "Resolve remote"
n2: "Entry + dependency graph"
n3: "Initialize / evaluate"
n4: "Mount / render / ready"
n5: "API / events / commands"
n0 -> n1 -> n2 -> n3 -> n4 -> n5
Document / configResolve remoteEntry + dependency graphInitialize / evaluateMount / render / readyAPI / events / commands
Document / configResolve remoteEntry + dependency graphInitialize / evaluateMount / render / readyAPI / events / commands
Theo đường tải thực tế

Đây là các boundary để khoanh vùng, không phải thứ tự nội bộ bắt buộc: runtime có thể tải shared modules và chunks xen kẽ, hoặc preload trước khi route mở.

  1. Kiểm tra request Document nếu shell không lên hoặc deep link lỗi. Với SPA tĩnh, response phải là shell HTML đúng; với SSR, kiểm tra server response theo framework.
  2. Tìm config hoặc manifest mà document thực sự consume. Nếu config được nhúng vào HTML hoặc remotes được chốt lúc build, không có request config riêng là bình thường.
  3. Đối chiếu Request URL của entry với descriptor đã resolve. Bỏ bộ lọc Network nếu không thấy request; CSP/mixed content có thể chặn trước khi gửi.
  4. Khi entry thành công, theo Initiator tới chunk, module, CSS hoặc font liên quan. Giữ request thất bại đầu tiên trong đường này.
  5. Nếu graph tải được, xem lỗi initialize/evaluate/mount. Network toàn 200 không chứng minh code đã chạy thành công.
  6. Khi UI đã mount, tách API/command failure khỏi loader failure. API 401 không mặc nhiên là lỗi CORS của remote.

Chọn đúng execution context của shell, iframe hoặc worker trong DevTools. Console của tab standalone không cho biết runtime trong shell; với SSR, server logs cũng không thay thế Console của browser.

Đọc response thay vì chỉ đọc status

Quan sátCần xác nhận thêm
Entry 200Body là JavaScript đúng artifact, MIME phù hợp, không phải HTML fallback/login
Manifest 200JSON parse được, đúng loại manifest và schema runtime hỗ trợ
Redirect 301/302Location, origin đích, auth/CDN rewrite và response cuối
304Response đã cache được tái sử dụng, validator và body cache thuộc artifact nào
Chunk 404URL có đúng prefix không; origin thiếu file hay edge giữ negative cache
HTTP thành công nhưng Console báo blockedDirective CSP, CORS loading mode, CORP/COEP, MIME hoặc integrity mismatch nếu có
from ServiceWorkerWorker/controller và chiến lược Cache Storage đang chọn response nào
Request pending hoặc timeoutTiming, network condition, deadline của loader và giới hạn retry

Đọc Cache-Control, Age, ETag, Vary và headers cache của nhà cung cấp cùng nhau. Age không phải tuổi của release; ETag không mặc nhiên là commit/build ID nếu pipeline chưa định nghĩa ánh xạ đó. Một header riêng lẻ không đủ xác định owner của bytes sai.

Kiểm chứng HTTP bằng curl

Ví dụ sau dùng GET tới catalog của lab đang chạy, lưu kết quả vào thư mục tạm, không ghi đè file trong workspace:

Quan sát response của remote entry
ENTRY_URL='http://localhost:3001/remoteEntry.js'
CHECK_DIR="$(mktemp -d)"

curl --silent --show-error \
  --connect-timeout 5 --max-time 15 \
  --dump-header "$CHECK_DIR/headers.txt" \
  --output "$CHECK_DIR/body.txt" \
  --write-out 'status=%{http_code}\nurl=%{url_effective}\n' \
  "$ENTRY_URL"

cat "$CHECK_DIR/headers.txt"
head -c 300 "$CHECK_DIR/body.txt"
printf '\nKết quả lưu tại: %s\n' "$CHECK_DIR"

Timeouts là giá trị minh họa cho chẩn đoán, không phải SLO. Lệnh không follow redirect để bạn thấy response đầu tiên và không dùng --fail để giữ body lỗi HTTP. Đọc cả exit status của curl và HTTP status: curl có thể thoát thành công khi endpoint trả 404.

Kết quả mong đợi cho GET mới là 200, MIME JavaScript và body của entry; đây vẫn chỉ là kiểm chứng HTTP. Curl không thực thi JavaScript, CORS/CSP, service worker hay module cache của tab. Dùng cùng URL thực tế từ browser khi kiểm tra production, không tự thêm token hoặc signed query vào log chia sẻ.

Đối chiếu manifests và release versions

Phân biệt các loại manifest

LoạiVai tròCách kiểm tra
Application runtime configTeam chọn remote release, URL, flags và environmentSnapshot shell consume, schema validation, revision và selection policy
mf-manifest.jsonMetadata do integration Module Federation enhanced sinhRuntime/plugin version, entry descriptor, assets và resolution thực tế
Import mapÁnh xạ ESM specifier tới URLMap hiệu lực lúc resolution, imports/scopes và URL module
remoteEntry.js dạng webpack scriptExecutable container entry, không phải JSON configContainer name, public key, runtime graph và format

Config của ứng dụng có thể chọn một URL federation manifest, rồi runtime đọc manifest để tìm entry. Đừng đưa mf-manifest.json vào loader classic script mong đợi JavaScript, hoặc dùng validator của config shop để kết luận federation manifest “sai schema”.

Đối chiếu snapshot đã dùng lúc resolve, không fetch config hiện tại rồi coi đó là snapshot của tab lỗi. Endpoint có thể đã đổi revision trong lúc document vẫn pin revision cũ. Với remotes compile-time, URL nằm trong shell artifact; đổi biến môi trường của hosting không tự cập nhật bundle đã build.

Lập release map của document đang lỗi

Một release map cần phân biệt ba loại bằng chứng: config đã chọn gì, network đã trả gì và module đã báo metadata gì. Bảng sau là mẫu ghi nhận, không phải API bắt buộc:

Thành phầnThông tin cần ghiNguồn bằng chứng
ShellBuild ID thực tế trong documentMetadata nhúng trong shell artifact
ConfigRevision và environment đã consumeSnapshot của bootstrap/resolver
Catalog được chọnCandidate release và entry/manifest URLDescriptor sau validation/resolution
Catalog đã chạyBuild ID từ metadata của module hoặc mount handshake; có thể chưa biếtMetadata nhúng lúc build, sau khi module execute
CartCandidate và actual release riêngDescriptor và handshake riêng của cart
Asset graphEntry/chunk/CSS URLs, hashes nếu cóNetwork và artifact inventory/pipeline
Shared providerRuntime/provider version được chọnRuntime inspection theo integration

Nếu load thất bại trước khi module execute, chỉ biết candidate release; không điền actual bằng candidate. Metadata tự khai báo là bằng chứng chẩn đoán cần đối chiếu artifact inventory, không phải cơ chế xác thực code đáng tin cậy.

Hai tab chạy catalog r18 và r19 có thể đều đúng nếu policy pin release theo document. Điều cần kiểm tra là mỗi tab có graph nhất quán và còn tải được lazy chunks trong cửa sổ hỗ trợ. “Không chạy bản mới nhất” khác với “nhận bytes sai tại URL bất biến”.

Kiểm tra contract và tổ hợp tương thích

  • Schema version của config được shell đang chạy hỗ trợ.
  • Environment, flag/cohort và URL allowlist khớp policy của shell.
  • Host alias, container name, remote format và public key khớp integration.
  • Remote contract version, export shape hoặc mount handshake được shell chấp nhận.
  • Shared version constraints, singleton policy và provider selection đúng contract đã test.
  • Tổ hợp shell/catalog/cart hiện tại có bằng chứng contract hoặc integration test; không chỉ từng app standalone pass.
  • Với rollback target, toàn bộ entry, chunks, CSS và source maps cần thiết vẫn được giữ theo policy.

Version package trong source mới nhất không chứng minh version đang chạy. npm ls trong workspace giúp xem dependency tree của build đó, nhưng không tự chứng minh browser có một React identity hay share scope đã chọn provider nào.

Kiểm tra runtime đúng format

Webpack classic script

Sau khi shell đã thử tải catalog của lab, chọn Console context của shell và chỉ đọc container:

Chỉ cho container shop_catalog trong lab webpack script
const container = globalThis.shop_catalog;
({
  present: Boolean(container),
  get: typeof container?.get,
  init: typeof container?.init,
});

Kỳ vọng present: true, get: 'function', init: 'function'. Nếu thiếu, kiểm tra format, tên container và error lúc execute entry. Nếu có, mới chuyển sang public key ./CatalogPage, share initialization và lỗi module.

Không tự gọi container.init({}), ghi đè global hay chèn entry của release khác vào document để “reset”. Việc đó thay runtime state, có thể tạo container/share-scope conflict và phá tính hợp lệ của phép so sánh. Không có public reset chung áp dụng cho mọi integration.

Module Federation enhanced và ESM

Trong integration enhanced có hỗ trợ debug globals, xem dữ liệu đã được runtime công bố:

Quan sát nếu integration hiện tại cung cấp các globals này
({
  federation: globalThis.__FEDERATION__,
  shared: globalThis.__SHARE__,
});

Theo tài liệu runtime tương ứng, __FEDERATION__ chứa thông tin federation sau initialization; __SHARE__ giúp quan sát trạng thái shared modules. Đọc instance, module resolution và provider/version liên quan, nhưng không sửa các globals. Structure và khả năng có mặt phụ thuộc integration/version; thiếu globals không tự chứng minh remote lỗi và webpack core không bắt buộc cung cấp chúng.

Với ESM remote, container có thể nằm trong module namespace thay vì window. Kiểm tra module URL, imports, MIME, CORS và export contract của plugin. Đừng thêm global chỉ để snippet webpack bên trên trả true.

SSR và hydration

Ghi riêng server release/config snapshot và browser release/config snapshot. Server consume remote thành công không chứng minh browser tải được client graph; localhost trên server và trong browser cũng không cùng đích.

Nếu hydration lỗi, đối chiếu release pin giữa HTML server render và client bootstrap, dữ liệu đầu vào, shared framework compatibility và stack phía browser. Dùng logs/traces phía server cho lỗi server, Console/Network phía client cho lỗi client; không gom hai lỗi thành một kết luận “CORS”. Xem thêm Next.js và SSR.

Dùng telemetry để xác định phạm vi

Bắt đầu từ journey và khoảng thời gian có deploy/config change, rồi chia theo môi trường, shell release, candidate/actual remote release, config revision và cohort. So sánh với tổ hợp chưa rollout cùng journey; lỗi tăng ngay sau deploy là tương quan để điều tra, chưa đủ chứng minh deploy là nguyên nhân.

Câu hỏiBằng chứng cần tìm
Lỗi ở bước nàoLoad outcome, initialize/mount/render errors hoặc API/command outcome
Ai tạo event và ai bị ảnh hưởngapp_name, app_release, subject_app, subject_release nếu dùng schema của series
Document dùng cấu hình nàoshell_release, config_revision, release map
Cùng một thao tác có những bước nàocorrelation_id; trace/span IDs khi có tracing hợp lệ
Stack thuộc source nàoMatching artifact/source map của build đó, không phải map của latest
Có bao nhiêu lượt bị ảnh hưởngFailure numerator và denominator cùng journey/cohort/cửa sổ đo

Các field trên là schema ứng dụng minh họa theo Observability, không phải tên bắt buộc của mọi SDK. Nếu subject_release ở load event chỉ là candidate, giữ nguyên ý nghĩa đó khi điều tra; chỉ gán actual release khi có bằng chứng module đã chạy.

Đừng kết luận remote “ready” chỉ vì import Promise resolve. Ready phải theo contract của journey, chẳng hạn route render được và dữ liệu thiết yếu đã sẵn sàng. Tách timeout, cancellation do navigation bị thay thế và failure thực sự để không làm sai tỷ lệ lỗi.

Nếu global handler chỉ biết app unknown, giữ thông tin đó, không đoán owner từ route. Với API lỗi, nối request/trace tới backend nếu propagation đã được triển khai và kiểm chứng; một correlation_id không tự tạo distributed trace.

Không có event chưa chắc là không có lỗi

SDK có thể chưa khởi động, endpoint bị CSP/content blocker chặn, queue chưa flush hoặc sampling bỏ event. Kiểm tra pipeline telemetry bằng tín hiệu kiểm thử được phép trong preview. Không sửa kết luận incident bằng cách đổi tags hoặc tắt alert; IDs chỉ dùng cho logs/traces, không làm metric labels có cardinality không giới hạn.

So sánh có kiểm soát

Sau khi giữ bằng chứng, chọn phép thử có thể bác bỏ giả thuyết. Ghi cả điều giữ nguyên và điều thay đổi.

Phép thửGiữ nguyênKết quả giúp phân biệt
Composed với standaloneRemote artifact, dữ liệu và environmentKhác integration, context, loading path hoặc policy; không tự xác định owner
Document cũ với document mớiNetwork và thao tácSnapshot/runtime pin cũ với selection mới; ghi release map của cả hai
Document mới, Disable cache khi DevTools mởURL/cohort và thao tácẢnh hưởng HTTP cache browser; không tự purge CDN hay bypass mọi worker
Một lần bật service-worker bypass bằng DevToolsURL/release dự kiến, cùng browserẢnh hưởng worker; kiểm tra có phát sinh request network và ghi release map mới
Profile sạch được phép dùngDeployment và quyền truy cập tương đươngExtension, storage hoặc browser state; auth/cohort khác thì chưa thể so trực tiếp
Preview pin một tổ hợp artifactInput và journey, flags đã ghi nhậnCompatibility của tổ hợp; không tự chứng minh mọi cohort production đã phục hồi
Đổi thứ tự mở catalog/cart trong previewCùng artifacts và viewportShared provider selection, CSS leakage hoặc lifecycle dependency

Disable cache chỉ có tác dụng theo công cụ browser khi bật; nó không xóa module đã evaluate. Nếu lỗi không tạo request mới, xem runtime/module cache và snapshot trước khi chỉnh cache headers.

Không bật query cache-buster ngẫu nhiên cho mọi asset: nó có thể đổi cache key và che graph sai, nhưng không khôi phục chunk đã bị xóa. Không unregister worker hoặc xóa storage hàng loạt chỉ để đạt một lần test xanh.

Giảm ảnh hưởng và phục hồi an toàn

Bằng chứng đã cóHành động ưu tiênGiới hạn cần nhớ
Candidate mới gây lỗi, tổ hợp cũ đã được kiểm chứngPause rollout, publish selection/config revision rollback theo quy trìnhDocument đã tải code không tự đổi sang release cũ
Lazy chunk của release còn được hỗ trợ bị cleanupDừng cleanup, phục hồi artifact gốc; xử lý negative cache đúng key nếu cóPurge CDN không tạo lại file thiếu ở origin
Entry URL/publicPath hoặc hosting rewrite saiSửa mapping/hosting hoặc phát hành artifact/config đúngGiữ URL bất biến đúng bytes; không đổi MIME để che HTML body
Policy chặn origin hợp lệSửa directive/headers ở đúng lớp sau reviewKhông tắt CORS/CSP hay mở wildcard để chữa mọi lỗi
Một vùng remote lỗi, shell vẫn hoạt độngGiữ fallback, disable lần mount mới theo kill-switch contractFlag không unload code, không hủy mọi operation đang chạy
Một tab không thể phục hồi runtime an toànCho người dùng reload có kiểm soát sau khi xử lý dữ liệu chưa lưuKhông tạo reload loop; không hứa reload sửa được mọi nguyên nhân

Retry load phải có giới hạn, backoff và classification phù hợp runtime. Không retry liên tục lỗi schema, module key không tồn tại hoặc lỗi policy đã biết.

Với command ghi dữ liệu như thêm cart hoặc checkout, timeout không chứng minh backend chưa xử lý. Dùng operation/idempotency contract và xác minh kết quả trước khi retry; retry network loader và retry nghiệp vụ là hai việc khác nhau. Chi tiết vận hành ở Rollout và rollback và Resilience.

Ca mẫu entry thành công nhưng catalog không mở

Giả sử tab A đã mở trước deploy và pin catalog r18; tab B mở sau deploy chọn r19. Sau khi tab A vào một route lazy chưa tải, UI hiện fallback. Dữ liệu minh họa:

Tab A:
  shell release:         shell@demo-a
  config revision:       demo-config-42
  catalog candidate:     r18
  catalog actual:        r18 (metadata ghi nhận từ lần mount trước)
  entry response:        200, JavaScript r18, đã tải trước deploy
  lazy chunk request:    /catalog/releases/r18/product.demo.js → 404

Tab B:
  config revision:       demo-config-43
  catalog candidate:     r19
  same journey:          thành công

Chẩn đoán theo checklist:

  1. Giữ Network của tab A, xác nhận URL chunk thuộc r18 và không phải HTML fallback 200.
  2. Kiểm tra inventory origin qua công cụ được phép: chunk r18 không còn, trong khi artifact lưu trữ của r18 có file đó.
  3. Đối chiếu audit pipeline: cleanup đã xóa graph r18 khi publish r19. Đây là bằng chứng nguyên nhân; tab B chạy tốt một mình chưa chứng minh được điều này.
  4. Khôi phục nguyên artifact r18 từ bản lưu và dừng cleanup sớm. Nếu edge cache 404, invalidation đúng URL/key sau khi origin đã phục hồi.
  5. Thử lại lazy journey ở tab cũ nếu runtime hỗ trợ retry an toàn; nếu không, dùng phục hồi client có kiểm soát và kiểm thử tab pin r18 trong preview. Kiểm tra thêm tab mới r19.

Kết luận không phải “mọi người cần hard reload” hay “entry phải no-cache”. Selection của hai tab có thể đều đúng; sai ở availability của graph r18. Regression test nên giữ document cũ qua một lần deploy rồi mở route lazy, kèm kiểm tra retention của rollback target.

Checklist xác nhận đã sửa

  • Journey gây lỗi ban đầu thành công; không chỉ GET entry hoặc mở trang chủ.
  • Config/candidate/actual release có bằng chứng và graph khớp artifact inventory.
  • Deep link, refresh, Back/Forward và mount/unmount chạy đúng nếu lỗi chạm routing/lifecycle.
  • Tab cũ lẫn document mới được kiểm tra khi liên quan deploy/cache; có route lazy chưa tải.
  • Shell/catalog/cart chạy với tổ hợp rollback và rollout target đã kiểm chứng.
  • Fallback, timeout, retry và cancellation không tạo loop hoặc mất dữ liệu chưa lưu.
  • Command không bị thực hiện trùng; kết quả chưa rõ đã được reconcile theo contract.
  • Không nới security policy hoặc ghi đè URL immutable để làm test pass.
  • Telemetry có dữ liệu với denominator phù hợp; cohorts bị ảnh hưởng phục hồi trong cửa sổ quan sát đã thống nhất.
  • Source map đúng build; owner, nguyên nhân, thay đổi và evidence links đã được lưu.
  • Có regression test đúng boundary hoặc kiểm tra pipeline ngăn nguyên nhân tái diễn.

Smoke test xanh là bước đầu. Nếu sampling hoặc traffic thấp chưa đủ xác nhận tỷ lệ lỗi phục hồi, ghi trạng thái “đang quan sát” cùng tiêu chí kết thúc thay vì tuyên bố đã hết lỗi.

Mẫu bàn giao incident

Dùng mẫu này khi chuyển từ shell owner sang remote, CDN hoặc platform owner. Điền unknown cho phần chưa biết, không tự suy luận để đủ field.

Mẫu đã loại bỏ dữ liệu nhạy cảm
Incident / evidence links:
Environment, thời điểm và timezone:
Journey / route template:
Impact / cohorts / cửa sổ quan sát:
Browser và execution context:
Cách tái hiện, tab cũ hay document mới:

Shell actual release:
Config revision đã consume:
Remote alias / format / container / public key:
Remote candidate release + entry/manifest URL đã rà soát:
Remote actual release + nguồn metadata, hoặc unknown:
Các app/shared providers liên quan:

Boundary đầu tiên bị lỗi:
Error / stack đã sanitize:
Request URL đã rà soát, status/blocked reason, MIME, Initiator:
Response source / cache headers / body excerpt an toàn:
Correlation / trace / request IDs qua kênh nội bộ:

Giả thuyết:
Phép thử, yếu tố thay đổi và kết quả:
Hành động giảm ảnh hưởng hiện tại:
Thay đổi đề xuất / owner / rollback plan:
Kết quả kiểm chứng, phần chưa xác nhận và bước tiếp theo:

Khi escalation, gửi một request/stack đại diện và release map có nguồn, thay vì toàn bộ log không chọn lọc. Ghi rõ bạn cần owner kiểm tra gì, chẳng hạn “xác nhận chunk r18 còn ở origin và thời điểm cleanup”, để lần bàn giao có hành động cụ thể.

FAQ

Remote trả 200 thì đã loại trừ lỗi tải chưa

Chưa. 200 có thể là HTML/login, script không execute được hoặc entry đúng nhưng dependency graph lỗi. Kiểm tra body, MIME, browser policy, container/export và chunk tiếp theo. Import thành công cũng chưa chứng minh mount/render/ready đã thành công.

Standalone chạy được thì lỗi chắc chắn ở shell không

Không. Standalone có HTML, bootstrap, base URL, router và shared providers riêng; nó có thể không đi qua federated entry. So sánh cùng artifact trong hai đường chạy rồi tìm boundary khác nhau. Owner sửa lỗi có thể là shell, remote adapter, hosting hoặc contract chung.

Hard reload hết lỗi có chứng minh CDN cache sai không

Không. Reload tạo document/runtime mới, có thể nhận config, cohort hoặc worker controller khác; đồng thời ảnh hưởng browser cache. Ghi release map và nguồn response trước/sau, rồi kiểm tra từng lớp. Một lần reload hết lỗi chỉ cho biết điều kiện tái hiện đã thay đổi.

Đổi config rồi vì sao tab vẫn chạy release cũ

Document có thể pin snapshot, module đã evaluate hoặc remote đã mount. Config mới chỉ ảnh hưởng lần resolve theo contract của loader, không thay code đang chạy. Với giá trị compile-time như URL trong shell bundle hoặc client NEXT_PUBLIC_* của Next.js, đổi environment sau build không cập nhật bundle đó.

Không có telemetry có nghĩa là không còn lỗi không

Không. Kiểm tra SDK bootstrap, delivery, sampling và ingest health; đối chiếu Console/Network cùng lượng journey thực tế. Nếu không có denominator hoặc pipeline đang mất dữ liệu, chưa đủ bằng chứng để kết luận phục hồi.

Nên xử lý lỗi nào khi Console có nhiều lỗi

Ưu tiên lỗi liên quan journey tại boundary sớm nhất, dùng timing và Initiator để nối chuỗi. Chunk lỗi có thể làm mount thất bại rồi tạo thêm render error; telemetry endpoint lỗi lại có thể độc lập. Timestamp từ nhiều máy không đủ suy ra thứ tự chính xác: dùng correlation/trace context và bằng chứng trong cùng execution context.

Tài liệu tham khảo

Đọc tiếp

On this page