Trong lúc thiết kế hệ thống tôi đang cùng đội phát triển thảo luận về việc dùng DynamoDB hay PostgreSQL thì tôi có nhận được email từ 1 website mà tôi đã subcribe trước đó. Nội dùng bài viết đó là: “Làm thế nào mà Cloudflare có thể hỗ trợ được 55 triệu request/second với chỉ 15 Postgres Cluster”. Tôi thấy tiêu đề rất ấn tượng và quyết định đọc bài viết đó. Refer: https://newsletter.systemdesign.one/p/postgresql-scalability

Theo như số liệu bài viết thì Cloudflare đang phục vụ đến 20% lượng traffict trên internet tương đương với 55 triệu request/ second, đó là một con số rất ấn tượng. Cloudflare được thiết kế với kiến trúc multi tenant, mỗi tenant sẽ có workload khác nhau, do đó việc xây dựng clust sẽ là một thách thức.

Trước khi thực hiện giải pháp scalability chúng ta có thể nhận thấy một số vấn đề sau:

  1. Resouce usage Client cần giao tiếp với Postgres thông qua connection, nhưng số lượng connection sẽ là hữu hạn, mặt khác với mỗi tenant thì khả năng kết nối sẽ là khác nhau. Do đó chúng ta không thể có một con số giới hạn chung cho tất cả các tenant.

Để giải quyết vấn đề về connection, Cloudflare sử dụng PgBouncer. PgBouncer là một connection pool, được thiết lập phía trước của PostgreSQL. Khi client kết nối với DB, connection này sẽ được quản lý bởi connection pool. Chi tiết về PgBouncer các bạn có thể xem ở đây https://www.pgbouncer.org/features.html

  1. Clients query a server concurrently Với PgBouncer bạn đã có thể giải quyết bài toán về tối ưu connection pool. Ngoài ra còn một vấn đề rất phức tạp đó là khi có nhiều client thực hiện đồng thời truy vấn vào DB, nó sẽ gây ra vấn đề về hiệu năng cho DB.