← All posts

Scale-to-zero không biết đếm đến một

Authagonal·July 6, 2026
authinfrastructurekubernetesaksserverlessazurearchitecture

Lời khuyên luôn có cùng một hình dạng. Lưu lượng xác thực của bạn biến động mạnh. Cụm Kubernetes của bạn hầu như im lặng. Azure Container Apps tự động thu về không và chỉ tính phí những gì bạn sử dụng. Bạn đang trả tiền liên tục cho một cụm mà phần lớn thời gian chỉ chờ đợi.

Chúng tôi đã coi trọng nó đến mức tính toán chi phí di chuyển một cách chính xác. Sau đó, chúng tôi loại bỏ nó. Không phải vì giá của việc chuyển đổi, và không phải vì cold start, mặc dù cold start thôi cũng đủ để thuyết phục. Chúng tôi loại bỏ nó bởi vì nền tảng này thiếu một con số trong từ vựng của mình, và đó là con số duy nhất mà lõi xác thực của chúng tôi thực sự quan tâm.

Serverless đếm đến không và đến N

Các runtime scale-to-zero chỉ biết hai con số. Số không, khi không ai gọi. N, khi có người gọi, với N trôi nổi theo nhu cầu. Đối với việc xử lý yêu cầu không trạng thái, từ vựng đó là hoàn hảo, đó là lý do tại sao lời khuyên nghe có vẻ đúng như vậy. Hầu hết các backend web thực sự có hình dạng đó: mọi yêu cầu độc lập, mọi instance có thể bỏ đi, lưu lượng bằng không xứng đáng với hóa đơn bằng không.

Giao diện công khai của một hệ thống xác thực cũng giống như vậy. Điểm cuối token, trang đăng nhập, JWKS. Không trạng thái, biến động mạnh, thân thiện với bộ nhớ cache.

Bên dưới nó là một lớp không có những đặc điểm đó.

Con số là một

Bên dưới các điểm cuối, backplane của chúng tôi chạy một lớp điều phối. Tại bất kỳ thời điểm nào, chính xác một bản sao giữ quyền thuê cluster leadership (ngày nay là một blob lease, không còn gossip nữa, đó là câu chuyện cho một bài viết khác) và chạy các công việc đơn lẻ: đợt quét retention, lượt gửi webhook, những công việc mà hai trình thực thi đồng thời có nghĩa là tác dụng phụ bị kích hoạt hai lần và không có trình thực thi nào có nghĩa là mọi thứ lặng lẽ không bao giờ xảy ra.

Con số mà lớp đó cần là một. Không phải số không khi mọi thứ yên tĩnh. Không phải N khi có tải. Một, được giữ liên tục, với sự bàn giao có thể xác minh khi người giữ chết. Scale-to-zero không có cách nào để nói "một, luôn luôn". Nó có thể nói "ít nhất một trong khi có lưu lượng truy cập", đây là một lời hứa khác, và sự khác biệt giữa hai lời hứa đó chính xác là chế độ lỗi mà việc bầu cử leader tồn tại để ngăn chặn.

Đây là lý do tại sao biểu đồ sử dụng đang nói dối chúng tôi. Một cụm xác thực yên tĩnh không phải là đang không làm gì. Nó đang giữ một quyền thuê, giữ các khóa ký luôn nóng và sẵn sàng trả lời lượt xác thực token tiếp theo chỉ trong vài mili giây. Yên tĩnh và nhàn rỗi là hai trạng thái khác nhau, và bảng điều khiển thanh toán chỉ hiển thị cho bạn một trong số chúng.

Bạn có thể giả vờ, và điều đó còn tệ hơn

Bạn có thể ép "chính xác một" lên một runtime serverless. Ghim số bản sao tối thiểu ở mức một và bạn đã mua một máy chủ luôn bật trên một nền tảng mà toàn bộ bản năng của nó là thu hồi những instance yên tĩnh của bạn. Mọi sự kiện scale, mọi lần khởi động lại do nền tảng bắt đầu, mọi lần hoán đổi phiên bản trở thành một câu hỏi về leadership mà bạn không kiểm soát được thời điểm. Chúng tôi sẽ phải chiến đấu với hành vi cốt lõi của runtime để bảo tồn hành vi của mình, mãi mãi, và trả tiền cho đặc quyền đó.

Và lỗi rơi vào người tồi tệ nhất có thể. Yêu cầu phải chịu cold start là một con người đang cố đăng nhập. "Quá trình đăng nhập của bạn chậm vì dịch vụ xác thực của chúng tôi đang ngủ" không phải là một câu mà bất kỳ ai nên gửi đi.

Hóa đơn có một cách khắc phục nhàm chán

Còn số tiền đã bắt đầu tất cả điều này thì sao? Chỉ cần một bộ lập lịch và một SKU. Cụm dev hiện được giải phóng khi không ai sử dụng nó, và node pool chuyển sang một SKU rẻ hơn. Một đoạn văn là tất cả những gì nó xứng đáng, và đó là điểm mấu chốt: "ngừng trả tiền cho thời gian nhàn rỗi" là một mục tiêu, không phải một kiến trúc, và hầu hết mục tiêu đó có thể đạt được bằng một thay đổi cấu hình thay vì chuyển nền tảng.

Bài kiểm tra hình dạng

Quy tắc chúng tôi giữ lại: khớp runtime với hình dạng thực tế của tải công việc, chứ không phải biểu đồ lưu lượng của nó. Serverless thưởng cho những gì không trạng thái và bùng nổ theo đợt. Nó trừng phạt bất cứ thứ gì phải nắm giữ một vai trò liên tục và độc quyền, và một lõi xác thực bảo vệ các khóa ký và bầu chọn ai chạy các công việc phá hủy là ví dụ thuần túy nhất về loại thứ hai mà chúng tôi biết.

Chúng tôi không phản đối serverless. Rất nhiều bề mặt không trạng thái của chúng tôi sẽ sống hạnh phúc trên đó. Nhưng lớp phải đếm đến chính xác một sẽ vẫn ở trên cơ sở hạ tầng nhàm chán, luôn bật, có thể kiểm tra được.

Lớp đó cũng chính xác là những gì bạn ngừng phải vận hành khi bạn chạy xác thực trên Authagonal thay vì tự mình vận hành backplane.