Bỏ qua để đến nội dung
Knowledge Hub

Glossary Cơ bản

Tra nhanh các thuật ngữ dùng trong bài viết. Mỗi mục giải thích phạm vi sử dụng và dẫn tới bài có ví dụ chi tiết.

Nhảy tới: A · B · C · D · E · F · G · H · I · J · K · L · M · O · P · Q · R · S · T · V · W

Table lock mạnh nhất của PostgreSQL, xung đột với mọi mode kể cả SELECT thường. Phần lớn ALTER TABLE, DROP TABLE, TRUNCATE, VACUUM FULL lấy mode này. Xem Table-level locks.

Lớp bọc một SDK hoặc API bên ngoài sau một interface do hệ thống của mình định nghĩa (port), để phần còn lại của code không phụ thuộc vào chi tiết nhà cung cấp. Xem Adapter pattern.

Văn bản ngắn ghi lại một quyết định kiến trúc: bối cảnh, quyết định, trạng thái và hệ quả (cả tốt lẫn xấu). ADR không sửa sau khi được chấp nhận; quyết định mới thì viết ADR mới thay thế. Xem ADR và tài liệu kỹ thuật.

Lock do ứng dụng quy ước ý nghĩa: PostgreSQL chỉ cấp và xếp chờ trên một số 64-bit (hoặc hai số 32-bit), không gắn với bảng hay row. Có loại session-level và transaction-level. Xem Advisory lock.

Lớp dịch ở phía downstream, chuyển mô hình của hệ thống ngoài sang mô hình của mình để khái niệm ngoại lai không rò vào bên trong. Khác với Published Language là phía upstream công bố. Xem Bounded context.

Unique index hoặc constraint NOT DEFERRABLE mà INSERT ... ON CONFLICT dùng để phát hiện conflict, chọn qua conflict target. Xem Upsert với ON CONFLICT.

Object bọc đối số của handler trong NestJS, dùng trong exception filter. Gọi switchToHttp(), switchToRpc() hoặc switchToWs() để lấy request/response hay data theo từng loại transport. Xem Exception filter.

API của Node.js gắn một store với async chain đang chạy để code sâu bên dưới đọc được context như requestId mà không cần truyền qua mọi hàm. Store chỉ tồn tại trong process local; qua HTTP hoặc message broker phải truyền metadata riêng. Xem AsyncLocalStorage trong Node.js.

Hai bước của thanh toán thẻ: authorize giữ số tiền trên thẻ; capture mới thật sự lấy tiền. Xem Payment system.

Tiến trình nền của PostgreSQL tự chạy VACUUM và ANALYZE trên từng bảng khi số dòng chết hoặc dòng thay đổi vượt ngưỡng (threshold cộng scale factor nhân số dòng). Xem VACUUM, autovacuum và bloat.

Backward: reader mới đọc được data ghi bằng schema cũ (deploy consumer trước). Forward: reader cũ đọc được data ghi bằng schema mới (deploy producer trước). Xem Event schema evolution.

Thành phần phía server đóng vai OAuth client cho SPA, giữ token và chỉ đưa cho browser một session cookie. Xem OAuth 2.0, OIDC và PKCE.

Chạy song song bản cũ (blue) và mới (green) đủ kích thước, chuyển toàn bộ traffic một lần, giữ blue để lật lại tức thì. Xem Chiến lược deploy.

Cấu trúc index dạng cây cân bằng nhiều nhánh, sắp key để hỗ trợ tìm bằng equality, range và một số thứ tự ORDER BY. Trong PostgreSQL, đây là loại index mặc định. Xem B-tree index trong PostgreSQL.

Cơ chế để bên sản xuất chậm lại khi bên nhận không theo kịp. Với Node stream, write() trả false nghĩa là buffer đầy và cần chờ sự kiện drain. Xem Stream và backpressure.

Key có value rất lớn: collection nhiều phần tử hoặc chuỗi dài. Lệnh O(N), xoá và di chuyển key này chặn hoặc làm chậm Redis. Tìm bằng redis-cli --bigkeys. Xem Redis data structures.

Bản phân tích sau sự cố tập trung vào hệ thống và quy trình đã cho phép lỗi xảy ra, không quy lỗi cho cá nhân, để mọi người dám kể đúng chuyện đã diễn ra. Kết thúc bằng action item có người chịu trách nhiệm và hạn. Xem Sự cố và postmortem.

Dung lượng bảng hoặc index bị chiếm bởi tuple chết hoặc chỗ trống chưa được dùng lại, khiến file lớn hơn lượng dữ liệu thật. VACUUM thường chỉ đánh dấu chỗ trống để tái sử dụng chứ không thu nhỏ file. Xem VACUUM, autovacuum và bloat.

Cấu trúc xác suất kiểm tra phần tử có thuộc tập hay không: trả “không” là chắc chắn không có, trả “có” thì có thể sai dương. Không xoá được phần tử. Xem Cache penetration & avalanche.

Ranh giới trong đó một mô hình và một ngôn ngữ chung có nghĩa nhất quán; cùng một từ có thể mang nghĩa khác ở context khác. Không đồng nghĩa với một microservice. Xem Bounded context.

Loại index PostgreSQL lưu tóm tắt min/max cho mỗi nhóm page vật lý liền nhau, thay vì một entry cho mỗi dòng. Rất nhỏ, nhưng chỉ hiệu quả khi giá trị cột tương quan với thứ tự lưu vật lý (ví dụ log ghi tuần tự theo thời gian). Xem GIN, GiST và BRIN.

Giới hạn số call đồng thời tới từng dependency bằng semaphore hoặc pool riêng có hàng đợi giới hạn, để một dependency chậm không chiếm hết worker hay connection pool chung. Xem Circuit breaker & bulkhead.

Tốc độ tiêu error budget so với mức tiêu trung bình cho phép, tính bằng error_ratio / (1 - SLO). Burn rate 1 nghĩa là hết budget đúng cuối cửa sổ. Xem SLI, SLO và error budget.

Thuộc tính role khiến role đó bỏ qua mọi policy RLS, kể cả khi bảng có FORCE ROW LEVEL SECURITY; superuser luôn có hành vi này.

Rất nhiều key cache hết hạn cùng lúc, hoặc cache mất toàn bộ dữ liệu, khiến tải dồn xuống database trong thời gian ngắn. Chữa bằng TTL jitter, warm rải đều, HA. Xem Cache penetration & avalanche.

Gắn hash nội dung vào tên file để mỗi thay đổi có URL mới; asset có thể cache một năm với immutable. Xem HTTP caching.

Cache hit: request tìm thấy dữ liệu cần trong cache. Cache miss: dữ liệu không có trong cache (chưa từng lưu, đã hết hạn, hoặc đã bị xoá), buộc phải lấy từ nguồn gốc.

Request cho key không có trong nguồn dữ liệu chính nên cache không bao giờ hit, mọi request đều xuống database. Chữa bằng validate, cache giá trị rỗng, bloom filter, rate limit. Xem Cache penetration & avalanche.

Tình huống nhiều request cùng gặp cache miss trên cùng một key trong cùng một khoảnh khắc, khiến tất cả cùng đổ vào database dù chỉ cần tính toán một lần. Còn gọi là thundering herd. Xem Cache stampede.

Pattern caching trong đó ứng dụng — không phải cache — chịu trách nhiệm đồng bộ giữa cache và database: đọc cache trước, nếu miss thì đọc database rồi ghi lại cache. Xem Cache-aside pattern.

Phát hành version mới cho một phần nhỏ traffic hoặc Pod trước, so metric với bản stable rồi mới mở rộng. Xem Chiến lược deploy.

Số tổ hợp label value khác nhau của một metric; mỗi tổ hợp được Prometheus lưu thành một time series. Label có giá trị không giới hạn như user ID có thể làm số series tăng mạnh. Xem Metric cardinality cao.

Lỗi của một thành phần lan sang thành phần khác qua tài nguyên dùng chung hoặc retry. Ví dụ: provider chậm chiếm hết worker của API khiến cả /health cũng lỗi. Xem Circuit breaker & bulkhead.

Thời điểm PostgreSQL ghi mọi page bẩn xuống đĩa; WAL trước đó không còn cần cho crash recovery. Lần sửa đầu tiên của mỗi page sau checkpoint ghi full-page image vào WAL. Xem UUID hay bigint làm khoá.

Bọc lời gọi tới một dependency, đo tỉ lệ lỗi và call chậm trong cửa sổ trượt. Vượt ngưỡng thì ngừng gọi và fail fast một khoảng thời gian, rồi cho vài call thử (half-open). Xem Circuit breaker & bulkhead.

Context đi theo một async chain. Trong Node.js được xây trên AsyncLocalStorage; thư viện nestjs-cls dùng nó để truyền transaction hay request id xuyên service mà không thêm tham số. Xem Transaction xuyên service.

Transaction nghiệp vụ mới hoàn tác về mặt ý nghĩa một bước đã commit của saga (hoàn tiền, nhả giữ chỗ). Khác rollback, nó không khôi phục trạng thái cũ: đã hoàn tiền không giống chưa từng trừ tiền. Xem Saga.

Request có If-None-Match hoặc If-Modified-Since; nếu bản đã lưu vẫn còn đúng, server trả 304 không body và cache dùng lại bản của mình.

Tập connection database được mở sẵn và cho request mượn. Pool cạn thì request mới phải chờ connection rảnh. Ở PgBouncer transaction mode, connection server chỉ thuộc về client trong một transaction, nên trạng thái session có thể dính sang client khác. Xem Timeout và quan sát lock.

Consumer mô tả dữ liệu nó cần và provider chạy các test đó trong CI của mình, ví dụ Pact message pact.

Một nhóm consumer trong Kafka cùng chia sẻ việc đọc một hoặc nhiều topic, định danh bằng một groupId chung. Mỗi partition chỉ được đọc bởi đúng một consumer trong group tại một thời điểm. Xem Kafka consumer group và rebalance.

Khoảng cách giữa log-end offset và committed offset của một consumer group, tính theo từng partition. Nên đo thêm theo thời gian (tuổi của record cũ nhất chưa xử lý), vì số offset có thể nhỏ mà record đã chờ rất lâu. Xem Consumer lag trong Kafka.

Bộ sinh tải chờ response nên gửi ít request hơn khi server chậm; latency đo được vì thế che mất hàng đợi thật. Tránh bằng open model (arrival rate). Xem Load testing với k6.

Sau fork(), process cha và con dùng chung trang nhớ; trang chỉ được chép khi một bên sửa. Redis dựa vào cơ chế này để snapshot, nên RAM tăng theo lượng ghi trong lúc save. Xem Persistence: RDB và AOF.

Mã gắn với một yêu cầu và được truyền qua mọi service để nối log và trace lại. Chuẩn W3C Trace Context dùng header traceparent dạng 00-<trace-id>-<parent-id>-<flags>. Xem Correlation ID.

Cơ chế để trình duyệt cho phép trang ở origin này đọc response từ origin khác thông qua các header của server. Nó nới Same-Origin Policy chứ không ngăn request được gửi đi, nên không thay thế được kiểm soát truy cập ở server. Xem CORS và CSRF.

Khi container có CPU limit, kernel tạm dừng mọi thread của nó khi đã dùng hết quota trong period hiện tại (mặc định 100 ms), tới period sau mới chạy tiếp. CPU trung bình có thể thấp mà request vẫn bị treo. Xem Requests & limits.

Tách model ghi (command) và model đọc (query); có thể dùng chung hoặc tách kho dữ liệu. Xem CQRS và event sourcing.

Mã hoá field cá nhân bằng key riêng từng người rồi xoá key để dữ liệu không đọc được; ciphertext vẫn còn, có đủ để coi là xoá hay không là câu hỏi pháp lý.

Tấn công khiến trình duyệt của nạn nhân gửi request kèm cookie đăng nhập tới site đích mà người dùng không chủ ý. Phòng bằng CSRF token, thuộc tính SameSite, kiểm tra Origin hoặc Sec-Fetch-Site. Xem CORS và CSRF.

Exchange nhận các message bị dead-letter trong RabbitMQ: bị reject không requeue, hết TTL, queue đầy hoặc vượt delivery limit. Xem Dead-letter và TTL.

Nơi chứa message không xử lý được sau khi đã hết lượt retry hoặc gặp lỗi vĩnh viễn, để điều tra và replay. Consumer API của Kafka không có DLQ dựng sẵn; RabbitMQ dùng dead letter exchange. Xem Retry topic và DLQ trong Kafka.

Tình huống hai (hoặc nhiều) transaction khoá lẫn nhau theo một vòng chờ khép kín — mỗi bên giữ thứ bên kia cần, không ai có thể tiến tới. PostgreSQL tự phát hiện và huỷ một transaction để phá vòng. Xem Deadlock trong PostgreSQL.

Object bọc một object khác với cùng interface, mỗi lớp thêm một hành vi (cache, retry, metrics). Thứ tự các lớp làm đổi hành vi. Xem Decorator pattern.

Thành phần tạo các object (provider) và tiêm chúng vào nơi cần, dựa trên khai báo thay vì để code tự new. Trong NestJS, container quản lý cả vòng đời và scope của provider. Xem DI container trong NestJS.

Quy tắc trung tâm của Clean Architecture: phụ thuộc trong source code chỉ hướng vào trong; lời gọi ra ngoài đi qua dependency inversion. Xem Hexagonal & clean architecture.

Kỹ thuật trả về một IP công khai ở lần phân giải đầu rồi IP nội bộ ở lần sau (TTL rất thấp), để vượt qua cách kiểm tra rồi mới fetch. Cách phòng là phân giải một lần và kết nối đúng IP đã kiểm tra. Xem SSRF.

Domain event là thông báo trong process về một sự thật nghiệp vụ trong một bounded context. Integration event đưa sự thật đó sang service khác, bất đồng bộ và chỉ sau commit, thường qua outbox. Xem Observer và domain event.

Sổ chỉ thêm, mỗi sự kiện tiền là một journal gồm các entry debit/credit có tổng bằng nhau; số dư là tổng các entry. Xem Payment system.

Class mô tả hình dạng input hoặc output của một endpoint. Trong NestJS, DTO mang decorator của class-validator để ValidationPipe kiểm tra lúc runtime. Xem Validation DTO.

Ghi vào database và gửi message hoặc gọi hệ khác như hai thao tác riêng, không atomic. Nếu crash giữa hai bước, hai nơi sẽ lệch nhau. Giải pháp phổ biến là outbox. Xem Transactional outbox.

Module nhận cấu hình lúc import: một static method (forRoot, register…) trả object DynamicModule gồm module, providers, exports, imports, global. Xem Dynamic module.

Phần được phép lỗi trong cửa sổ SLO, bằng 1 - SLO. SLO 99,9% trong 30 ngày cho phép khoảng 43,2 phút lỗi toàn phần. Xem SLI, SLO và error budget.

ETag là định danh phiên bản của một resource HTTP. Client gửi lại trong If-Match; nếu resource đã đổi, server không thực hiện thay đổi và có thể trả 412. Xem Optimistic hay pessimistic locking.

Vòng lặp libuv chạy callback theo các phase (timers, pending, poll, check, close…). Sau mỗi callback, hàng đợi process.nextTick rồi microtask được xả hết. Xem Event loop trong Node.js.

Lưu mỗi thay đổi thành event bất biến trong stream append-only của từng aggregate; state hiện tại có được bằng cách replay (fold) các event. Xem CQRS và event sourcing.

Thành phần trong NestJS chuyển exception chưa được xử lý thành response lỗi. Filter chỉ áp dụng trong scope được đăng ký; exception đã được interceptor xử lý không đi tiếp tới filter. Xem Request lifecycle trong NestJS.

Cách đổi schema không downtime theo nhiều pha: thêm (expand) cột hoặc bảng mới, backfill và chuyển ứng dụng sang dùng, rồi xoá cái cũ (contract) ở một lần phát hành riêng. Xem Migration expand–contract.

Version của stream lúc command load; append thất bại nếu stream đã đổi (optimistic concurrency theo stream).

Tăng dần thời gian chờ giữa các lần retry (gấp đôi mỗi lần, có trần) và cộng ngẫu nhiên (jitter) để các client không retry đồng loạt. Full jitter chọn ngẫu nhiên trong khoảng từ 0 đến mức backoff. Xem Retry, backoff và jitter.

Thống kê PostgreSQL thu thập cho một nhóm cột được chỉ định (qua CREATE STATISTICS), giúp planner nhận ra tương quan giữa các cột thay vì mặc định coi chúng độc lập. Xem Statistics, ANALYZE và cách PostgreSQL ước lượng query.

Phát bài bằng cách chép id vào timeline tính sẵn của từng follower lúc ghi (đẩy), so với gom bài từ mọi tài khoản đang follow lúc đọc feed (kéo). Xem News feed.

Công tắc trong runtime để bật/tắt một tính năng mà không cần deploy lại. Gồm nhiều loại (release, experiment, ops, permission); flag release phải được gỡ sau khi tính năng ổn định để không thành nợ kỹ thuật. Xem Config và 12-factor.

Số tăng dần mỗi lần cấp lock hoặc lease. Tài nguyên từ chối ghi mang token cũ hơn, nên bên đã mất lock không ghi đè được dữ liệu mới. Advisory lock của PostgreSQL không có fencing token. Xem Advisory lock.

Test có cùng code và cùng điều kiện nhưng lúc pass lúc fail, thường do thời gian, thứ tự chạy, trạng thái dùng chung hoặc chờ bất đồng bộ. Xem Flaky test.

System call buộc kernel ghi dữ liệu từ page cache xuống thiết bị lưu trữ. Đã write() mà chưa fsync thì dữ liệu sống sót khi process chết nhưng mất khi máy sập. Xem Persistence: RDB và AOF.

Bản sao nguyên page 8 kB ghi vào WAL ở lần sửa đầu tiên sau checkpoint khi full_page_writes = on (mặc định). Insert rải ngẫu nhiên như UUID v4 sinh rất nhiều FPI. Xem UUID hay bigint làm khoá.

Loại index PostgreSQL tạo một entry cho từng thành phần bên trong một giá trị composite (mỗi phần tử array, mỗi key JSON), thay vì một entry cho cả giá trị. Hợp cho tìm kiếm containment trên array, jsonb, và full-text search. Xem GIN, GiST và BRIN.

Framework index tổng quát của PostgreSQL; operator class định nghĩa cách so sánh và thu hẹp phạm vi tìm kiếm cho một kiểu dữ liệu/quan hệ cụ thể (range overlap, dữ liệu hình học…). Xem GIN, GiST và BRIN.

Quy trình dừng có trật tự: ngừng nhận việc mới, chờ việc đang chạy xong trong một hạn, đóng tài nguyên rồi thoát. Trên Kubernetes, preStop, drain và cleanup dùng chung một grace period. Xem SIGTERM khi deploy.

Thành phần trong NestJS quyết định một request có được phép đi tiếp hay không, thông qua phương thức canActivate(). Chạy sau middleware, trước interceptor và pipe. Xem Request lifecycle trong NestJS.

Redis Cluster chia key vào 16.384 hash slot. Phần {...} trong tên key (hash tag) làm Redis chỉ băm đoạn đó, để nhiều key nằm cùng slot và dùng chung được trong MULTI hay script. Xem Pipelining, MULTI và Lua.

Table access method mặc định của PostgreSQL. Heap relation lưu các phiên bản tuple trên các page; thứ tự vật lý của chúng không bảo đảm trùng với thứ tự insert hay giá trị primary key.

Ô nhập thẻ do gateway cung cấp (iframe hoặc redirect) để số thẻ không đi qua server của merchant, merchant chỉ nhận token.

Một key cache nhận lượng truy cập lớn bất thường, làm quá tải shard chứa nó. Thường giảm bằng cache trong process ngắn hạn hoặc replica.

Server PostgreSQL ở chế độ recovery, liên tục replay WAL từ primary và vẫn nhận query chỉ đọc. Dữ liệu chỉ hiện sau khi commit record được replay. Xem Replication và read replica.

Cấu trúc xác suất ước lượng số phần tử khác nhau với bộ nhớ cố định: tối đa 12 KB trong Redis, sai số chuẩn 0,81%. Không liệt kê được phần tử. Xem Redis data structures.

Dùng hai ngưỡng khác nhau để vào và ra một chế độ (ví dụ 10.000 và 8.000 follower) để giá trị sát ranh giới không đổi qua lại liên tục.

Khả năng thực hiện lại cùng một thao tác mà không tạo thêm hiệu ứng nghiệp vụ so với thực hiện một lần. Với consumer hoặc job có retry, cần nhận diện cùng một thao tác bằng key ổn định và bảo vệ việc ghi nhận kết quả. Xem Idempotent consumer.

Header HTTP chứa giá trị duy nhất do client sinh, giúp server nhận ra các lần retry của request non-idempotent (POST) và trả lại kết quả cũ thay vì lặp hiệu ứng. Vẫn là IETF Internet-Draft, chưa phải RFC. Xem Idempotency-Key.

Trạng thái trong pg_stat_activity: session đã mở transaction nhưng không chạy câu lệnh nào. Session vẫn giữ mọi lock và snapshot, nên chặn session khác và cản VACUUM. Xem Timeout và quan sát lock.

Broken Object Level Authorization (API1:2023 của OWASP): API nhận ID của object nhưng không kiểm tra người gọi có quyền với đúng object đó. Xem BOLA và IDOR.

JWT do OIDC provider cấp cho client (aud = client_id) để chứng minh việc đăng nhập; không phải credential để gọi API.

Dịch vụ metadata của máy ảo cloud, ví dụ AWS ở 169.254.169.254, có thể trả credentials của IAM role. Đây là mục tiêu kinh điển của SSRF; IMDSv2 yêu cầu token lấy bằng PUT và hop limit mặc định 1. Xem SSRF.

Tập replica của một partition Kafka (gồm cả leader) đang theo kịp leader trong replica.lag.time.max.ms. Với acks=all, ghi chỉ được xác nhận khi mọi replica trong ISR đã có bản ghi. Xem Replication, ISR và acks.

Bảng ghi lại ID các message đã xử lý; consumer INSERT ... ON CONFLICT DO NOTHING trong cùng transaction với tác động nghiệp vụ để khử trùng. Xem Idempotent consumer.

Thành phần trong NestJS cho phép chạy code trước và sau khi handler xử lý request, thường dùng để logging, đo thời gian, hoặc biến đổi response. Xem Request lifecycle trong NestJS.

Join algorithms (Nested Loop, Hash Join, Merge Join)

Phần tiêu đề “Join algorithms (Nested Loop, Hash Join, Merge Join)”

Ba cách PostgreSQL thực hiện một phép join: Nested Loop tra từng dòng outer, Hash Join băm bên nhỏ rồi quét bên lớn, Merge Join duyệt song song hai dãy đã sắp. Xem Join algorithms.

Tập public key mà issuer công bố ở jwks_uri, mỗi key có kid; verifier dùng nó để chọn key kiểm chữ ký token, nhờ đó xoay key được.

Token chứa các claim (sub, exp, aud…) được ký, verify được cục bộ mà không cần gọi về server. Payload chỉ là base64url, không mã hoá, và không thu hồi được trước exp nếu không thêm trạng thái. Xem Session cookie hay JWT.

Cách phân trang tiếp tục từ giá trị khoá cuối cùng của trang trước (WHERE id > $last_id), thay vì đếm và bỏ qua một số dòng bằng OFFSET. Chi phí không tăng theo độ sâu trang. Xem Pagination trong PostgreSQL: OFFSET và keyset.

Chế độ quản lý metadata của Kafka bằng Raft ngay trong broker, thay cho ZooKeeper. Kafka 4.0 đã bỏ hẳn ZooKeeper. Xem Kafka distributed log.

Đồng hồ logic: Lamport tăng khi có event và lấy max rồi cộng 1 khi nhận message, nên a → b suy ra L(a) < L(b) nhưng không ngược lại. Vector clock phân biệt được hai event đồng thời. Xem Lamport logical clock.

Offset lớn nhất mà consumer read_committed của Kafka được đọc: mọi record trước nó đã thuộc transaction hoàn tất. Một transaction mở lâu giữ LSO lại và làm trễ việc đọc. Xem Kafka transaction và exactly-once.

Docker dùng lại layer khi lệnh và input không đổi. Một layer miss thì mọi layer sau nó build lại, nên thứ tự lệnh trong Dockerfile quyết định tốc độ rebuild. Xem Docker multi-stage & non-root.

Hàm hoặc operator được bảo đảm không làm lộ đối số (ví dụ qua thông báo lỗi); chỉ loại này được chạy trước điều kiện của policy RLS, nhờ đó dùng được index.

Quyền sử dụng tài nguyên hoặc xử lý công việc trong một khoảng thời gian hữu hạn. Hết hạn không chứng minh chủ cũ đã dừng; cần kiểm tra quyền cập nhật và thiết kế side effect phù hợp khi cấp lại quyền cho chủ mới.

Encoding gọn của Redis cho hash, sorted set, set, list nhỏ: một mảng byte liền nhau, tiết kiệm bộ nhớ nhưng tìm kiếm tuyến tính. Vượt ngưỡng thì Redis đổi sang encoding lớn. Xem Redis data structures.

Quy ước lấy các lock theo cùng một thứ tự để tránh vòng chờ giữa những tài nguyên tuân theo quy ước đó. Cần áp dụng nhất quán ở mọi luồng truy cập liên quan. Xem Deadlock trong PostgreSQL.

Hàng đợi các request đang chờ lock trên cùng một object. Request mới phải chờ nếu xung đột với lock đang giữ hoặc với request đang chờ phía trước (soft block), nên một DDL đang chờ có thể chặn cả SELECT đến sau. Xem Lock queue.

Lỗi xảy ra khi hai transaction cùng đọc một dữ liệu, rồi cùng ghi đè dựa trên giá trị đã đọc — một trong hai lần ghi bị “mất” vì dựa trên dữ liệu đã lỗi thời vào lúc ghi.

Vị trí trong WAL, dạng 0/3033518, tăng dần và so sánh được. Dùng để đo replication lag và kiểm tra replica đã replay tới một commit chưa. Xem Replication và read replica.

Client gửi thêm field như role hay isVerified, và app chép nguyên body vào model, nên client ghi được field không được phép sửa. Chặn bằng allowlist, ví dụ whitelist của ValidationPipe. Xem Validation DTO.

Hàm băm cần nhiều RAM cho mỗi lần chạy (Argon2, scrypt), làm giảm lợi thế song song của GPU và ASIC khi đoán mật khẩu. Xem Hash mật khẩu.

Lớp xử lý request trước guard trong NestJS, thường dùng để gắn request ID hoặc ghi access log. Middleware có thể gắn theo route nhưng không có ExecutionContext của guard. Chi tiết tích hợp phụ thuộc HTTP adapter. Xem Request lifecycle trong NestJS.

Đơn vị nhỏ nhất của tiền tệ theo ISO 4217 (USD có 2 chữ số thập phân, VND 0); lưu số tiền dạng số nguyên theo đơn vị này.

Một deployable duy nhất nhưng chia thành các module có ranh giới và interface công khai rõ, thường được kiểm soát bằng công cụ. Xem Modular monolith và microservices.

Dockerfile có nhiều stage FROM; chỉ stage cuối thành image, các stage khác chỉ chuyển file qua COPY --from. Giúp image runtime không chứa công cụ build. Xem Docker multi-stage & non-root.

Một hệ thống phục vụ nhiều khách hàng (tenant) mà dữ liệu phải cô lập: database riêng, schema riêng, hoặc schema chung có cột tenant_id. Xem Row-level security.

Cơ chế giữ nhiều phiên bản dòng để câu lệnh đọc theo snapshot mà không phải chờ row lock của thao tác ghi. Ở Read Committed, snapshot được lấy cho từng câu lệnh; ở Repeatable Read, snapshot ổn định trong transaction. Xung đột giữa các thao tác ghi vẫn có thể gây chờ. Xem Row-level locks trong PostgreSQL.

Lưu kết quả “không tồn tại” vào cache với TTL ngắn để không truy vấn lại nguồn chính. Chỉ có ích khi cùng key bị hỏi lặp lại; phải xoá khi row được tạo. Xem Cache penetration & avalanche.

Khi node thiếu tài nguyên (ví dụ memory), kubelet chủ động dừng Pod, ưu tiên Pod dùng vượt request. Khác OOMKilled, là container chạm limit của chính nó.

Subject báo cho các listener đã đăng ký khi có sự kiện, để bên publish không phụ thuộc vào các phản ứng. Xem Observer và domain event.

Số thứ tự của một record trong một partition. Consumer group lưu offset đã commit để biết đọc tiếp từ đâu. Xem Offset commit.

Lớp định danh trên OAuth 2.0: ngoài access token, client nhận thêm ID token (một JWT) cho biết ai vừa đăng nhập và lúc nào. Xem OAuth 2.0, OIDC và PKCE.

Container vượt memory limit và bị kernel kill bằng SIGKILL (exit code 137); container restart trong cùng Pod. Xem Requests & limits.

Open model: request đến theo lịch cố định, không chờ response (k6 arrival-rate). Closed model: mỗi virtual user chỉ gửi request tiếp khi request trước xong (constant-vus). Xem Load testing với k6.

Phát hiện xung đột lúc ghi: thêm version đã đọc vào WHERE của UPDATE; UPDATE 0 nghĩa là người khác đã ghi trước. Không giữ lock giữa đọc và ghi. Xem Optimistic hay pessimistic locking.

Khối có kích thước cố định mà PostgreSQL dùng làm đơn vị lưu trữ cho bảng và index; kích thước thường là 8 kB nhưng phụ thuộc bản build. Page chứa header, line pointer, vùng trống và item.

Trong Kafka: một log có thứ tự trong topic. Producer chọn partition theo cấu hình partitioner, key hoặc partition được chỉ định trực tiếp; cách chọn khi không có key phụ thuộc client. Kafka giữ thứ tự record trong từng partition. Xem Kafka consumer group và rebalance.

Trong PostgreSQL: một bảng con vật lý chứa một phần dữ liệu của một bảng logic đã khai báo PARTITION BY (RANGE, LIST hoặc HASH). Xem Partitioning trong PostgreSQL.

Việc PostgreSQL planner loại bỏ các partition không thể chứa dòng thoả điều kiện WHERE, dựa trên so sánh giữa điều kiện và bounds của từng partition — xảy ra trước khi quét bất kỳ dữ liệu nào. Chỉ có tác dụng khi WHERE ràng buộc được đúng cột dùng làm partition key. Xem Partitioning trong PostgreSQL.

Secret dùng chung cho mọi mật khẩu, lưu ngoài database (KMS, secret manager), bảo vệ hash khi chỉ database bị lộ. Xem Hash mật khẩu.

Khoá ngay lúc đọc (SELECT ... FOR UPDATE) để bên ghi khác chờ đến khi commit. Hợp với transaction ngắn, xung đột cao; không giữ qua tương tác người dùng. Xem Optimistic hay pessimistic locking.

Connection pooler nhẹ đứng giữa app và PostgreSQL, cho nhiều client connection dùng chung ít server connection. Có ba mode: session, transaction, statement. Xem Connection pooling và PgBouncer.

Định dạng $id$v=..$params$salt$hash lưu thuật toán, tham số, salt và hash trong một cột, cho phép nâng tham số dần. Xem Hash mật khẩu.

Thành phần trong NestJS validate và transform tham số đầu vào (@Param, @Body, @Query) ngay trước khi truyền vào handler. Xem Request lifecycle trong NestJS.

Client gửi nhiều lệnh liên tiếp không chờ reply rồi đọc reply sau, giảm số round trip. Không nguyên tử: lệnh của client khác vẫn chen vào giữa. Xem Pipelining, MULTI và Lua.

Bước “không quay lại” trong saga. Sau khi nó thành công, các bước còn lại phải retry tới khi xong thay vì bù trừ.

Phần mở rộng của luồng authorization code: client gửi bản băm của một bí mật ngẫu nhiên (code_challenge) khi bắt đầu và phải đưa đúng bí mật (code_verifier) khi đổi code, nên code bị lấy cắp cũng vô dụng.

Interface do ứng dụng định nghĩa cho một cuộc hội thoại với bên ngoài. Driving port là use case ứng dụng cung cấp; driven port là thứ ứng dụng cần, như repository hay payment gateway. Xem Hexagonal & clean architecture.

Số message tối đa chưa ack mà broker giao cho một consumer. Nó điều tiết tốc độ, không xác nhận gì về việc xử lý. Xem Ack, prefetch và confirms.

Request OPTIONS mà trình duyệt tự gửi trước những request cross-origin không đơn giản (ví dụ Content-Type: application/json) để hỏi server có cho phép không. Xem CORS và CSRF.

Ba loại kiểm tra của Kubernetes: liveness hỏi có cần restart container không, readiness hỏi Pod có nhận traffic được không, startup hỏi khởi tạo xong chưa. Xem Kubernetes health probes.

Định dạng chuẩn application/problem+json cho lỗi HTTP với các trường type, title, status, detail, instance. RFC 9457 thay thế RFC 7807. Xem Problem Details.

Canary hoặc blue-green trong đó controller (Argo Rollouts, Flagger) tăng traffic từng bước và tự abort khi phân tích metric thất bại.

View tối ưu cho đọc, dựng bằng cách áp event theo thứ tự và lưu checkpoint; có thể rebuild từ log event.

Quy tắc về vòng đời instance của provider. DEFAULT tái sử dụng trong application context; REQUEST theo request context; TRANSIENT tạo instance theo consumer inject. Xem Provider scope trong NestJS.

Guaranteed, Burstable hoặc BestEffort. Kubernetes suy ra từ request và limit của mọi container trong Pod; ảnh hưởng thứ tự eviction và oom_score_adj.

Loại queue của RabbitMQ được nhân bản bằng Raft, là lựa chọn replicated nên dùng cho queue bền. Có x-delivery-limit mặc định 20 từ RabbitMQ 4.0. Xem Các loại queue của RabbitMQ.

Hai cơ chế persistence của Redis. RDB là snapshot nhị phân của dataset tại một thời điểm; AOF là log lệnh ghi được replay khi khởi động, từ Redis 7 gồm base, incr và manifest. Xem Persistence: RDB và AOF.

Isolation level mặc định của PostgreSQL. Mỗi câu lệnh đọc thông thường dùng snapshot ở thời điểm câu lệnh bắt đầu; hai câu lệnh trong cùng transaction có thể thấy các thay đổi đã commit khác nhau. Xem Isolation levels trong PostgreSQL.

Bảo đảm một client luôn đọc thấy dữ liệu chính mình vừa ghi. Với read replica async, đây là trách nhiệm của ứng dụng: đọc primary hoặc chờ replica replay tới LSN của lần ghi. Xem Replication và read replica.

Quá trình Kafka phân chia lại partition cho các consumer trong một group khi thành viên group thay đổi (tham gia, rời đi, crash) hoặc số partition của topic thay đổi. Xem Kafka consumer group và rebalance.

Đối soát: khớp dữ liệu của mình (payment, ledger) với nguồn bên ngoài như file settlement của gateway, và xử lý từng chỗ lệch.

Thuật toán lock của Redis trên N master độc lập: client chỉ coi là có lock khi lấy được quá bán trong thời gian nhỏ hơn TTL. Có tranh luận về độ an toàn khi không có fencing token. Xem Distributed lock.

Provider của @nestjs/core đọc metadata mà decorator đã ghi lên handler hoặc class (get, getAllAndOverride, getAllAndMerge). Thường dùng trong guard và interceptor. Xem Custom decorator & Reflector.

Độ trễ từ lúc commit trên primary đến lúc replica replay thay đổi đó. Đo bằng replay_lag trong pg_stat_replication hoặc chênh lệch LSN. Xem Replication và read replica.

Hash của method, path và body đã chuẩn hoá, lưu cùng idempotency key để phát hiện cùng key bị dùng lại cho request khác (trả 422).

Request là lượng scheduler giữ chỗ cho container và là mốc HPA tính utilization. Limit là trần kernel thực thi qua cgroup.

Giới hạn tỷ lệ retry so với tổng request để retry không khuếch đại sự cố; sách SRE của Google nêu mức khoảng 10%, Envoy mặc định 20%. Xem Retry, backoff và jitter.

Chiến lược mặc định của Deployment: thay Pod theo đợt, giới hạn bởi số Pod được thêm (maxSurge) và số Pod được phép unavailable (maxUnavailable), cùng mặc định 25%.

Cơ chế khoá một dòng dữ liệu cụ thể (không phải cả bảng) trong PostgreSQL, dùng mệnh đề FOR UPDATE, FOR NO KEY UPDATE, FOR SHARE, hoặc FOR KEY SHARE. Xem Row-level locks trong PostgreSQL.

Tính năng PostgreSQL dùng policy theo bảng để lọc dòng mà một role được đọc hoặc ghi; database tự áp dụng nên query quên điều kiện vẫn bị giới hạn. Xem Row-level security.

Container phụ của Testcontainers, xoá mọi container, network, volume mang label của session khoảng 10 s sau khi process test ngắt kết nối. Xem Testcontainers.

Chuỗi transaction cục bộ qua nhiều service, mỗi bước có một bước bù trừ; nếu một bước lỗi, các bước đã xong được bù trừ theo thứ tự ngược. Xem Saga.

Giá trị ngẫu nhiên sinh riêng cho từng mật khẩu, lưu cạnh hash. Chống rainbow table và làm hai user cùng mật khẩu có hash khác nhau; không làm từng lần đoán chậm hơn. Xem Hash mật khẩu.

Thuộc tính cookie (Strict, Lax, None) quyết định khi nào cookie được gửi kèm request cross-site. Lax gửi cookie với điều hướng cấp cao dùng method an toàn; một số trình duyệt mặc định là Lax. Xem CORS và CSRF.

Dịch vụ lưu các version schema theo subject và từ chối version mới vi phạm compatibility mode đã đặt; record chỉ mang schema ID.

Dấu hiệu ở tầng ứng dụng (ví dụ trạng thái PENDING) cho biết record đang được một saga chưa xong thay đổi, để request khác chờ, từ chối hoặc hiển thị là đang xử lý.

Cách PostgreSQL triển khai mức Serializable: vẫn đọc từ snapshot nhưng theo dõi phụ thuộc đọc–ghi và huỷ một transaction (40001) khi phát hiện nguy cơ vi phạm tính tuần tự. Xem Isolation levels.

Báo cáo định kỳ của nhà cung cấp thanh toán về capture, refund, phí và khoản chi trả, dùng để đối soát.

Shared cache (CDN, proxy, gateway) lưu response cho nhiều người dùng; private cache (trình duyệt) chỉ cho một người. private và s-maxage nhắm vào sự phân biệt này. Xem HTTP caching.

Kiểu nhóm consumer theo ngữ nghĩa queue (KIP-932): nhiều consumer đọc chung một partition và ack từng record. Theo thông báo phát hành, Kafka 4.2 đánh dấu tính năng này là production-ready. Xem Share groups.

SLI là số đo chất lượng (tỷ lệ sự kiện tốt trên sự kiện hợp lệ); SLO là mục tiêu cho SLI đó trong một cửa sổ, ví dụ 99,9% trong 30 ngày. Xem SLI, SLO và error budget.

Tập các transaction mà một statement hoặc transaction coi là đã commit; nó quyết định phiên bản dòng nào nhìn thấy được. Xem MVCC và Isolation levels.

State đã fold của một stream lưu sẵn tại version N để chỉ replay event sau đó; có thể xoá và tạo lại. Không phải snapshot của MVCC.

Kiểu Redis mà mỗi member là duy nhất và có score, luôn giữ thứ tự theo score; thêm và cập nhật tốn O(log N). Hợp cho leaderboard. Xem Redis data structures.

Lỗi khi attacker điều khiển đích của request do server phát ra, khiến server dùng quyền mạng của chính nó để gọi tài nguyên ngoài ý định. Xem SSRF khi API fetch URL.

Extension của Cache-Control (RFC 5861) cho phép cache trả bản stale trong N giây trong lúc làm mới ở nền.

Tình trạng một công việc liên tục bị trì hoãn trong khi công việc khác vẫn tiến triển. Trong queue dùng SKIP LOCKED, job giữ lock lâu có thể bị các worker bỏ qua nhiều lần.

Pattern đóng gói các thuật toán có thể hoán đổi sau một interface chung, để chọn thuật toán lúc chạy thay vì dùng chuỗi if. Xem Strategy pattern.

Lock trên cả relation (bảng, index), có 8 mode từ ACCESS SHARE đến ACCESS EXCLUSIVE, giữ đến hết transaction. Trong pg_locks là dòng locktype = 'relation'. Xem Table-level locks.

Database PostgreSQL làm mẫu cho CREATE DATABASE ... TEMPLATE; không được có connection nào tới nó khi đang copy. Hữu ích để mỗi file test có một database mới đã chạy migration.

Thư viện khởi động container Docker dùng một lần ngay từ code test, chờ tới khi sẵn sàng rồi trả về host và port map ngẫu nhiên. Xem Testcontainers.

Đối tượng thay cho dependency thật trong test. Mock kiểm tra lời gọi; fake viết lại hành vi rút gọn, ví dụ SQLite thay PostgreSQL.

Khoảng giữa lúc đọc và lúc ghi mà ứng dụng chờ thứ ngoài database, thường là người dùng sửa form. Think time dài thì không nên giữ lock hay transaction. Xem Optimistic hay pessimistic locking.

Xem Cache stampede.

Kiểu PostgreSQL lưu một thời điểm tuyệt đối (UTC nội bộ), hiển thị theo TimeZone của session. Không lưu múi giờ gốc. Xem Kiểu dữ liệu dễ dùng sai.

Viết tắt của The Oversized-Attribute Storage Technique. PostgreSQL dùng cơ chế này để nén hoặc lưu ngoài tuple các giá trị lớn của kiểu dữ liệu hỗ trợ TOAST.

Thuật toán rate limiting: bucket chứa tối đa capacity token, được nạp đều theo rate; mỗi request lấy token, hết token thì bị từ chối. Cho phép burst tới capacity nhưng giữ tốc độ dài hạn bằng rate. Xem Rate limiting cho API.

Consumer chỉ đọc field mình cần và bỏ qua field lạ, nên producer thêm field mà không làm hỏng nó.

PostgreSQL dùng XID 32-bit nên phải freeze các tuple cũ trước khi bộ đếm quay vòng; nếu không, server cảnh báo rồi từ chối cấp XID mới để bảo vệ dữ liệu. Xem Transaction ID wraparound.

Pooling mode của PgBouncer: server connection chỉ gán cho client trong một transaction rồi trả về pool. Trạng thái session như SET, LISTEN, session advisory lock không dùng được. Xem Connection pooling và PgBouncer.

Quy tắc cho biết hàm có đánh dấu transaction làm gì khi đã có transaction đang mở: dùng lại (Required), mở transaction độc lập (RequiresNew), tạo savepoint (Nested) hay báo lỗi. Xem Transaction xuyên service.

Ghi event vào một bảng outbox trong cùng transaction với dữ liệu nghiệp vụ; một relay đọc bảng đó rồi gửi lên broker sau. Tránh được dual write. Xem Transactional outbox.

Thời gian sống của một key trong cache trước khi nó tự động hết hạn và bị xoá.

Phiên bản vật lý của một row trong heap. Tuple gồm header PostgreSQL dùng để quản lý phiên bản và dữ liệu các cột; update có thể tạo phiên bản tuple mới.

Bộ 12 nguyên tắc cho ứng dụng chạy trên cloud, trong đó config (mọi thứ thay đổi giữa các lần deploy) nằm ở môi trường chứ không nằm trong code, để cùng một artifact chạy được ở nhiều môi trường. Xem Config và 12-factor.

Giao thức trong đó coordinator yêu cầu các bên prepare (giữ lock) rồi commit. Coordinator chết sau bước prepare thì các bên bị treo.

Event của Node.js khi một promise bị reject mà không có handler. Từ Node 15, mặc định process dừng. Lỗi loại này không đi qua exception filter của NestJS. Xem Exception filter.

Chuyển event hoặc message dạng cũ về dạng hiện tại tại một chỗ, lúc đọc, không sửa dữ liệu đã lưu.

Thao tác “chưa có thì INSERT, có rồi thì UPDATE” trong một câu lệnh. Trong PostgreSQL là INSERT ... ON CONFLICT DO UPDATE, bảo đảm INSERT hoặc UPDATE ở Read Committed. Xem Upsert với ON CONFLICT.

v4 gồm 122 bit ngẫu nhiên; v7 (RFC 9562) bắt đầu bằng timestamp 48 bit tính theo ms nên gần tăng dần. v7 giữ đường insert B-tree gần như bigint nhưng lộ thời điểm tạo. Xem UUID hay bigint làm khoá.

Định dạng biểu diễn các giá trị có độ dài thay đổi trong PostgreSQL. text và bytea là ví dụ; với những kiểu hỗ trợ TOAST, header có thể cho biết giá trị được lưu inline, nén hoặc tham chiếu dữ liệu out-of-line. Xem TOAST trong PostgreSQL 17.

Nhật ký tuần tự: mọi thay đổi được ghi vào WAL trước khi ghi vào file dữ liệu. Dùng cho crash recovery, replication và backup PITR. Xem Replication và read replica.

Tiến trình hoặc thành phần nền nhận và xử lý công việc từ queue. Nhiều worker cần cơ chế phân chia quyền xử lý để không cùng nhận một job.

Một lần ghi logic thành nhiều lần ghi vật lý, ví dụ một bài thành một lần ghi timeline cho mỗi follower.

Hai transaction cùng đọc một điều kiện rồi ghi vào hai dòng khác nhau, làm vi phạm một invariant mà từng transaction riêng lẻ không phá. Repeatable Read vẫn cho phép, Serializable chặn. Xem Các anomaly.