Nền tảng quản lý ảnh mã nguồn mở Immich đã công bố việc thiết kế lại hoàn toàn hệ thống đồng bộ hóa di động, giải quyết các vấn đề hiệu suất tồn tại lâu nay khiến người dùng có thư viện ảnh lớn cảm thấy bực bội. Phiên bản triển khai Sync v2 mới hứa hẹn sẽ giải quyết các vấn đề về bộ nhớ, giảm tiêu hao pin và loại bỏ các lỗi đồng bộ đã làm phiền người dùng trong hệ thống ban đầu.
Kiến trúc streaming thay thế phương pháp tiêu tốn bộ nhớ
Thay đổi quan trọng nhất liên quan đến việc chuyển từ xử lý toàn bộ khối dữ liệu trong bộ nhớ sang phương pháp streaming. Hệ thống mới đọc dữ liệu từ cơ sở dữ liệu PostgreSQL theo từng khối nhỏ, tuần tự hóa chúng từng bước và gửi qua HTTP sử dụng định dạng JSON Lines. Điều này loại bỏ nhu cầu tải một lượng lớn metadata ảnh vào bộ nhớ cùng lúc, vốn trước đây gây ra tình trạng ứng dụng bị đơ hoặc crash trong quá trình đồng bộ.
JSON Lines là một định dạng dữ liệu trong đó mỗi dòng chứa một đối tượng JSON riêng biệt, giúp xử lý thông tin từng phần thay vì tất cả cùng một lúc.
Những cải tiến chính của Sync v2
- Streaming đầu cuối: Dữ liệu được truyền theo từng khối từ cơ sở dữ liệu máy chủ đến cơ sở dữ liệu di động
- Đồng bộ có thể tiếp tục: Gián đoạn mạng không còn yêu cầu phải bắt đầu lại từ đầu
- Cập nhật tăng dần: Chỉ dữ liệu đã thay đổi mới được truyền tải
- Hiệu quả bộ nhớ: Loại bỏ các đối tượng JSON lớn trong bộ nhớ
- Triển khai UUIDv7: Định danh duy nhất dựa trên thời gian để sắp xếp đáng tin cậy
- Định dạng JSON Lines: Mỗi dòng chứa một đối tượng JSON riêng biệt để streaming
Đồng bộ có thể tiếp tục ngăn việc bắt đầu lại từ đầu
Một trong những tính năng được yêu cầu nhiều nhất giải quyết vấn đề khó chịu thường gặp của người dùng khi gián đoạn mạng buộc toàn bộ quá trình đồng bộ phải khởi động lại từ đầu. Hệ thống mới sử dụng các điểm kiểm tra và token xác nhận để theo dõi tiến trình, cho phép người dùng tiếp tục chính xác từ nơi họ đã dừng lại nếu kết nối bị ngắt.
Việc triển khai dựa trên các định danh UUIDv7, kết hợp timestamp với các giá trị duy nhất để tạo ra một hệ thống sắp xếp đáng tin cậy. Điều này đảm bảo rằng ngay cả khi nhiều ảnh được xử lý đồng thời, quá trình đồng bộ vẫn có thể xác định chính xác vị trí để tiếp tục.
UUIDv7 là một loại định danh đặc biệt bao gồm thông tin timestamp trong 48 bit đầu tiên, vừa độc nhất vừa được sắp xếp theo thời gian.
Phản hồi cộng đồng làm nổi bật những thách thức đang tồn tại
Người dùng trong cộng đồng Immich đã bày tỏ sự nhiệt tình với những cải thiện hiệu suất đồng thời nêu bật các vấn đề bổ sung vẫn cần được chú ý. Một số người dùng báo cáo vấn đề với việc xử lý timestamp từ ảnh iCloud và thỉnh thoảng gặp lỗi tải lên yêu cầu khởi động lại ứng dụng.
Tôi chỉ nhận thấy hai vấn đề với ứng dụng di động, và một trong số đó liên quan đến hiệu suất - nó sẽ bị kẹt khi tải ảnh lên máy chủ, và dù chờ đợi bao lâu cũng không thể hoàn thành.
Cuộc thảo luận cũng cho thấy sự hỗ trợ mạnh mẽ của cộng đồng cho dự án, với nhiều người dùng thành công trong việc chuyển từ Google Photos sang các cài đặt Immich tự lưu trữ. Tuy nhiên, một số người dùng lưu ý thiếu các tính năng như đồng bộ hai chiều, nơi việc xóa ảnh khỏi thiết bị cũng sẽ loại bỏ chúng khỏi máy chủ.
Chi tiết triển khai kỹ thuật
Nhóm phát triển đã giải quyết thách thức theo dõi các mục đã xóa bằng cách triển khai các trigger cơ sở dữ liệu để bảo tồn bản ghi xóa tạm thời. Điều này cho phép các thiết bị di động biết về việc xóa trong chu kỳ đồng bộ tiếp theo, đảm bảo tính nhất quán dữ liệu trên các nền tảng.
Việc chuyển từ TypeORM sang Kysely cho các hoạt động cơ sở dữ liệu đã cho thấy cải thiện hiệu suất trong các phần khác của ứng dụng, góp phần vào việc tối ưu hóa hệ thống tổng thể.
Hệ thống đồng bộ mới đại diện cho một bước quan trọng hướng tới bản phát hành ổn định của Immich, giải quyết một trong những rào cản kỹ thuật lớn cuối cùng cho người dùng quản lý bộ sưu tập ảnh lớn vượt quá 100.000 tài sản.
Tham khảo: Sync v2