Mỗi máy chủ chạy ứng dụng sử dụng AppSignal sẽ gửi một bộ sưu tập các mẫu và chỉ số đến API Đẩy của chúng tôi sau mỗi 30 giây.
Mỗi yêu cầu có một khóa mà chúng tôi sử dụng để xác định dữ liệu đến từ ứng dụng nào. Để làm điều đó, chúng tôi cần truy vấn cơ sở dữ liệu của mình để tìm ứng dụng cho mỗi yêu cầu đến. Với ba mươi tỷ yêu cầu mỗi tháng, chúng tôi không ngừng cố gắng tìm cách giảm số lượng truy vấn để làm cho AppSignal nhanh hơn.
Chúng tôi đã triển khai bộ nhớ đệm để giảm số lượng truy vấn trên các cụm cơ sở dữ liệu của chúng tôi. Bất cứ khi nào chúng tôi tìm nạp một ứng dụng từ cơ sở dữ liệu, chúng tôi sẽ lưu trữ nó trong Memcached trong một phút. Sau khi triển khai thay đổi này cho phiên bản sản xuất, chúng tôi nhận thấy rằng chúng tôi đang thực hiện hơn thế nữa truy vấn hơn trước. Có vẻ như bộ nhớ cache đã bị vô hiệu hóa quá thường xuyên. Để tìm hiểu xem điều đó đã xảy ra ở đâu, chúng tôi đã thêm một số chỉ số tùy chỉnh để tìm ra vị trí bộ nhớ đệm bị vô hiệu hóa không đúng cách.
Có một số vị trí mà chúng tôi làm mất hiệu lực bộ nhớ cache, chẳng hạn như khi cập nhật thời gian xử lý đẩy hoặc khi chúng tôi phát hiện một vùng tên mới.
# Update last push processed at time
if app.last_push_processed_at < 5.minutes.ago
app.set(:last_push_processed_at => Time.now)
Rails.cache.delete(cache_key)
end
if namespaces_diff.any?
app.add_to_set(:namespaces => namespaces_diff)
Rails.cache.delete(cache_key)
end
Chúng tôi đã thêm nhiều bộ đếm để xác định xem bộ nhớ cache nào trong số này là thủ phạm gây ra lỗi. Trong ví dụ này, chúng tôi tăng app.cache.invalidate
bộ đếm để đếm tổng số lần xác thực và sử dụng các khóa cụ thể như app.cache.invalidate_push_time
và app.cache.invalidate_namespaces
đối với các trường hợp không hợp lệ cụ thể.
# Update last push processed at at time
if app.last_push_processed_at < 5.minutes.ago
app.set(:last_push_processed_at => Time.now)
Rails.cache.delete(cache_key)
Appsignal.increment_counter('app.cache.invalidate', 1)
Appsignal.increment_counter('app.cache.invalidate_push_time', 1)
end
if namespaces_diff.any?
app.add_to_set(:namespaces => namespaces_diff)
Rails.cache.delete(cache_key)
Appsignal.increment_counter('app.cache.invalidate', 1)
Appsignal.increment_counter('app.cache.invalidate_namespaces', 1)
end
Thêm các chỉ số tùy chỉnh ở trên, chúng tôi có thể vẽ biểu đồ số lần truy cập vào bộ nhớ cache của mình theo thời gian. Ngay lập tức có thể thấy rõ khóa nào trong số các khóa bộ nhớ cache đã gây ra sự gia tăng các truy vấn. app.cache.invalidate_namespaces
khóa đã bị vô hiệu cho mỗi yêu cầu.
Tổng số yêu cầu có thể lưu vào bộ nhớ cache được tính là app.cache.maybe
.
Sau khi triển khai bản sửa lỗi cho vấn đề này, số lần không hợp lệ giảm xuống 0 miễn là không gian tên cho ứng dụng chưa được cập nhật.
Việc thêm các chỉ số tùy chỉnh giúp bạn dễ dàng hiểu những gì đang xảy ra ở đâu, khi nào và tần suất ra sao. Trong trường hợp này, việc biết số lượng bộ nhớ cache không hợp lệ và hiển thị chúng trong một biểu đồ có thể đọc được cho phép chúng tôi nhanh chóng tìm ra sự cố. Nó chỉ cần một vài dòng mã để tăng một giá trị nhất định và tạo trang tổng quan.
Hãy cho chúng tôi biết nếu bạn có bất kỳ câu hỏi nào về các chỉ số tùy chỉnh và nếu chúng tôi có thể giúp bạn thiết lập chúng trong ứng dụng của mình. Chúng tôi rất sẵn lòng trợ giúp!