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

Từ Go 1.22, thư viện chuẩn cung cấp hỗ trợ routing tốt hơn

  • Trước đây phải xử lý routing thủ công, nhưng giờ có thể routing đơn giản bằng mux.HandleFunc
  • Có thể tăng cường bảo mật bằng cách thêm middleware đăng nhập

Lưu ý với router tích hợp sẵn: chuyển hướng do dấu gạch chéo ở cuối

  • Nếu tạo đường dẫn /records/, yêu cầu tới /records sẽ bị chuyển hướng sang /records/
  • Vì vậy, phần thân của yêu cầu POST có thể bị loại bỏ và bị đổi thành yêu cầu GET
  • Cách khắc phục là dùng endpoint API như POST /records thay vì POST /records/

Tự động sinh mã truy vấn cơ sở dữ liệu bằng sqlc

  • Tác giả phát hiện ra công cụ sqlc, cho phép viết truy vấn SQL mà không cần học ORM
  • Khi viết truy vấn SQL, công cụ sẽ tự động chuyển thành mã Go
  • Có thể dễ dàng viết các truy vấn SQL cần thiết mà không cần tham khảo tài liệu của ORM

Mẹo tối ưu sqlite

  • Dùng một đối tượng chỉ dành cho ghi vào cơ sở dữ liệu và thiết lập db.SetMaxOpenConns(1)
  • Để tăng tốc độ đọc, hãy dùng các đối tượng DB riêng cho ghi và đọc
  • Hai bảng không cần JOIN có thể được đặt trong các cơ sở dữ liệu riêng để kết nối độc lập

Thiết lập giới hạn bộ nhớ GC trong Go 1.19

  • Khi chạy mọi dự án Go trên các VM có bộ nhớ tương đối thấp như 256MB hoặc 512MB, ứng dụng liên tục bị dừng do OOM
  • Do cấu hình mặc định của garbage collector, hệ thống cho phép cấp phát bộ nhớ tới gấp 2 lần kích thước heap hiện tại
  • Trong Go 1.19, đã bổ sung cách để chỉ thị ứng dụng chạy GC khi đạt tới một mức sử dụng bộ nhớ nhất định
  • Sau khi đặt giới hạn bộ nhớ GC là 250MB, tần suất bị dừng do OOM đã giảm export GOMEMLIMIT=250MiB

Vì sao xây dựng website bằng Go

  • Triển khai rất thuận tiện nhờ một static binary duy nhất
  • Có web server tích hợp sẵn đủ dùng cho production, nên không cần cấu hình WSGI hay tương tự
  • Toolchain của Go dễ cài đặt và sử dụng
  • Việc gửi phản hồi HTTP rất đơn giản nên dự án dễ bảo trì
  • Thư viện chuẩn có net/http, nên có thể làm website mà không cần cài thêm thư viện
  • Cũng có thể dễ dàng thực hiện các tác vụ ở mức hệ thống
  • Mọi thứ dường như đều được thiết kế để giúp dự án dễ quản lý hơn

Những vấn đề vẫn chưa giải quyết được

  • Vẫn còn nhiều thứ tác giả chưa làm nhiều trong Go
    • Render HTML template
    • Triển khai hệ thống đăng nhập thực tế
    • Triển khai CSRF
  • Nói chung, vì chưa rõ cách triển khai các tính năng nhạy cảm về bảo mật, nên tác giả không bắt đầu các dự án cần đăng nhập/CSRF

Thật thú vị khi thấy các tính năng mới của Go

  • Hai tính năng Go được nhắc tới trong bài này (GOMEMLIMIT và routing) đều là những bổ sung mới trong vài năm gần đây
  • Có lẽ nên chú ý hơn tới release note của các phiên bản Go mới

2 bình luận

 
secret3056 2024-09-30

sqlc thực sự rất tuyệt

 
GN⁺ 2024-09-30
Ý kiến trên Hacker News
  • Ngôn ngữ Go cho phép quay lại viết code mà không gặp vấn đề gì ngay cả sau khi làm dự án trong 5 ngày rồi bỏ đó suốt 2 năm
  • Đã bắt đầu học Go từ vài năm trước, nhưng vì nó không thay đổi nhiều nên sau thời gian dài vẫn còn hữu ích
  • Thật tiếc khi bài viết về phát triển web với Go không nhắc đến gói embed
    • Việc đóng gói tài nguyên tĩnh vào một binary duy nhất rất tiện lợi
  • Giao dịch cơ sở dữ liệu được thiết kế để có thể thất bại, vì vậy nên luôn dùng vòng lặp retry
    • Nên thêm Context vào vòng lặp transaction để có thể hủy
  • sqlc có một số hạn chế lớn và vài bất tiện nhỏ, nên kiểm tra danh sách issue trước khi dùng
    • Không hỗ trợ query động, quan hệ một-nhiều, CTE nhúng, kiểu tổng hợp, v.v.
    • Phù hợp với nhu cầu đơn giản, nhưng với tác vụ phức tạp thì nên dùng cách làm thủ công
  • Khi chạy Go trong container, cần thiết lập GOMAXPROCS phù hợp để tránh CPU throttling
  • Dùng GOMEMLIMIT có thể giúp bớt phải lo về GC
    • Có thể tự động thiết lập khi dùng Kubernetes hoặc Docker
  • html/template khá kỳ quặc và có nhiều vấn đề, nên tốt hơn là đừng dùng
    • Thay vào đó, ưu tiên Templ
  • Rất vui khi thấy có đề cập đến routing
    • Đã quen với mux từ lâu, nhưng chưa để ý đến các tính năng trong bản phát hành mới
  • Đã dùng Go được một tháng ở công việc mới nhưng lại ghét nó
    • Có cảm giác Go chẳng học được gì từ 20 năm phát triển ngôn ngữ vừa qua
    • Vấn đề với nil khiến cả những việc đơn giản cũng trở nên phức tạp
  • Khi dùng SQLite, nên sử dụng một pool writer đơn luồng và một pool khác cho reader
    • Có thể cải thiện khả năng đồng thời bằng BEGIN CONCURRENT
  • Yêu thích sự đơn giản của Go và việc nó không phụ thuộc framework
    • Chỉ với thư viện chuẩn và các thư viện bên thứ ba đã được kiểm chứng cũng có thể tạo ra thứ gì đó tuyệt vời
    • Go phù hợp để làm web app hoặc công cụ CLI
    • Thích cách xử lý lỗi tường minh
    • Là một fan lớn của Go