Thử nghiệm các giải pháp truy xuất dữ liệu hình ảnh được lưu trên database.

Thử nghiệm các giải pháp truy xuất dữ liệu hình ảnh được lưu trên database.

Phân tích thiết kế ứng dụng điện thoại ứng dụng mobile

Project thử nghiệm

Tuyển dụng nhân viên lập trình
Tuyển dụng

Chúng tôi đang tìm cộng tác viên Tuyển lập trình viên Có thể làm việc tại nhà. Liên hệ

Thiết kế thử nghiệm một ứng dụng điện thoại di động chạy trên iOS và Android với các yêu cầu sau:

  • Ứng dụng phải có giao diện (UI/UX) hiện đại và phải thật mượt. tạo cảm giác thích thú khi sử dụng.
  • Ứng dụng phải xử lý mượt việc load nhiều hình ảnh nhanh và thông minh.
  • Tất cả các dữ liệu hình ảnh phải được lưu vào database dưới dạng blob

Dựa theo yêu cầu trên thì vấn đề cần được chú ý nhất là dữ liệu hình ảnh phải được lưu trên 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.

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 (Có thể đọc tham khảo ở đây). 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:  (Có thể đọc tham khảo ở đây)

  • 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ốngHR 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 xquang 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 đó. (vi dụ: thay vì url bình thường https://xxx.yyy.zzz/abc.jpg chúng ta sẽ có url request như sau https://xxx.yyy.zzz/photos/filename=abc). 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.

Bạn yêu cầu thêm thông tin...