Blog lập trình viên: Những gì diễn ra bên trong gamer.ru
Một chút lịch sử
Trang web gamer.ru đã trải qua đến lần viết lại mã thứ ba (hoặc có thể thậm chí lần thứ tư). Dự án ban đầu được viết trên Ruby-on-Rails từ những năm 2000 xa xôi. Kiến trúc là monolithic, vì vậy mỗi yêu cầu của người dùng 'kéo theo' một số lượng lớn yêu cầu bổ sung tới cơ sở dữ liệu và tải tất cả các thư viện có thể có. Để đảm bảo hoạt động của tài nguyên với 100.000 lượt truy cập mỗi ngày, chúng tôi phải sử dụng đến năm máy chủ mạnh mẽ, sử dụng memcache, Redis và nhân bản cơ sở dữ liệu trên nhiều máy chủ. Điều này đã giúp trang web chống đỡ đến năm 2018, cho đến khi công ty gặp vấn đề tài chính và đội ngũ phát triển phải tan rã.
Khoảng năm 2020, trang web đã bị mất chứng chỉ SSL. Việc cập nhật nó trở nên không thể, vì phiên bản Ruby-on-Rails cũ phụ thuộc vào phiên bản openssl cũ, trong khi các chứng chỉ mới yêu cầu phiên bản mới hơn. Không ai thực sự lo lắng — trang web vẫn hoạt động một cách tạm chấp nhận. Trong khoảng thời gian từ 2015 đến 2025, lưu lượng truy cập đã giảm dần từ 100.000 xuống còn 1.000 người mỗi ngày. Trong các blog và bình luận ẩn hiện một lượng lớn spam, kể cả những nội dung không đứng đắn. Yandex hoàn toàn mất hứng thú với chúng tôi, trong khi trên webmaster chỉ toàn là một bức tranh đỏ rực của các lỗi nghiêm trọng.
Những gì chúng tôi đã làm để khắc phục
Trang web cần được tối ưu hóa nghiêm túc, vì kiến trúc cũ không còn phù hợp với thực tế. Trong cơ sở dữ liệu đã tích lũy khoảng 100.000 bài viết và 1,6 triệu bình luận cần được chuyển giao một cách cẩn thận sang động cơ mới. Chúng tôi quyết định chuyển sang kiến trúc microservices cả ở backend và frontend, đồng thời sử dụng các công nghệ hiện đại, bao gồm cả HTMLElement 'mốt'.
Dự án đã được viết lại hoàn toàn từ đầu trên NodeJS mà không sử dụng thư viện bên thứ ba, điều này đảm bảo cho chúng tôi có một cuộc sống bình yên trong khoảng 10-20 năm tới. Bây giờ không sợ rằng việc cập nhật một thư viện 'mốt' như ExpressJS hoặc React sẽ làm hỏng toàn bộ trang web và yêu cầu phải tiến hành một cuộc tái cấu trúc quy mô lớn khác. Thậm chí, chính chúng tôi đã phải viết một trình biên soạn bài viết, vì không có sản phẩm nào có sẵn đáp ứng được các yêu cầu khiêm tốn của chúng tôi. Giờ đây, động cơ có thể render các trang HTML cho các thiết bị cũ và các công cụ tìm kiếm, trong khi cung cấp nội dung cho người dùng thông qua AJAX.
Hiện tại, trang web có thể duy trì hoạt động dưới tải trung bình khoảng 150 yêu cầu mỗi giây, trong đó phần lớn lưu lượng là từ các bot tìm kiếm và các crawler khác. Đặc biệt, bots như semrush và openai hoạt động rất tích cực, giống như chúng đang cố gắng tải về toàn bộ trang web trong một ngày. Nếu Yandex lập chỉ mục chúng tôi một cách chậm chạp, với tốc độ 1-2 yêu cầu mỗi giây, thì những người bạn này hoàn toàn có thể gửi đến 50 yêu cầu.
Tuy nhiên, động cơ được tối ưu hóa đến mức một máy chủ ảo không đắt giá khoảng 500 rúp mỗi tháng có thể xử lý hết lượng bot này một cách dễ dàng.
Tất nhiên, đôi khi trang web nhắc nhở chúng tôi về sự hiện hữu của nó bằng các lỗi 502 và 504, những lỗi này được phát hiện và xử lý dần dần. Đôi khi phát hiện ra rằng ai đó đã quên thêm chỉ mục vào cơ sở dữ liệu, đôi khi một truy vấn quá phức tạp phải được chia thành nhiều truy vấn đơn giản, và đôi khi đơn giản là chỗ trống trên máy chủ đã hết. Nhưng chúng tôi không bỏ cuộc — công việc vẫn tiếp tục, và như người ta nói, 'mọi thứ vẫn nằm trong tầm kiểm soát.'