1 điểm bởi GN⁺ 2024-09-26 | 1 bình luận | Chia sẻ qua WhatsApp

Bối cảnh

  • Wafris là một công ty tường lửa ứng dụng web mã nguồn mở, cung cấp client middleware cho Rails
  • Client v1 ban đầu yêu cầu kho dữ liệu Redis cục bộ, nhưng nay đã phát hành client v2 sử dụng SQLite
  • Bài viết này bàn về quá trình ra quyết định di chuyển từ Redis sang SQLite, các cân nhắc về hiệu năng và những thay đổi trong kiến trúc

Tóm tắt

  • SQLite, Redis và RDBMS truyền thống (Postgres/MySQL) đều có ưu và nhược điểm riêng
  • Các kho dữ liệu này không thể thay thế lẫn nhau hoàn toàn, và cố làm vậy có thể gây ra vấn đề
  • Bài viết giải thích quá trình tái cấu trúc client v1 dựa trên Redis thành client v2 dựa trên SQLite

Điều gì buộc phải thay đổi này?

  • Mục tiêu của Wafris là giúp nhà phát triển có thể bảo vệ trang web một cách dễ dàng
  • Client v1 sử dụng kho dữ liệu Redis, nhưng nhiều người dùng gặp khó khăn với việc triển khai Redis
  • Công ty đã chuyển sang SQLite để giảm gánh nặng phải trở thành quản trị viên Redis

Tốc độ là gì?

  • Redis nhanh hơn RDBMS truyền thống, nhưng vẫn còn nhiều yếu tố phải quản lý
  • Trong môi trường đám mây, độ trễ mạng là một vấn đề lớn
  • SQLite có thể mang lại hiệu năng nhanh hơn nhờ giảm thời gian khứ hồi qua mạng

Giả định nguyên khối

  • Nhiều ứng dụng phân tán gây ra vấn đề khi sử dụng Redis
  • Kiến trúc đã được xem xét lại để giảm độ phức tạp khi dùng Redis

Áp dụng SQLite

  • SQLite giúp giảm nút thắt cổ chai về network IO
  • SQLite cạnh tranh với việc mở tệp (fopen()), chứ không cạnh tranh với cơ sở dữ liệu client/server

Benchmark SQLite và Redis

  • SQLite nhanh hơn Redis khoảng 3 lần trong một số trường hợp sử dụng nhất định
  • Ngay cả khi chưa tính đến độ trễ mạng, SQLite vẫn nhanh hơn

Những gì còn thiếu trên biểu đồ

  • Dù hiệu năng SQLite có kém hơn trong benchmark, trong môi trường thực tế nó vẫn có thể nhanh hơn do độ trễ mạng
  • SQLite dễ mở rộng theo chiều ngang và giảm gánh nặng cài đặt, cấu hình cho người dùng

Xây dựng kiến trúc đồng bộ hóa

  • Trong v1 (Redis), khi người dùng cập nhật rule, dữ liệu sẽ được cập nhật vào kho dữ liệu Redis
  • Trong v2 (SQLite), client định kỳ kiểm tra các rule đã cập nhật và tải xuống cơ sở dữ liệu SQLite mới

Kiến trúc phân tán với SQLite

  • Đồng bộ DB SQLite đến từng instance tính toán để giải quyết vấn đề nút thắt cổ chai của cơ sở dữ liệu

Kết luận

  • Kiến trúc v2 dựa trên SQLite giúp nhiều trang web chống chịu được tấn công và duy trì trạng thái trực tuyến
  • Nó giảm gánh nặng cho người dùng, đồng thời mang lại một Internet an toàn và được bảo mật tốt hơn

Tóm tắt của GN⁺

  • Bài viết này giải thích quá trình di chuyển từ Redis sang SQLite và lý do đằng sau quyết định đó
  • SQLite cải thiện hiệu năng bằng cách giảm độ trễ mạng, đồng thời giảm gánh nặng cài đặt và cấu hình cho người dùng
  • Kiến trúc phân tán của SQLite giải quyết vấn đề nút thắt cổ chai của cơ sở dữ liệu
  • Bài viết mang lại góc nhìn về cách triển khai tường lửa ứng dụng web sao cho dễ dàng và hoạt động nhanh chóng

1 bình luận

 
GN⁺ 2024-09-26
Ý kiến trên Hacker News
  • Có hứng thú với mô hình trong đó mỗi máy chủ ứng dụng sao chép tệp cơ sở dữ liệu SQLite và thay thế định kỳ

    • Được dùng cho các quy tắc tường lửa ứng dụng web
    • Cũng có thể dùng cho cấu hình feature flag
    • Không sao nếu feature flag mất vài giây để cập nhật
  • Độ trễ đọc/ghi của Redis tỷ lệ với số lượng khóa được truy vấn

    • Ứng dụng monolith dùng Postgres và Redis đã hoạt động tốt
    • Redis là đơn luồng, nên các tác vụ đọc khối lượng lớn có thể làm chậm các tác vụ khác
    • Redis phù hợp khi đọc và ghi một khóa hoặc một tập nhỏ các khóa cố định
    • Thật thú vị khi SQLite có hiệu năng tốt hơn so với một instance Redis cục bộ
  • Bộ dữ liệu trông có vẻ gồm 1,2 triệu mục, nhưng thực ra không lớn

    • Địa chỉ IPv4 là 4.8MB, và có thể còn nhỏ hơn với nén đơn giản
    • Nếu Ruby hỗ trợ mmap thì dùng trực tiếp danh sách IP sẽ tốt hơn
  • Trong một hackathon nội bộ của Neon, họ đã viết một máy chủ Node.js chuyển đổi giao thức của Redis thành truy vấn Postgres

    • Đó là một dự án hack khá thú vị
  • Tại RailsWorld 2023 có bầu không khí tiêu cực về Redis

    • Có giả định rằng cần có máy chủ Redis
    • Vì ít kinh nghiệm dùng Redis, họ tò mò không biết hệ sinh thái hiện tại có đang phản đối Redis hay không
  • SQLite có vẻ là một trường hợp sử dụng ngách mà nó hoạt động tốt ở phía máy chủ mà không cần sao chép

    • Một lựa chọn khác có thể là dùng tệp tĩnh được nạp vào bộ nhớ
    • SQLite là một lựa chọn thay thế tốt
  • Có một dự án tên là Redka, triển khai Redis bằng SQLite

  • Câu trích dẫn hay nhất: "SQLite không cạnh tranh với cơ sở dữ liệu client/server. SQLite cạnh tranh với fopen()."

  • Redis nhanh hơn RDBMS truyền thống, nhưng cần được vận hành

    • Mọi cơ sở dữ liệu đều cần một mức độ vận hành nhất định
    • Nếu không phải lo về join thì việc chèn và truy xuất hàng cũng rất nhanh
  • Benchmarking là một nghệ thuật đen tối của việc tự đánh lừa bản thân bằng những con số cực kỳ chính xác