DHH vừa đặt ra thuật ngữ "Citadel", điều này cuối cùng cung cấp cho chúng tôi một cách tuyệt vời để tham khảo cách chúng tôi tiếp cận công nghệ tại AppSignal. Chúng tôi nói, "Này, đây là chúng tôi! Thứ của chúng tôi đã có tên".
Ngoài Majestic Monolith, ai đó nên viết lên mô hình của The Citadel:Một Majestic duy nhất Monolith nắm bắt phần lớn khối lượng ứng dụng, với một số ứng dụng phụ trợ cho các nhu cầu chuyên biệt và khác nhau.
- DHH (@dhh) 07/04/2020
Để giải thích cách AppSignal sử dụng mẫu Citadel, chúng tôi sẽ chia sẻ một chút về cách hệ thống của chúng tôi hoạt động. AppSignal là sản phẩm giám sát có ứng dụng hướng tới người dùng và API mà tác nhân giám sát gửi dữ liệu đến. Dữ liệu này sau đó được xử lý và chuyển thành biểu đồ và thông tin chi tiết.
Đá nguyên khối
Ứng dụng mà khách hàng của chúng tôi tương tác là một ứng dụng Rails nguyên khối, với các phần của giao diện người dùng được viết bằng React. Phần phụ trợ hoàn toàn được viết bằng Ruby và nói chuyện với một số cơ sở dữ liệu (chúng tôi tách dữ liệu từ các khách hàng khác nhau thành các cụm riêng biệt vì lý do mở rộng quy mô). Ứng dụng Rails này cũng xử lý một loạt các tác vụ khác như gửi cảnh báo đến các dịch vụ bên ngoài.
Khi chúng tôi bắt đầu ứng dụng Rails này cũng xử lý dữ liệu đến từ tác nhân giám sát của chúng tôi, chúng tôi đã thấy trước rằng việc nhập dữ liệu sẽ trở thành một nút thắt cổ chai. Vì vậy, chúng tôi đã sử dụng một ứng dụng Sinatra chạy trên một miền phụ đã nhập dữ liệu và tạo các công việc Sidekiq do ứng dụng Rails xử lý.
Tăng lợi nhuận
Kiến trúc này hoạt động tốt trong nhiều năm. Khi hoạt động kinh doanh của chúng tôi phát triển, rõ ràng rằng nhiệm vụ cụ thể là xử lý dữ liệu đến từ các đại lý sẽ cần được xử lý đặc biệt. Khi bạn đang theo dõi hàng tỷ tỷ yêu cầu, bạn sẽ gặp phải những giới hạn khó. Yếu tố hạn chế chính không phải là quá nhiều khiến Ruby bị chậm (chúng ta đều biết rằng không phải vậy 😉), mà là cách chúng ta tạo ra những thứ đã tạo ra quá nhiều khóa trong cơ sở dữ liệu của chúng ta.
Một tiền đồn
Chúng tôi đã xem xét một số khả năng và sau đó quyết định Kafka là người phù hợp nhất với tình huống của chúng tôi. Chúng tôi đã có một số kinh nghiệm với Rust và nghĩ rằng tốc độ và độ tin cậy của nó sẽ rất phù hợp với hệ thống này. Chúng tôi đã viết lại hệ thống xử lý và nhập dữ liệu của mình trong Rust, sử dụng Kafka làm sự kết hợp giữa hàng đợi và hệ thống lưu trữ.
Chúng tôi chỉ chuyển phần xử lý dữ liệu đến của ứng dụng Rails sang dịch vụ tiền đồn này. Phần còn lại của các hệ thống hoạt động tốt dưới dạng một ứng dụng nguyên khối. Chúng tôi hiểu điều đó một cách sâu sắc và chúng tôi thích giữ mọi thứ đơn giản. The monolith vẫn xử lý hầu hết các logic và tương tác với Kafka rất nhiều. Mong muốn giữ nguyên khối của chúng tôi đã dẫn đến việc chúng tôi viết ra một viên ngọc Kafka để ứng dụng chính có thể giao tiếp với tiền đồn một cách dễ dàng.
Nếu bạn muốn tìm hiểu thêm về cách Kafka hoạt động tại AppSignal, hãy xem bài nói chuyện Railsconf mà tôi đã đưa ra về điều này.
Cuộc sống tại Hoàng thành
Điều này đưa chúng tôi đến tình hình hiện tại, nơi chúng tôi đang rất hạnh phúc trong tòa thành của chúng tôi. Như DHH đã nói:
Một Majestic Monolith duy nhất chiếm được phần lớn ứng dụng với một vài ứng dụng phụ trợ cho các nhu cầu chuyên biệt và khác nhau.
Trong trường hợp của chúng tôi, chúng tôi có một dịch vụ tiền đồn duy nhất cho các nhu cầu chuyên môn cao của chúng tôi. Nếu có RailsConf năm nay, chúng tôi sẽ tặng thêm cho DHH một số stroopwafels để đánh giá cao việc đặt tên cho nó. 🍪