I. Lời mở đầu

Trong lập trình hướng đối tượng, ta có 2 khái niệm quan trọng là classobject. Các design pattern giúp ta làm việc được với các classobject đó 1 cách hiệu quả. Tượng tự như thế, khi phát triển 1 distributed system ta cũng có các design pattern để làm việc với image containercontainer.

II. Single-container management patterns

Container cung cấp các interface được dùng để định nghĩa các chức năng của phần mềm ( upward API ) cũng như tương tác với các hệ thống quản lý phần mềm đó ( downward API ). Việc sử dụng các upward API cho phép các lập trình viên truy cập vào các thông tin chi tiết của ứng dụng, bao gồm việc quản lý các thông tin thể hiện trình trạng của ứng dụng (application health), thông tin ứng dụng (threads, stack, ...), các thông tin configuration, thông tin về logs.

Ví dụ như Kubernetes cho phép lập trình viên có thể định nghĩa việc health check cho ứng dụng thông qua 1 HTTP endpoint cụ thể nào đó ví dụ như /heath

III. Single-node, multi-container application patterns

Trong pattern này, nhiều container khác nhau sẽ được tổ chức trong 1 máy host duy nhất. Trong Kubernetes, phần abstraction đó được gọi là Pod. Ví dụ Pod có thể có 3 container bao gồm 1 container cho Nginx, 1 container cho server của ứng dụng và 1 container cho MySQL

1. Sidecar pattern

Trong mẫu này, chức năng của container chính được mở rộng bởi Sidecar container sao cho đảm sao cho cả 2 không bị phụ thuộc nhiều vào nhau. Mặc dù ta hoàn toàn có thể viết phần mang phần logic mà chúng ta muốn thêm trực tiếp vào container của ứng dụng (mà không cần phải tạo thêm Sidecar container), tuy nhiên khi tạo thêm Sidecar container sẽ mang lại 1 số lợi ích sau đây:

  • Giảm sự phụ thuộc về việc cấp phát và quản lý resource.
  • Tạo được sử tách biệt ở mức độ về package, giảm sự phụ thuộc giữa các container.
  • Tái sử dụng container của Sidecar để dùng lại với các "main" container khác.
  • Giảm sự phụ thuộc trong việc testing, packaging, upgrade, develoy.

2. Ambassador pattern

Ambassador container đóng vai trò như 1 proxy giữa các main container khác nhau. Thường dùng trong trường hợp liên quan đến giao tiếp proxy liên quan đến load balancing, sharding để ẩn đi sự phức tạp của ứng dụng.

3. Adapter pattern

Adapter container đóng vai trò chuẩn hóa và cho ra 1 output trong trường hợp cần làm việc với nhiều input có các chuẩn khác nhau.

Trong khi Ammbassador pattern ẩn đi sự phức tạp của ứng dụng và chỉ show ra 1 interface đơn giản cho thế giới bên ngoài dùng thì Adapter pattern làm theo chiều ngược lại, che đi sự phức tạp của thếgiới bên ngoài, biến nó thành 1 interface đơn giản và cung cấp interface đơn giản đó cho phía ứng dụng sử dụng. Nó chuẩn hóa các ouput và interface của nhiều container (có các output có nhiều chuẩn khác nhau) thành 1 chuẩn duy nhất.

IV. Multi-node application patterns

Các modular container cho phép chúng ta build các coordinated multi-node distributed systems. Đương nhiên là các ứng dụng sử dụng multi-note pattern sẽ sử dụng Pod là abstraction.

1. Leader election pattern

Các Leader-election containers đóng vai trò như các Sidecar containers và được quản lý cùng với container chính của ứng dụng. Các Leader-election container có thể tự chúng thực hiện bầu cử và đóng vai trò như 1 API HTTP đơn giản ở localhost cho các container của ứng dụng cần leader. Các Leader-election containers có thể được tái sử dụng cho nhiều loại ứng dụng chính khác nhau.

2. Work queue pattern

Mẫu này cài đặt 1 generic work queue framework sử dụng các container mà implement phương thức run()mount() sau đó build thành 1 hệ thống queue hoàn chỉnh.

3. Scatter/gather pattern

Mẫu này tương đối giống MapReduce framework. Có 1 external client gửi initial request tới framework được cung cấp bởi root container. Root yêu cầu các leaf container (được cung cấp bởi 1 lượng lớn các lập trình viên)  để thực hiện tính toán song song các request đó. Một lập trình viên khác có vai trò cung cấp merge container để merge kết quả lại. Ngoài ra ta có thể tạo ra 1 container khác gọi là shuffle có vai trò tương tự như bước shuffle trong việc thực hiện MapReduce.

V. Tài liệu tham khảo

https://www.abhishek-tiwari.com/object-inspired-container-design-patterns/