Giải pháp truy xuất dữ liệu hình ảnh trong database.

Theo cách thông thường khi thiết kế và viết một ứng dụng mobile thì các hình ảnh sẽ được lưu vào file system , database chỉ chịu trách nhiệm lưu thông tin đường dẫn cũng như các thông số khác về hình ảnh đó (width, height, location…). Khi app cần hiển thị dữ liệu thì sẽ request đến server thông qua REST API. Server sẽ trả thông tin url của tấm ảnh. Điều được chú ý nhất là dữ liệu hình ảnh phải được lưu trên database.

Lợi ích khi lưu dữ liệu hình ảnh vào File system

Vấn đề lợi ích khi lưu ảnh vào file system đã được đề cập rất nhiều trên mạng. Nói tóm lại nó có thể có lợi ích lớn đối với ứng dụng có yêu cầu như sau:

  • Ứng dụng có logic nhỏ và đơn giản.
  • Hình ảnh là hình ảnh tĩnh và không thường thay đổi.
  • Không quan tâm đến vấn đề security
  • Chứa các file cực lớn vi dụ như file hình ảnh bản đồ…

Lợi ích khi lưu dữ liệu hình ảnh vào Database

Có lợi ích lớn đối với ứng dụng có yêu cầu như sau:

  • Là ứng dụng rất lớn, chứa nhiều hình ảnh có thể thay đổi thường xuyên. ví dụ một hệ thống HR có dữ liệu hơn 200,000 nhân viên và liên tục thay đổi số lượng nhân viên cũ, mới
  • Hình ảnh nhạy cảm, cần được bảo vệ. ví dụ như hình ảnh chụp X-quang của bệnh nhân …
  • Yêu cầu hình ảnh phải được ràng buộc thống nhất, không trùng lấp và luôn luôn sẵn sàng khi được Request
  • Yêu cầu về các vấn đề bảo trì

Giải pháp request dữ liệu hình ảnh được lưu trong Database trên Server

  1. Cách như bình thường một ứng dụng hay làm là request đến server để lấy thông tin url của hình ảnh rồi hiển thị. Cái khác ở chỗ url của hình ảnh lúc này không phải là đường dẫn đến file hình ảnh được lưu trong file system. Mà là url request  đến server để trả về nội dung của tấm hình đó. Khi gặp các url này server sẽ căn cứ vào tham số id của file mà request database để lấy data hình ảnh sau cùng là trả về cho client / app
    Như vậy ta thấy rằng server sẽ phải đảm nhiệm rất nhiều request. Từ đó làm giảm performance của server. Thử nghiệm cho thấy chỉ cần 1 client request nhiều tấm ảnh cùng lúc cũng đủ làm 100% cpu của server. Giải pháp này không khả thi mặc dù hình ảnh load rất nhanh

  2. Giải pháp tiếp theo là khi app request đến server. Server sẽ trả về json có dữ liệu của hình ảnh dưới dạng base64. Cách này khắc phục được những nhược điểm của giải pháp trên là request đến server quá nhiều. Nhưng cũng chưa là giải pháp tối ưu vì khi chuyển dữ liệu của hình ảnh sang base64, server phái tốn performance để encode. Và dữ liệu dưới dạng base64 có dung lượng lớn hơn binary khoảng 30%. Như vậy về lý thuyết dữ liệu truyền qua mạng sẽ lâu hơn.
  3. Giải pháp cuối cùng là tìm cách gứi data về client dưới dạng binary trong cùng một request. Thông thường mọi người quen với việc client dùng multipart/form-data để gửi nhiều file lên server. Chúng ta sử dụng ngược lại để trả nhiều file hình ảnh từ server về client. Cái khó ở đây là không có thư viện hỗ trợ việc đọc dữ liệu trả về của multipart nên chúng ta phải tự xây dựng tài liệu về việc gửi và đọc thông tin theo format của multipart ở đây . Kết quả rất khả quan, chúng ta tốn khoảng dươi 1.3 giây cho việc đọc dữ liệu của 30 file hình trong multipart và lưu thành file hình ảnh trên điện thoại. Sau đó hiển thị hình ảnh đó ra gần như tức thời.

     

Như vậy tôi đã thử nghiệm qua các giải pháp để truy xuất dữ liệu hình ảnh được lưu trong database. Giải pháp cuối cùng được cho là hiệu quả nhất khi giải quyết được vấn đề nhiều request cũng như tối ưu dung lượng của dữ liệu truyền qua mạng. Các bạn có thể tham khảo biết đâu một ngày nào đó có khách hàng nào yêu cầu.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *