Gần đây, chúng tôi đã bắt đầu một dự án nhỏ nhằm cải thiện cách các bộ phận trong hệ thống của chúng tôi giao tiếp ngầm tại Buffer. Một số bối cảnh nhanh: chúng tôi sử dụng thứ gọi là SQS (Dịch vụ xếp hàng đơn giản của Amazon. Những hàng đợi này hoạt động giống như phòng chờ thực hiện nhiệm vụ. Một phần trong hệ thống của chúng tôi gửi tin nhắn và phần khác sẽ nhận nó sau. Hãy nghĩ về việc này giống như để lại một ghi chú cho đồng nghiệp: "Này, khi bạn có cơ hội, hãy xử lý dữ liệu này". Hệ thống gửi ghi chú không cần phải đợi phản hồi. Dự án của chúng tôi là thực hiện bảo trì định kỳ: cập nhật các công cụ mà chúng tôi sử dụng để kiểm tra cục bộ các hàng đợi và dọn dẹp cấu hình của chúng. Nhưng trong khi vạch ra những hàng đợi mà chúng tôi thực sự sử dụng, chúng tôi đã tìm thấy một điều mà chúng tôi không mong đợi: bảy quy trình nền khác nhau (hoặc các công việc định kỳ, là các tác vụ được lên lịch chạy tự động) và các công cụ đã hoạt động âm thầm trong tối đa 5 năm. Tất cả chúng đều hoàn toàn không có tác dụng gì. Đây là lý do tại sao điều đó quan trọng, cách chúng tôi tìm thấy chúng và những gì chúng tôi đã làm với nó. đã tính toán nhanh và đối với một trong những công nhân đó, chúng tôi sẽ phải trả khoảng 360-600 USD trong 5 năm. Đây là một số tiền khiêm tốn trong kế hoạch tài chính lớn của chúng tôi, nhưng chắc chắn là lãng phí cho một quy trình không mang lại hiệu quả gì. Tuy nhiên, sau khi trải qua quá trình dọn dẹp này, tôi cho rằng chi phí tài chính thực sự là phần nhỏ nhất của vấn đề. Mỗi khi một kỹ sư mới gia nhập nhóm và khám phá hệ thống của chúng tôi, họ sẽ gặp phải những quy trình bí ẩn này, "Công nhân này làm gì sẽ trở thành một câu hỏi tiêu tốn thời gian làm quen" và Tất cả chúng ta đều đã ở đó — nhìn chằm chằm vào một đoạn mã, ngại chạm vào nó vì có thể nó đang thực hiện điều gì đó quan trọng. Ngay cả cơ sở hạ tầng "bị lãng quên" đôi khi cũng cần được chú ý. Điều này thật dễ dàng để chỉ ra, nhưng sự thật là điều này xảy ra một cách tự nhiên trong bất kỳ hệ thống tồn tại lâu dài nào. Một tính năng không còn được dùng nữa, nhưng công việc nền hỗ trợ nó vẫn tiếp tục chạy. Ai đó đã cử một nhân viên "tạm thời" để xử lý việc di chuyển và nó không bao giờ bị hủy bỏ. Một tác vụ đã lên lịch sẽ trở nên dư thừa sau khi thay đổi kiến trúc, nhưng không ai nghĩ đến việc kiểm tra. Để thực hiện việc này, chúng tôi đã chạy một tác vụ đã lên lịch để kiểm tra toàn bộ cơ sở dữ liệu về các ngày sinh phù hợp với ngày hiện tại và gửi cho khách hàng một email được cá nhân hóa. Trong quá trình tái cấu trúc email vào năm 2020, chúng tôi đã chuyển đổi công cụ email giao dịch của mình nhưng lại quên xóa công cụ này—nó vẫn tiếp tục hoạt động trong 5 năm nữa. Không có lỗi nào trong số này là lỗi của các cá nhân — chúng là lỗi của quy trình nếu không có sự dọn dẹp có chủ ý được tích hợp trong cách chúng tôi làm việc, thì entropy sẽ thắng. Cách kiến trúc của chúng tôi đã giúp chúng tôi tìm ra nó Giống như nhiều công ty, Buffer đã đón nhận phong trào dịch vụ vi mô (một cách tiếp cận phổ biến trong đó các công ty chia mã của họ thành nhiều dịch vụ nhỏ, độc lập) từ nhiều năm trước. Chúng tôi chia khối nguyên khối của mình thành các dịch vụ riêng biệt, mỗi dịch vụ có dịch vụ riêng. Kho lưu trữ, quy trình triển khai và cơ sở hạ tầng vào thời điểm đó là điều hợp lý: mỗi dịch vụ có thể được triển khai riêng, với ranh giới rõ ràng giữa các nhóm. Nhưng qua nhiều năm, chúng tôi nhận thấy chi phí quản lý hàng chục kho lưu trữ lớn hơn lợi ích đối với quy mô của một nhóm. Vì vậy, chúng tôi đã hợp nhất thành một kho lưu trữ đa dịch vụ duy nhất, nhưng chúng tồn tại ở cùng một nơi. được các kỹ sư làm việc ở một nơi khác chú ý. Không có nơi duy nhất để tìm kiếm tên hàng đợi, không có chế độ xem thống nhất về những gì đang chạy ở đâu. Với mọi thứ trong một kho lưu trữ, cuối cùng chúng tôi có thể xem được bức tranh đầy đủ. Chúng tôi có thể theo dõi mọi hàng đợi đến người tiêu dùng và nhà sản xuất của nó. Chúng tôi có thể phát hiện hàng đợi với các nhà sản xuất nhưng không tìm thấy người tiêu dùng nào đang tham chiếu đến các hàng đợi không còn tồn tại. Việc hợp nhất không được thiết kế để giúp chúng tôi tìm thấy cơ sở hạ tầng zombie — nhưng nó đã làm được điều đó.việc khám phá gần như không thể tránh khỏi. Chúng tôi thực sự đã làm gì Khi xác định được các quy trình đơn lẻ, chúng tôi phải quyết định phải làm gì với chúng. Đây là cách chúng tôi tiếp cận nó. Đầu tiên, chúng tôi truy tìm nguồn gốc của từng cái. Chúng tôi đã tìm hiểu lịch sử git và tài liệu cũ để hiểu lý do tại sao mỗi công nhân được tạo ngay từ đầu. Trong hầu hết các trường hợp, mục đích ban đầu rất rõ ràng: di chuyển dữ liệu một lần, một tính năng đã ngừng hoạt động, một giải pháp tạm thời không còn hữu ích nữa. Sau đó, chúng tôi xác nhận rằng chúng thực sự không được sử dụng. Trước khi xóa bất kỳ nội dung nào, chúng tôi đã thêm tính năng ghi nhật ký để xác minh rằng các quy trình này không âm thầm thực hiện điều gì đó quan trọng mà chúng tôi đã bỏ lỡ. Chúng tôi đã theo dõi trong vài ngày để đảm bảo rằng chúng hoàn toàn không được gọi và chúng tôi đã loại bỏ chúng dần dần. Chúng tôi đã không xóa mọi thứ cùng một lúc. Chúng tôi loại bỏ từng quy trình một, theo dõi mọi tác dụng phụ không mong muốn. (May mắn thay, không có cái nào cả.) Cuối cùng, chúng tôi đã ghi lại những gì mình đã học được. Chúng tôi đã thêm ghi chú vào tài liệu nội bộ của mình về những gì từng quy trình đã thực hiện ban đầu và lý do xóa quy trình đó, để các kỹ sư trong tương lai sẽ không thắc mắc liệu có thiếu thứ gì đó quan trọng hay không. Điều gì đã thay đổi sau khi dọn dẹp Chúng tôi vẫn còn sớm trong việc đo lường toàn bộ tác động, nhưng đây là những gì chúng tôi đã thấy cho đến nay. Kiểm kê cơ sở hạ tầng của chúng tôi hiện đã chính xác. Khi ai đó hỏi, "Chúng tôi điều hành những công nhân nào?" chúng tôi thực sự có thể tự tin trả lời câu hỏi đó. Các cuộc trò chuyện giới thiệu cũng trở nên đơn giản hơn. Các kỹ sư mới không gặp phải các quy trình bí ẩn và tự hỏi liệu họ có thiếu bối cảnh hay không. Cơ sở mã phản ánh những gì chúng tôi thực sự làm, chứ không phải những gì chúng tôi đã làm cách đây 5 năm. Hãy coi các công cụ tái cấu trúc như khảo cổ học và phòng ngừa. Bài học rút ra lớn nhất của tôi từ dự án này: mọi công cụ tái cấu trúc quan trọng đều là một cơ hội cho khảo cổ học. Khi bạn đi sâu vào một hệ thống, thực sự hiểu cách các phần kết nối với nhau, bạn đang ở vị trí hoàn hảo để đặt câu hỏi về những gì vẫn cần thiết. Hàng đợi đó từ một số dự án cũ? Công nhân mà ai đó đã tạo để di chuyển dữ liệu một lần? Tác vụ đã lên lịch tham chiếu đến một tính năng mà bạn chưa từng nghe tới? Chúng có thể vẫn đang chạy. Đây là những gì chúng tôi đang xây dựng trong quy trình sắp tới của mình: Trong bất kỳ quá trình tái cấu trúc nào, hãy hỏi: điều gì khác chạm vào hệ thống này mà chúng tôi đã không xem xét trong một thời gian? Khi ngừng sử dụng một tính năng, hãy theo dõi nó đến tận các quy trình nền của nó chứ không chỉ mã giao diện người dùng. Khi ai đó rời nhóm, hãy ghi lại những gì họ phụ trách, đặc biệt là những thứ chạy trong nền. Chúng tôi vẫn có các phần cũ hơn trong cơ sở mã chưa được di chuyển sang một kho lưu trữ duy nhất. Khi chúng tôi tiếp tục củng cố, chúng tôi tin tưởng rằng chúng tôi sẽ tìm thấy thêm những di tích ẩn giấu này. Nhưng bây giờ chúng tôi đã sẵn sàng để phát hiện chúng và ngăn chặn những mã mới hình thành. Khi tất cả mã của bạn tập trung ở một nơi, cơ sở hạ tầng mồ côi sẽ không còn nơi nào để ẩn náu.

You May Also Like

Enjoyed This Article?

Get weekly tips on growing your audience and monetizing your content — straight to your inbox.

No spam. Join 138,000+ creators. Unsubscribe anytime.

Create Your Free Bio Page

Join 138,000+ creators on Seemless.

Get Started Free