<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Architecture on Thanh HV's Blog</title><link>https://thanhhv.github.io/tags/architecture/</link><description>Recent content in Architecture on Thanh HV's Blog</description><generator>Hugo -- 0.146.7</generator><language>en-us</language><lastBuildDate>Fri, 10 Jul 2026 00:00:00 +0700</lastBuildDate><atom:link href="https://thanhhv.github.io/tags/architecture/index.xml" rel="self" type="application/rss+xml"/><item><title>Chương 16: Anti-patterns &amp; Khi nào KHÔNG nên dùng DDD</title><link>https://thanhhv.github.io/series/domain-driven-design/16-anti-patterns-va-khi-nao-khong-dung-ddd/</link><pubDate>Fri, 10 Jul 2026 00:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/domain-driven-design/16-anti-patterns-va-khi-nao-khong-dung-ddd/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>Vị trí chương này trong tài liệu:&lt;/strong> Đây là chương cuối cùng. Sau khi đã đi qua toàn bộ strategic design (chương 01–05), tactical patterns (06–11), kiến trúc và distributed systems (12–13), đưa vào production (14) và các case study (15a, 15b), chương này làm hai việc mà một tài liệu trung thực bắt buộc phải làm: &lt;strong>liệt kê những cách người ta làm hỏng DDD trong thực tế&lt;/strong> — với code thật, dấu hiệu nhận biết thật — và &lt;strong>nói thẳng khi nào đừng dùng DDD&lt;/strong>. Cuối chương là phần tổng kết toàn bộ tài liệu và lộ trình học tiếp.&lt;/p></description></item><item><title>Chương 15b — Case Study: SaaS, Blockchain, Booking System, Social Network</title><link>https://thanhhv.github.io/series/domain-driven-design/15b-case-study-saas-blockchain-booking-social/</link><pubDate>Thu, 09 Jul 2026 23:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/domain-driven-design/15b-case-study-saas-blockchain-booking-social/</guid><description>&lt;blockquote>
&lt;p>Vị trí trong bộ tài liệu: nửa sau của phần case study. &lt;a href="https://thanhhv.github.io/series/domain-driven-design/15a-case-study-ecommerce-fintech-banking-logistics/">Chương 15a&lt;/a> đi qua bốn ngành &amp;ldquo;kinh điển&amp;rdquo;; chương này chọn bốn ngành ở các &lt;strong>thái cực khác nhau của trục nhất quán&lt;/strong>: SaaS (ranh giới tenant là luật sống còn), Blockchain exchange (nguồn sự thật nằm một nửa ngoài hệ thống của bạn), Booking (tranh chấp tài nguyên theo thời gian — bài toán strong consistency thuần khiết nhất), và Social Network (read-heavy, eventual consistency là mặc định nhưng moderation phức tạp bất ngờ). Đọc bốn ngành cạnh nhau để thấy: cùng một bộ pattern, liều lượng và điểm đặt hoàn toàn khác nhau — đó chính là kỹ năng của kiến trúc sư.&lt;/p></description></item><item><title>Chương 15a — Case Study: E-commerce, FinTech, Banking, Logistics</title><link>https://thanhhv.github.io/series/domain-driven-design/15a-case-study-ecommerce-fintech-banking-logistics/</link><pubDate>Thu, 09 Jul 2026 22:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/domain-driven-design/15a-case-study-ecommerce-fintech-banking-logistics/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>Vị trí trong bộ tài liệu:&lt;/strong> Đây là chương đầu tiên trong cặp chương case study (15a/15b), đứng sau &lt;a href="https://thanhhv.github.io/series/domain-driven-design/14-ddd-trong-production/">Chương 14 — DDD trong Production&lt;/a>. Toàn bộ lý thuyết từ chương 01–14 — Subdomain, Bounded Context, Context Mapping, Aggregate, Domain Event, kiến trúc và distributed systems — sẽ được &amp;ldquo;thử lửa&amp;rdquo; qua 4 ngành có độ phức tạp domain rất khác nhau: &lt;strong>E-commerce, FinTech (ví điện tử/payment), Banking (core banking + lending), Logistics (last-mile delivery)&lt;/strong>. Mục tiêu không phải là đưa cho bạn thiết kế để copy, mà là cho bạn thấy &lt;strong>cách lập luận&lt;/strong>: cùng một pattern, tại sao ngành này dùng còn ngành kia thì không.&lt;/p></description></item><item><title>Chương 14: DDD trong Production — Refactoring, Adoption, Tổ chức Team và Vận hành Dài hạn</title><link>https://thanhhv.github.io/series/domain-driven-design/14-ddd-trong-production/</link><pubDate>Thu, 09 Jul 2026 21:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/domain-driven-design/14-ddd-trong-production/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>Vị trí chương này trong tài liệu:&lt;/strong> Sau khi đã nắm toàn bộ tactical patterns (chương 06–11), kiến trúc (chương 12) và distributed systems (chương 13), chương này trả lời câu hỏi thực tế nhất: &lt;em>làm sao đưa DDD vào một hệ thống đang chạy, đang có khách hàng, đang có team, đang có deadline?&lt;/em> Đây là chương dành cho những người phải sống với hệ quả của quyết định kiến trúc — không phải trên slide, mà trong production lúc 2 giờ sáng. Chương tiếp theo (&lt;a href="https://thanhhv.github.io/series/domain-driven-design/15a-case-study-ecommerce-fintech-banking-logistics/">15a&lt;/a>) sẽ áp dụng toàn bộ những gì bàn ở đây vào các case study cụ thể.&lt;/p></description></item><item><title>Chương 13: DDD và Distributed Systems</title><link>https://thanhhv.github.io/series/domain-driven-design/13-ddd-va-distributed-systems/</link><pubDate>Thu, 09 Jul 2026 20:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/domain-driven-design/13-ddd-va-distributed-systems/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>Vị trí trong lộ trình&lt;/strong>: Chương 12 kết thúc ở ranh giới của một process — kiến trúc bảo vệ domain model bên trong một deployable. Chương này bước qua ranh giới đó. Ngay khi hệ thống của bạn có từ hai deployable trở lên (dù chỉ là API + worker, chưa cần tới microservices), một loạt định luật vật lý mới có hiệu lực: message có thể lặp, mất, đến trễ hoặc sai thứ tự; transaction không trải qua hai database; &amp;ldquo;lưu xong rồi publish&amp;rdquo; không còn là một hành động atomic. Đây là chương dài nhất của bộ tài liệu, vì đây là nơi phần lớn hệ thống production thật sự gãy — không phải ở chỗ model Entity hay Value Object, mà ở chỗ hai bounded context nói chuyện với nhau qua một đường mạng không đáng tin. Sau chương này là &lt;a href="https://thanhhv.github.io/series/domain-driven-design/14-ddd-trong-production/">14 - DDD trong Production&lt;/a>.&lt;/p></description></item><item><title>Chương 12: DDD và Kiến trúc hệ thống</title><link>https://thanhhv.github.io/series/domain-driven-design/12-ddd-va-kien-truc/</link><pubDate>Thu, 09 Jul 2026 19:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/domain-driven-design/12-ddd-va-kien-truc/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>Vị trí trong lộ trình&lt;/strong>: Đến chương này, bạn đã có đầy đủ tactical patterns — Entity, Value Object, Aggregate, Repository, Domain Service, Domain Event, Specification. Câu hỏi tiếp theo không còn là &amp;ldquo;mô hình hóa domain thế nào&amp;rdquo; mà là &amp;ldquo;&lt;strong>đặt cái domain model đó vào đâu trong codebase, và bảo vệ nó bằng cách nào&lt;/strong>&amp;rdquo;. Chương này trả lời câu hỏi đó: từ layered architecture truyền thống, qua Hexagonal/Onion/Clean, đến cấu trúc thư mục cụ thể cho NestJS và Go, rồi mở rộng lên câu hỏi lớn hơn — Modular Monolith hay Microservices. Chương 13 sẽ tiếp tục với các pattern cho distributed systems.&lt;/p></description></item><item><title>Chương 11 — Specification: Business rule dạng điều kiện cũng xứng đáng có nhà</title><link>https://thanhhv.github.io/series/domain-driven-design/11-specification/</link><pubDate>Thu, 09 Jul 2026 18:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/domain-driven-design/11-specification/</guid><description>&lt;blockquote>
&lt;p>Vị trí trong bộ tài liệu: chương khép lại phần Tactical Design. Entity/Value Object (06) chứa rule của &lt;em>một&lt;/em> object, Aggregate (07) giữ invariant khi &lt;em>ghi&lt;/em>, Domain Service (09) chứa nghiệp vụ vắt qua nhiều object, Domain Event (10) lan truyền &lt;em>hậu quả&lt;/em>. Còn một loại rule chưa có nhà: &lt;strong>câu hỏi có/không về một object&lt;/strong> — &amp;ldquo;khách này có đủ điều kiện X không?&amp;rdquo;. Chương này ngắn hơn các chương trước, vì pattern nhỏ — nhưng nó hay bị dùng sai theo cả hai chiều: không dùng khi cần, và lạm dụng khi không cần.&lt;/p></description></item><item><title>Chương 10: Domain Event — Ghi lại những gì ĐÃ xảy ra, để phần còn lại của hệ thống tự lo</title><link>https://thanhhv.github.io/series/domain-driven-design/10-domain-event/</link><pubDate>Thu, 09 Jul 2026 17:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/domain-driven-design/10-domain-event/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>Vị trí chương này&lt;/strong>: Chương 9 kết thúc bằng một món nợ: &lt;code>PlaceOrderUseCase&lt;/code> gọi &lt;code>events.publishAll(order.pullDomainEvents())&lt;/code> và hứa &amp;ldquo;chương 10 giải thích&amp;rdquo;. Email xác nhận, SMS cho khách Platinum, cộng điểm loyalty, trừ kho — tất cả đã bị đuổi ra khỏi transaction đặt hàng mà chưa nói rõ chúng đi đâu. Chương này trả món nợ đó. Domain Event cũng là cây cầu nối sang phần sau của tài liệu: không hiểu nó thì không đọc được chương 12 (kiến trúc), chương 13 (distributed systems), và toàn bộ các case study 15a/15b.&lt;/p></description></item><item><title>Chương 9: Domain Service và Application Service — Tách "nồi lẩu" Service ra đúng tầng</title><link>https://thanhhv.github.io/series/domain-driven-design/09-domain-service-va-application-service/</link><pubDate>Thu, 09 Jul 2026 16:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/domain-driven-design/09-domain-service-va-application-service/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>Vị trí chương này&lt;/strong>: Bạn đã đi qua Entity, Value Object (chương 6), Aggregate (chương 7), Repository và Factory (chương 8). Đến đây, mô hình domain của bạn đã có &amp;ldquo;xương sống&amp;rdquo;. Nhưng thực tế sẽ nhanh chóng ném vào mặt bạn một câu hỏi: &lt;em>có những nghiệp vụ không thuộc về bất kỳ Entity nào cả — nhét nó vào đâu?&lt;/em> Chương này trả lời câu hỏi đó, và quan trọng hơn: mổ xẻ cái &lt;code>OrderService&lt;/code> 500 dòng mà gần như mọi codebase NestJS/Go đều có, rồi tách nó ra từng lớp một. Đây là chương &amp;ldquo;bẩn tay&amp;rdquo; nhất từ đầu tài liệu đến giờ.&lt;/p></description></item><item><title>Chương 08 — Repository và Factory: Cửa khẩu giữa Domain và hạ tầng lưu trữ</title><link>https://thanhhv.github.io/series/domain-driven-design/08-repository-va-factory/</link><pubDate>Thu, 09 Jul 2026 15:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/domain-driven-design/08-repository-va-factory/</guid><description>&lt;blockquote>
&lt;p>Vị trí trong bộ tài liệu: chương thứ ba của Tactical Design. Chương &lt;a href="https://thanhhv.github.io/series/domain-driven-design/06-entity-va-value-object/">06&lt;/a> xây viên gạch (Entity, Value Object), chương &lt;a href="https://thanhhv.github.io/series/domain-driven-design/07-aggregate/">07&lt;/a> xây bức tường (Aggregate và ranh giới nhất quán). Chương này trả lời câu hỏi còn treo: aggregate được &lt;strong>lấy ra&lt;/strong> và &lt;strong>cất vào&lt;/strong> đâu, bằng cách nào, mà domain model không bị ORM và SQL xâm thực.&lt;/p>&lt;/blockquote>
&lt;h2 id="1-problem-statement-domain-model-chết-đuối-trong-query">1. Problem Statement: Domain model chết đuối trong query&lt;/h2>
&lt;p>Một codebase NestJS điển hình sau 18 tháng:&lt;/p></description></item><item><title>Chương 07 — Aggregate và Aggregate Root: Consistency Boundary trong thế giới concurrent</title><link>https://thanhhv.github.io/series/domain-driven-design/07-aggregate/</link><pubDate>Thu, 09 Jul 2026 14:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/domain-driven-design/07-aggregate/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>Vị trí chương này:&lt;/strong> Đây là chương quan trọng nhất của toàn bộ Tactical Design — nếu chỉ được đọc kỹ một chương trong nửa sau tài liệu, hãy đọc chương này. &lt;a href="https://thanhhv.github.io/series/domain-driven-design/06-entity-va-value-object/">Chương 06&lt;/a> cho chúng ta Entity và Value Object — công cụ bảo vệ tính đúng đắn của &lt;em>từng object riêng lẻ&lt;/em>. Nhưng bug đắt nhất trong production hiếm khi nằm ở một object: nó nằm ở &lt;strong>invariant xuyên nhiều object, bị xé rách bởi các request chạy đồng thời&lt;/strong>. Aggregate là câu trả lời của DDD cho đúng bài toán đó. Hiểu sai Aggregate thì Repository (&lt;a href="https://thanhhv.github.io/series/domain-driven-design/08-repository-va-factory/">chương 08&lt;/a>), Domain Event (&lt;a href="https://thanhhv.github.io/series/domain-driven-design/10-domain-event/">chương 10&lt;/a>) và toàn bộ phần distributed systems (&lt;a href="https://thanhhv.github.io/series/domain-driven-design/13-ddd-va-distributed-systems/">chương 13&lt;/a>) sẽ sai theo.&lt;/p></description></item><item><title>Chương 6: Entity và Value Object — Hai viên gạch đầu tiên của Tactical Design</title><link>https://thanhhv.github.io/series/domain-driven-design/06-entity-va-value-object/</link><pubDate>Thu, 09 Jul 2026 13:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/domain-driven-design/06-entity-va-value-object/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>Vị trí chương này:&lt;/strong> Từ chương 1 đến chương 5, chúng ta đã đi qua Strategic Design — cách chia hệ thống thành Domain, Subdomain, Bounded Context và cách các context nói chuyện với nhau. Từ chương này trở đi, chúng ta bước vào &lt;strong>Tactical Design&lt;/strong>: cách viết code &lt;em>bên trong&lt;/em> một Bounded Context. Entity và Value Object là hai building block cơ bản nhất — mọi thứ khác (Aggregate ở chương 7, Repository ở chương 8, Domain Service ở chương 9) đều xây trên hai khái niệm này. Nếu bạn hiểu sai Entity/Value Object, toàn bộ phần còn lại của Tactical Design sẽ méo theo.&lt;/p></description></item><item><title>Chương 05 — Context Mapping: Bản Đồ Quyền Lực Giữa Các Bounded Context</title><link>https://thanhhv.github.io/series/domain-driven-design/05-context-mapping/</link><pubDate>Thu, 09 Jul 2026 12:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/domain-driven-design/05-context-mapping/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>Vị trí chương này trong chuỗi tài liệu:&lt;/strong> Ở &lt;a href="https://thanhhv.github.io/series/domain-driven-design/04-bounded-context/">chương 04&lt;/a>, chúng ta đã vẽ xong ranh giới — mỗi Bounded Context có model riêng, ngôn ngữ riêng, team riêng. Nhưng ranh giới không có nghĩa là cô lập: Ordering vẫn phải biết giá từ Catalog, Shipping vẫn phải nhận đơn từ Ordering, và cả hệ thống vẫn phải nói chuyện với core banking 20 năm tuổi của đối tác. Chương này trả lời câu hỏi: &lt;strong>các context quan hệ với nhau như thế nào — về mặt kỹ thuật, và quan trọng hơn, về mặt tổ chức và quyền lực?&lt;/strong> Đây là chương khép lại phần strategic design; từ &lt;a href="https://thanhhv.github.io/series/domain-driven-design/06-entity-va-value-object/">chương 06&lt;/a> trở đi chúng ta đi vào tactical design — xây dựng model &lt;em>bên trong&lt;/em> một context.&lt;/p></description></item><item><title>Chương 04 — Bounded Context: Ranh Giới Ngữ Nghĩa Của Model</title><link>https://thanhhv.github.io/series/domain-driven-design/04-bounded-context/</link><pubDate>Thu, 09 Jul 2026 11:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/domain-driven-design/04-bounded-context/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>Vị trí chương này trong chuỗi tài liệu:&lt;/strong> Ở &lt;a href="https://thanhhv.github.io/series/domain-driven-design/02-domain-va-subdomain/">chương 02&lt;/a>, chúng ta đã mổ xẻ domain và subdomain — tức là &lt;em>bài toán&lt;/em> mà business đang phải giải. Ở &lt;a href="https://thanhhv.github.io/series/domain-driven-design/03-ubiquitous-language/">chương 03&lt;/a>, chúng ta thống nhất rằng ngôn ngữ chung giữa engineer và domain expert là nền móng của mọi model tốt. Chương này trả lời câu hỏi tiếp theo, và cũng là câu hỏi quan trọng bậc nhất của DDD chiến lược: &lt;strong>ngôn ngữ đó, model đó, có hiệu lực đến đâu? Ranh giới của nó nằm ở chỗ nào?&lt;/strong> Nếu bạn chỉ được đọc một chương duy nhất trong toàn bộ phần strategic design, hãy đọc chương này. Chương kế tiếp — &lt;a href="https://thanhhv.github.io/series/domain-driven-design/05-context-mapping/">05: Context Mapping&lt;/a> — sẽ nói về chuyện gì xảy ra &lt;em>giữa&lt;/em> các ranh giới đó.&lt;/p></description></item><item><title>Chương 03 — Ubiquitous Language: Ngôn ngữ chung là nền móng, không phải phụ kiện</title><link>https://thanhhv.github.io/series/domain-driven-design/03-ubiquitous-language/</link><pubDate>Thu, 09 Jul 2026 10:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/domain-driven-design/03-ubiquitous-language/</guid><description>&lt;blockquote>
&lt;p>Vị trí trong bộ tài liệu: chương cuối của phần Foundations. Chương &lt;a href="https://thanhhv.github.io/series/domain-driven-design/01-tai-sao-ddd-ra-doi/">01&lt;/a> chỉ ra business complexity là kẻ thù chính; chương &lt;a href="https://thanhhv.github.io/series/domain-driven-design/02-domain-va-subdomain/">02&lt;/a> dạy cách chia domain để phân bổ nguồn lực. Chương này trả lời câu hỏi nền tảng hơn cả hai: &lt;strong>làm sao để những gì team hiểu về nghiệp vụ không bị bóp méo trên đường đi từ cuộc họp vào code&lt;/strong>. Không có chương này, mọi pattern phía sau đều xây trên cát.&lt;/p></description></item><item><title>Chương 02 — Domain và Subdomain: Bản đồ chiến lược trước khi viết dòng code đầu tiên</title><link>https://thanhhv.github.io/series/domain-driven-design/02-domain-va-subdomain/</link><pubDate>Thu, 09 Jul 2026 09:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/domain-driven-design/02-domain-va-subdomain/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>Vị trí trong bộ tài liệu:&lt;/strong> Chương trước (&lt;a href="https://thanhhv.github.io/series/domain-driven-design/01-tai-sao-ddd-ra-doi/">01 — Tại sao DDD ra đời&lt;/a>) đã xác lập rằng business complexity là kẻ thù chính và DDD là phương pháp tư duy để quản lý nó. Chương này trả lời câu hỏi chiến lược đầu tiên mà mọi Architect phải trả lời &lt;strong>trước khi&lt;/strong> chọn công nghệ, vẽ kiến trúc hay tạo class: &lt;em>độ phức tạp nghiệp vụ nằm ở đâu trong doanh nghiệp, phần nào tạo ra tiền, và phần nào đáng đầu tư kỹ sư giỏi nhất?&lt;/em> Đây là nội dung Strategic Design thuần túy — chưa có một dòng Entity hay Aggregate nào. Chương tiếp theo: &lt;a href="https://thanhhv.github.io/series/domain-driven-design/03-ubiquitous-language/">03 — Ubiquitous Language&lt;/a>. Mục lục: &lt;a href="https://thanhhv.github.io/series/domain-driven-design/00-muc-luc/">00-muc-luc.md&lt;/a>.&lt;/p></description></item><item><title>Chương 01 — Tại sao DDD ra đời: Business Complexity là kẻ thù thật sự</title><link>https://thanhhv.github.io/series/domain-driven-design/01-tai-sao-ddd-ra-doi/</link><pubDate>Thu, 09 Jul 2026 08:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/domain-driven-design/01-tai-sao-ddd-ra-doi/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>Vị trí trong bộ tài liệu:&lt;/strong> Đây là chương mở đầu của bộ tài liệu Domain-Driven Design (xem &lt;a href="https://thanhhv.github.io/series/domain-driven-design/00-muc-luc/">00-muc-luc.md&lt;/a>). Trước khi nói về Bounded Context, Aggregate hay Domain Event, chúng ta phải trả lời câu hỏi nền tảng nhất: &lt;strong>DDD sinh ra để giải quyết vấn đề gì, và tại sao những cách làm quen thuộc — database-first, CRUD, transaction script — lại thất bại?&lt;/strong> Nếu bạn không đồng ý với chương này, mọi chương sau đều vô nghĩa với bạn. Chương tiếp theo: &lt;a href="https://thanhhv.github.io/series/domain-driven-design/02-domain-va-subdomain/">02-domain-va-subdomain.md&lt;/a>.&lt;/p></description></item><item><title>Domain-Driven Design — Bộ tài liệu chuyên sâu</title><link>https://thanhhv.github.io/series/domain-driven-design/00-muc-luc/</link><pubDate>Thu, 09 Jul 2026 07:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/domain-driven-design/00-muc-luc/</guid><description>&lt;blockquote>
&lt;p>Tài liệu dành cho Backend Engineer, Senior Backend Engineer, Tech Lead, Solution Architect và Software Architect. Viết bằng tiếng Việt, giữ nguyên thuật ngữ chuyên ngành (Domain, Bounded Context, Aggregate, Entity, Value Object, Domain Event, Repository, Ubiquitous Language&amp;hellip;). Code mẫu dùng TypeScript (NestJS) và Go, mỗi khái niệm đều được đối chiếu với cách làm phổ biến trong framework để chỉ ra những điểm dễ hiểu sai.&lt;/p>&lt;/blockquote>
&lt;h2 id="tài-liệu-này-viết-theo-triết-lý-nào">Tài liệu này viết theo triết lý nào&lt;/h2>
&lt;p>Không chương nào mở đầu bằng định nghĩa. Mọi khái niệm đi theo mạch: &lt;strong>vấn đề business có thật → vì sao cách làm truyền thống thất bại → bản chất của lời giải → cách hoạt động → điểm mạnh, điểm yếu, trade-off → cân nhắc production → anti-pattern → khi nào KHÔNG nên dùng&lt;/strong>. Mỗi kết luận kỹ thuật đều phải trả lời: tại sao? đánh đổi gì? không áp dụng thì sao? áp dụng sai thì hậu quả gì? Và xuyên suốt: DDD không phải một bộ class — nó là phương pháp tư duy để quản lý sự phức tạp của business; tài liệu không thần thánh hóa nó, mà chỉ rõ chỗ nào nó đáng tiền và chỗ nào nó là gánh nặng.&lt;/p></description></item><item><title>Chương 16: Failure Cases — Phân tích sự cố Production</title><link>https://thanhhv.github.io/series/backend-communication-architect/16-failure-cases/</link><pubDate>Sun, 22 Feb 2026 21:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/backend-communication-architect/16-failure-cases/</guid><description>&lt;p>&lt;a href="https://thanhhv.github.io/series/backend-communication-architect/15-principal-architecture/">← Chương trước&lt;/a> | Mục lục | Chương sau →&lt;/p>
&lt;hr>
&lt;p>Đây là chương quan trọng nhất của toàn bộ tài liệu. Mọi kiến thức về giao thức, message broker, resilience pattern ở các chương trước chỉ thực sự có giá trị khi bạn đứng trước một dashboard đỏ rực lúc 2 giờ sáng và phải trả lời ba câu hỏi: &lt;strong>chuyện gì đang xảy ra, tại sao, và làm gì ngay bây giờ&lt;/strong>.&lt;/p></description></item><item><title>Chương 15. Principal Architecture — Multi-Region, Cross-DC và Large Scale</title><link>https://thanhhv.github.io/series/backend-communication-architect/15-principal-architecture/</link><pubDate>Sun, 22 Feb 2026 20:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/backend-communication-architect/15-principal-architecture/</guid><description>&lt;p>&lt;a href="https://thanhhv.github.io/series/backend-communication-architect/14-microservices-communication/">← Chương trước&lt;/a> | Mục lục | &lt;a href="https://thanhhv.github.io/series/backend-communication-architect/16-failure-cases/">Chương sau →&lt;/a>&lt;/p>
&lt;hr>
&lt;h2 id="151-business-problem-khi-công-ty-vượt-qua-biên-giới-một-region">15.1. Business problem: khi công ty vượt qua biên giới một region&lt;/h2>
&lt;p>Hãy bắt đầu từ một tình huống có thật ở hầu hết các công ty tăng trưởng nhanh.&lt;/p>
&lt;p>Công ty của bạn khởi đầu với toàn bộ hệ thống đặt tại một region — giả sử &lt;code>us-east-1&lt;/code> (Virginia). Ba năm sau, business mở rộng ra ba châu lục: Bắc Mỹ, châu Âu, và Đông Nam Á. Ngay lập tức, ba loại áp lực xuất hiện cùng lúc, và cả ba đều không giải quyết được bằng cách &amp;ldquo;tối ưu code&amp;rdquo;:&lt;/p></description></item><item><title>Chương 14 — Microservices Communication: API Gateway và Service Mesh</title><link>https://thanhhv.github.io/series/backend-communication-architect/14-microservices-communication/</link><pubDate>Sun, 22 Feb 2026 19:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/backend-communication-architect/14-microservices-communication/</guid><description>&lt;p>← Chương trước | Mục lục | &lt;a href="https://thanhhv.github.io/series/backend-communication-architect/15-principal-architecture/">Chương sau →&lt;/a>&lt;/p>
&lt;hr>
&lt;h2 id="mở-đầu-bài-toán-kinh-doanh">Mở đầu: Bài toán kinh doanh&lt;/h2>
&lt;p>Hãy bắt đầu từ một câu chuyện quen thuộc. Công ty của bạn có một monolith, 50 developer, deploy 1 lần/tuần. Mỗi lần deploy là một &amp;ldquo;sự kiện&amp;rdquo;: freeze code từ thứ Tư, QA regression 2 ngày, deploy đêm thứ Sáu, và cả team on-call cuối tuần. Feature nhỏ nhất cũng mất 2 tuần để ra production vì phải xếp hàng chung chuyến tàu release. Ban lãnh đạo hỏi: &amp;ldquo;Đối thủ ship feature mỗi ngày, tại sao chúng ta mất 2 tuần?&amp;rdquo;&lt;/p></description></item><item><title>Chương 12: Resilience Patterns — Giao tiếp ổn định trong hệ thống không ổn định</title><link>https://thanhhv.github.io/series/backend-communication-architect/12-resilience-patterns/</link><pubDate>Sun, 22 Feb 2026 18:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/backend-communication-architect/12-resilience-patterns/</guid><description>&lt;p>&lt;a href="https://thanhhv.github.io/series/backend-communication-architect/11-api-design/">← Chương trước&lt;/a> | Mục lục | Chương sau →&lt;/p>
&lt;hr>
&lt;h2 id="121-first-principles-partial-failure-là-trạng-thái-bình-thường">12.1. First principles: partial failure là trạng thái bình thường&lt;/h2>
&lt;p>Trong monolith, một lời gọi hàm hoặc thành công hoặc ném exception — và cả hai đều xảy ra trong cùng một process, cùng một số phận. Khoảnh khắc bạn tách hàm đó ra sau một network call, bạn nhận về một tập kết quả hoàn toàn mới: thành công, thất bại, &lt;strong>và mọi trạng thái lửng lơ ở giữa&lt;/strong> — request đến nơi nhưng response thất lạc, request đang xếp hàng ở đâu đó và sẽ được xử lý sau 30 giây nữa, downstream đã xử lý xong nhưng bạn đã bỏ đi.&lt;/p></description></item><item><title>Chương 11: API Design — Thiết kế API cho tuổi thọ 10 năm</title><link>https://thanhhv.github.io/series/backend-communication-architect/11-api-design/</link><pubDate>Sun, 22 Feb 2026 17:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/backend-communication-architect/11-api-design/</guid><description>&lt;p>&lt;a href="https://thanhhv.github.io/series/backend-communication-architect/10-so-sanh-communication-pattern/">← Chương trước&lt;/a> | Mục lục | &lt;a href="https://thanhhv.github.io/series/backend-communication-architect/12-resilience-patterns/">Chương sau →&lt;/a>&lt;/p>
&lt;hr>
&lt;h2 id="111-vì-sao-api-design-là-quyết-định-khó-đảo-ngược-nhất">11.1. Vì sao API design là quyết định khó đảo ngược nhất&lt;/h2>
&lt;p>Bắt đầu từ một sự thật mà mọi engineer đều học được theo cách đau đớn: &lt;strong>code là tài sản riêng của bạn, còn API là hợp đồng công khai với người khác&lt;/strong>. Bạn có thể refactor toàn bộ internal implementation vào thứ Ba tuần sau mà không ai hay biết. Nhưng một field đã xuất hiện trong response, một URI đã có người gọi, một status code đã có người viết &lt;code>if&lt;/code> để bắt — những thứ đó không còn thuộc về bạn nữa. Chúng thuộc về mọi consumer đang phụ thuộc vào chúng.&lt;/p></description></item><item><title>Chương 10: So sánh Communication Pattern và Framework quyết định</title><link>https://thanhhv.github.io/series/backend-communication-architect/10-so-sanh-communication-pattern/</link><pubDate>Sun, 22 Feb 2026 16:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/backend-communication-architect/10-so-sanh-communication-pattern/</guid><description>&lt;p>&lt;a href="https://thanhhv.github.io/series/backend-communication-architect/09-event-streaming/">← Chương trước&lt;/a> | Mục lục | &lt;a href="https://thanhhv.github.io/series/backend-communication-architect/11-api-design/">Chương sau →&lt;/a>&lt;/p>
&lt;hr>
&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Chín chương vừa qua đã mổ xẻ từng công nghệ. Bây giờ là câu hỏi mà mọi architect phải trả lời hàng tuần, và là câu hỏi bị trả lời sai nhiều nhất:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Service A cần nói chuyện với Service B / với client. Dùng cái gì?&amp;rdquo;&lt;/p>&lt;/blockquote>
&lt;p>Cách câu hỏi này thường bị trả lời sai trong thực tế:&lt;/p></description></item><item><title>Chương 9: Event Streaming — Log phân tán và xử lý sự kiện quy mô lớn</title><link>https://thanhhv.github.io/series/backend-communication-architect/09-event-streaming/</link><pubDate>Sun, 22 Feb 2026 15:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/backend-communication-architect/09-event-streaming/</guid><description>&lt;p>&lt;a href="https://thanhhv.github.io/series/backend-communication-architect/08-message-queue/">← Chương trước&lt;/a> | Mục lục | &lt;a href="https://thanhhv.github.io/series/backend-communication-architect/10-so-sanh-communication-pattern/">Chương sau →&lt;/a>&lt;/p>
&lt;hr>
&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Hãy bắt đầu bằng một bài toán thật, không phải định nghĩa sách giáo khoa.&lt;/p>
&lt;p>Bạn vận hành một nền tảng thương mại điện tử. Mỗi hành động của người dùng — xem sản phẩm, thêm vào giỏ, tìm kiếm, click banner — sinh ra một event. Ở quy mô 10 triệu người dùng hoạt động, hệ thống của bạn sinh &lt;strong>2–5 triệu event mỗi giây&lt;/strong> vào giờ cao điểm. Và đây là danh sách những bên muốn tiêu thụ dòng event đó:&lt;/p></description></item><item><title>Chương 8: Message Queue — Tách rời thời gian giữa các hệ thống</title><link>https://thanhhv.github.io/series/backend-communication-architect/08-message-queue/</link><pubDate>Sun, 22 Feb 2026 14:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/backend-communication-architect/08-message-queue/</guid><description>&lt;p>&lt;a href="https://thanhhv.github.io/series/backend-communication-architect/07-sse/">← Chương trước&lt;/a> | Mục lục | &lt;a href="https://thanhhv.github.io/series/backend-communication-architect/09-event-streaming/">Chương sau →&lt;/a>&lt;/p>
&lt;hr>
&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Hãy bắt đầu từ một luồng nghiệp vụ mà mọi hệ thống e-commerce đều có: &lt;strong>khách hàng đặt hàng thành công&lt;/strong>.&lt;/p>
&lt;p>Khi đơn hàng được tạo, hệ thống phải làm ít nhất bốn việc:&lt;/p>
&lt;ol>
&lt;li>Gửi email xác nhận cho khách.&lt;/li>
&lt;li>Cộng điểm tích lũy (loyalty).&lt;/li>
&lt;li>Cập nhật tồn kho (inventory).&lt;/li>
&lt;li>Đẩy dữ liệu sang hệ thống analytics.&lt;/li>
&lt;/ol>
&lt;p>Cách tiếp cận ngây thơ nhất — và cũng là cách hầu hết các hệ thống bắt đầu — là gọi synchronous tất cả trong cùng một request:&lt;/p></description></item><item><title>Chương 7: Server-Sent Events — Push đơn giản trên HTTP</title><link>https://thanhhv.github.io/series/backend-communication-architect/07-sse/</link><pubDate>Sun, 22 Feb 2026 13:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/backend-communication-architect/07-sse/</guid><description>&lt;p>&lt;a href="https://thanhhv.github.io/series/backend-communication-architect/06-websocket/">← Chương trước&lt;/a> | Mục lục | &lt;a href="https://thanhhv.github.io/series/backend-communication-architect/08-message-queue/">Chương sau →&lt;/a>&lt;/p>
&lt;hr>
&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Ba bài toán rất phổ biến có chung một hình dạng:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Dashboard giá / telemetry&lt;/strong>: server đẩy giá mới, số liệu mới xuống hàng nghìn màn hình. Client chỉ nhìn, không gửi gì (ngoài vài thao tác lọc hiếm hoi qua REST).&lt;/li>
&lt;li>&lt;strong>Notification feed&lt;/strong>: &amp;ldquo;bạn có comment mới&amp;rdquo; — server phát, client nhận.&lt;/li>
&lt;li>&lt;strong>LLM token streaming&lt;/strong>: model sinh token, server đẩy từng token xuống UI ngay khi có. Client gửi đúng một prompt lúc đầu (qua POST), sau đó chỉ nhận.&lt;/li>
&lt;/ul>
&lt;p>Điểm chung: &lt;strong>dữ liệu chảy một chiều, server → client&lt;/strong>. Chiều ngược lại hoặc không tồn tại, hoặc thưa thớt tới mức một HTTP request bình thường phục vụ tốt.&lt;/p></description></item><item><title>Chương 6: WebSocket — Kênh song công cho Realtime</title><link>https://thanhhv.github.io/series/backend-communication-architect/06-websocket/</link><pubDate>Sun, 22 Feb 2026 12:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/backend-communication-architect/06-websocket/</guid><description>&lt;p>&lt;a href="https://thanhhv.github.io/series/backend-communication-architect/05-grpc/">← Chương trước&lt;/a> | Mục lục | &lt;a href="https://thanhhv.github.io/series/backend-communication-architect/07-sse/">Chương sau →&lt;/a>&lt;/p>
&lt;hr>
&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Bạn đang xây một collaboration app: chat nhóm, cursor tracking, comment realtime. Yêu cầu nghiệp vụ rất rõ ràng: khi user A gõ một tin nhắn, user B phải thấy nó trong vòng dưới 200ms; đồng thời client của B cũng liên tục gửi trạng thái của chính nó lên server (typing indicator, cursor position). Nghĩa là dữ liệu chảy &lt;strong>cả hai chiều, liên tục, với tần suất cao và độ trễ thấp&lt;/strong>.&lt;/p></description></item><item><title>Chương 5: gRPC — RPC hiệu năng cao cho Internal Services</title><link>https://thanhhv.github.io/series/backend-communication-architect/05-grpc/</link><pubDate>Sun, 22 Feb 2026 11:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/backend-communication-architect/05-grpc/</guid><description>&lt;p>&lt;a href="https://thanhhv.github.io/series/backend-communication-architect/04-graphql/">← Chương trước&lt;/a> | Mục lục | &lt;a href="https://thanhhv.github.io/series/backend-communication-architect/06-websocket/">Chương sau →&lt;/a>&lt;/p>
&lt;hr>
&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Hãy bắt đầu từ một hệ thống thật. Bạn đang vận hành một nền tảng thương mại điện tử với khoảng 200 internal service. Mỗi request từ người dùng — ví dụ &amp;ldquo;đặt hàng&amp;rdquo; — kích hoạt một chuỗi gọi nội bộ: &lt;code>api-gateway → order-service → inventory-service → pricing-service → promotion-service → payment-service → notification-service&lt;/code>. Fan-out trung bình 1 request bên ngoài thành 15–30 lời gọi nội bộ. Ở mức 5.000 request/giây từ phía người dùng, hệ thống nội bộ đang xử lý &lt;strong>hơn 100.000 lời gọi service-to-service mỗi giây&lt;/strong>.&lt;/p></description></item><item><title>Chương 4: GraphQL — Query Language cho API</title><link>https://thanhhv.github.io/series/backend-communication-architect/04-graphql/</link><pubDate>Sun, 22 Feb 2026 10:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/backend-communication-architect/04-graphql/</guid><description>&lt;p>&lt;a href="https://thanhhv.github.io/series/backend-communication-architect/03-rest/">← Chương trước&lt;/a> | Mục lục | &lt;a href="https://thanhhv.github.io/series/backend-communication-architect/05-grpc/">Chương sau →&lt;/a>&lt;/p>
&lt;hr>
&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Hãy bắt đầu bằng một tình huống mà gần như mọi team backend phục vụ mobile app đều gặp phải.&lt;/p>
&lt;p>Công ty bạn có một mobile app thương mại điện tử. App có màn hình Home, màn hình Profile, màn hình Order History, màn hình Order Detail. Backend đã có sẵn một bộ REST API được thiết kế &amp;ldquo;chuẩn resource-oriented&amp;rdquo;:&lt;/p></description></item><item><title>Chương 3. REST — Kiến trúc tài nguyên trên HTTP</title><link>https://thanhhv.github.io/series/backend-communication-architect/03-rest/</link><pubDate>Sun, 22 Feb 2026 09:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/backend-communication-architect/03-rest/</guid><description>&lt;p>&lt;a href="https://thanhhv.github.io/series/backend-communication-architect/02-http/">← Chương trước&lt;/a> | Mục lục | &lt;a href="https://thanhhv.github.io/series/backend-communication-architect/04-graphql/">Chương sau →&lt;/a>&lt;/p>
&lt;hr>
&lt;h2 id="31-problem-statement--bài-toán-trước-khi-có-giải-pháp">3.1. Problem Statement — bài toán trước khi có giải pháp&lt;/h2>
&lt;p>Hãy bắt đầu từ một tình huống rất thật. Công ty bạn có một hệ thống quản lý đơn hàng. Ban đầu chỉ có một web app nội bộ gọi thẳng vào database. Sau 18 tháng, bức tranh thay đổi:&lt;/p>
&lt;ul>
&lt;li>Team mobile cần đọc/ghi đơn hàng từ iOS và Android.&lt;/li>
&lt;li>Đối tác logistics cần truy vấn trạng thái đơn qua máy chủ của họ.&lt;/li>
&lt;li>Team data cần kéo dữ liệu định kỳ để làm báo cáo.&lt;/li>
&lt;li>Một team khác xây admin portal, cũng cần cùng dữ liệu nhưng thao tác khác.&lt;/li>
&lt;/ul>
&lt;p>Bốn client, bốn ngôn ngữ, bốn vòng đời release khác nhau — tất cả cần truy cập &lt;strong>cùng một tập dữ liệu&lt;/strong> qua HTTP. Câu hỏi kỹ thuật đặt ra:&lt;/p></description></item><item><title>Chương 2: HTTP — Nền tảng của giao tiếp hiện đại</title><link>https://thanhhv.github.io/series/backend-communication-architect/02-http/</link><pubDate>Sun, 22 Feb 2026 08:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/backend-communication-architect/02-http/</guid><description>&lt;p>&lt;a href="https://thanhhv.github.io/series/backend-communication-architect/01-communication-fundamentals/">← Chương trước&lt;/a> | Mục lục | &lt;a href="https://thanhhv.github.io/series/backend-communication-architect/03-rest/">Chương sau →&lt;/a>&lt;/p>
&lt;hr>
&lt;h2 id="1-problem-statement">1. Problem Statement&lt;/h2>
&lt;p>Hãy bắt đầu bằng một tình huống production quen thuộc.&lt;/p>
&lt;p>Hệ thống e-commerce của bạn có 40 microservice. Một buổi sáng thứ Hai, sau đợt flash sale, team on-call báo cáo: service &lt;code>checkout&lt;/code> gọi service &lt;code>pricing&lt;/code> với p99 latency tăng từ 15ms lên 800ms, dù CPU của &lt;code>pricing&lt;/code> chỉ 30%. Không có deploy mới. Không có query chậm. Metrics của &lt;code>pricing&lt;/code> hoàn toàn bình thường.&lt;/p></description></item><item><title>Chương 1: Communication Fundamentals — Vì sao hệ thống cần giao tiếp</title><link>https://thanhhv.github.io/series/backend-communication-architect/01-communication-fundamentals/</link><pubDate>Sun, 22 Feb 2026 07:00:00 +0700</pubDate><guid>https://thanhhv.github.io/series/backend-communication-architect/01-communication-fundamentals/</guid><description>&lt;p>← Mục lục | &lt;a href="https://thanhhv.github.io/series/backend-communication-architect/02-http/">Chương sau →&lt;/a>&lt;/p>
&lt;hr>
&lt;h2 id="1-problem-statement-từ-một-function-call-đến-một-network-call">1. Problem Statement: Từ một function call đến một network call&lt;/h2>
&lt;p>Hãy bắt đầu từ một tình huống kinh doanh có thật, không phải từ định nghĩa.&lt;/p>
&lt;p>Công ty của bạn vận hành một hệ thống thương mại điện tử. Ba năm trước, toàn bộ hệ thống là một monolith viết bằng Go: module &lt;code>order&lt;/code> gọi module &lt;code>inventory&lt;/code> bằng một function call, module &lt;code>payment&lt;/code> gọi module &lt;code>notification&lt;/code> bằng một method trên struct. Mọi thứ chạy trong &lt;strong>cùng một process, cùng một address space, cùng một failure domain&lt;/strong>. Một lời gọi hàm mất vài chục nanosecond, không bao giờ &amp;ldquo;mất gói tin&amp;rdquo;, không bao giờ trả về một nửa kết quả, và hoặc là cả process sống, hoặc là cả process chết — không có trạng thái lưng chừng.&lt;/p></description></item></channel></rss>