Nhật ký làm Notas - Kỳ II

  • 0

  • 0

  • 0

Nhật ký làm Notas - Kỳ II

Nhật ký làm Notas - Kỳ II

Vấn đề

Hôm nay Hà Nội trở gió, trời mát và có mưa phùn nhẹ, tôi đã tái chạy lại sau gần 3 tuần nghỉ ngơi cũng như tập trung làm Notas. Chỉ mới sáng nay, ý tưởng viết bài cho kỳ tiếp theo vẫn chưa có trong dự kiến bởi vì có quá nhiều vấn đề lớn mà tôi chưa xử lý được. Nhưng thật may, vừa mới đây thôi, trong lúc gột rửa tâm hồn trong những hạt nước phun ra từ đài sen, thì tôi đã tìm ra mảnh ghép cho phiền muộn dai dẵng bấy lâu nay.

Như thường lệ, tuần này tôi sẽ tổng hợp lại vấn đề, khó khăn đang gặp phải, làm được gì và cả kế hoạch cho tuần tới.

Khó khăn

Có nhiều khó khăn cực lớn đang phải đối mặt.

Trong bài viết trước, tôi có bật mí với bạn đọc về cấu trúc của Adapter đóng vai trò như cơ sở dữ liệu. Ban đầu, tôi đã triển khai được Adapter có tên LocalStorage để lấy dữ liệu từ Local Storage trong trình duyệt, từ đó nếu viết thêm một Adapter mới, lấy dữ liệu từ máy chủ nào đó, đồng thời xử lý luôn vấn đề đồng bộ thì… người dùng cần phải kết nối mạng mới sử dụng được Adapter đó.

Điều đó có nghĩa một ứng dụng ghi chú nhưng lại cần phải trực tuyến mới có thể sử dụng. Hmm… nghe có vẻ vô lý, đâu phải ai lúc nào cũng có mạng Internet. Nếu đi ra ngoài, họ ngoại tuyến, cần việc phải ghi chú thì cái ứng dụng coi như bỏ đi vì không sử dụng được hay sao?

Vì vậy buộc phải tìm một giải pháp khác, cho phép người dùng trực tuyến lẫn ngoại tuyến phải dùng được.

Như kiến trúc 3 lớp trước kia: UI, Logic và Adapter thì có vẻ vẫn chưa đủ để làm cho ứng dụng hoạt động khi ngoại tuyến. Muốn ứng dụng vẫn hoạt động được khi ngoại tuyến, chúng ta cần nghĩ ra cách lưu được dữ liệu của người dùng khi họ không có kết nối Internet.

Như vậy, cần phải thêm một lớp lưu trữ - mà tôi gọi là Storage nằm giữa Logic và Adapter. Storage đóng vai trò lưu trữ dữ liệu cục bộ, tức là dữ liệu mà người dùng tương tác ngay cả khi ngoại tuyến. Lúc này, Logic sẽ tương tác trực tiếp với Storage - đóng vai trò như một cơ sở dữ liệu cục bộ, đồng thời cần thêm cơ chế đồng bộ dữ liệu từ Adapter xuống Storage.

Nghe thì có vẻ đơn giản nhưng khi bắt tay vào làm thì mọi chuyện không hề dễ.

Đầu tiên là tôi phải sửa lại khá nhiều mã, tạo thêm một lớp Storage lưu trữ dữ liệu trong Local Storage để làm cơ sở dữ liệu ngoại tuyến cho người dùng.

Thứ hai là cơ chế đồng bộ giữa Storage và Adapter. Việc giữ cho hai cơ sở dữ liệu được thống nhất không được thuận lợi cho lắm, đặc biệt khi thêm một máy khách thứ 2 cũng tham gia vào máy chủ đồng bộ. Như vậy, khi một máy nào đó chỉnh sửa dữ liệu trong cùng một máy chủ đồng bộ, thì ngay lập tức dữ liệu cũng phải được đồng bộ đến các máy còn lại. Chưa kể khi các máy cùng tham gia chỉnh sửa trên một ghi chú thì sẽ rất phức tạp.

Thứ ba đó là dù cho một máy khách đã bật đồng bộ dữ liệu, nhưng vì một lý do nào đó mà máy này không được kết nối mạng, nhưng vẫn thực hiện các thao tác thêm/sửa/xóa ngoại tuyến thì khi có mạng, vẫn phải đảm bảo dữ liệu được đồng bộ hóa lên máy chủ theo một quy tắc nhất định.

Thật đau đầu, lúc mới bắt tay vào làm quả thực tôi chưa hề nghĩ vấn đề này lại phức tạp đến như vậy. Thú thật trong 1 tuần qua, mỗi buổi sáng thức giấc, điều tôi nghĩ đến đầu tiên là làm sao để giải quyết vấn đề đồng bộ này.

Rốt cục, tôi đã sửa đi sửa lại mã của mình rất nhiều lần để tìm ra được một quy tắc chung cho việc đồng bộ, và có lẽ ánh sáng đang rọi qua những chiếc lá ngày một rõ nét.

Giải pháp

Hãy nghĩ về git cùng với cơ chế pull/push dữ liệu của nó. Một máy chủ lưu trữ repository từ xa (remote), một repository được "clone" về lưu trữ cục bộ trên máy tính. Nhiệm vụ của git là cung cấp cơ chế để đồng bộ hóa giữa remote và local, nghĩa là phải làm sao đó đảm bảo dữ liệu trong local luôn giống với remote nhất.

Nếu áp dụng theo cách đó, Adapter sẽ giống như là remote còn Storage sẽ giống như là local. Notas sẽ yêu cầu Adapter triển khai các hàm pull/push tương ứng với hành vi lấy và đẩy dữ liệu mới lên máy chủ đồng bộ.

Cái khó còn lại là xác định được khi nào cần pull và push dữ liệu.

Kết quả đạt được và mục tiêu cho tuần tới

Viết ghi chú trên Notas

Có thể bạn không tin nhưng bài viết tổng kết kết quả kỳ II này đang được viết trong chính ứng dụng Notas.

Có thể nói Notas đã có thể hoạt động với tính năng đồng bộ ở mức độ Alpha. Khi sử dụng nó viết cũng là cách để kiểm tra nó hoạt động có chính xác hay không. Dĩ nhiên là các lỗi vẫn xuất hiện trong khi viết, nhiều lỗi liên quan đến hành vi pull/push dữ liệu không đồng bộ, gây ra tình trạng mất dữ liệu tại một số thời điểm. Hy vọng những lỗi này sẽ được "fix" trong tuần tiếp theo.

Cuối cùng cảm ơn bạn đọc đã theo dõi, nếu bạn có thắc mắc vấn đề gì hoặc còn điều gì chưa được làm sáng tỏ thì hãy để lại bình luận xuống phía dưới bài viết nhé. Rất sẵn lòng để giải đáp!

Bạn thấy bài viết này có ích?
  • Không

  • Bình thường

Bình luận
DMCA.com Protection Status