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

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

Những mẩu tin ngắn hàng ngày dành cho bạn
  • Jan là một phần mềm mã nguồn mở có khả năng thay thế ChatGPT. Bằng cách tải về nhiều mô hình ngôn ngữ lớn, Jan có khả năng hoạt động ngoại tuyến, dữ liệu hoàn toàn ở trong máy và không lo về quyền riêng tư nữa.

    Điểm ăn tiền của Jan so với các ứng dụng tương tự khác là giao diện gọn gàng, dễ sử dụng, dễ dàng tìm kiếm và tải về models mà bạn mong muốn. Ngoài ra, Jan cũng có khả năng kết nối API với các nhà cung cấp như OpenAI, Anthropic... để hoạt động trực tuyến.

    » Xem thêm
  • Dành cho những ai chưa biết, snapdrop là một ứng dụng mã nguồn mở, giúp chia sẻ dữ liệu cho nhau nếu đang ở trong cùng một mạng Wifi, hoạt động dựa trên WebRTC. Ủa lạ hen, sao không dùng luôn AirDrop hoặc Nearby Share đi mà dùng cái này chi cho mắc mệt? Đấy là trong trường hợp cả 2 dùng chung hệ điều hành thôi, còn khác hệ điều hành thì chịu, ví dụ như giữa Android với iOS, MacOS với Linux hoặc Windows... Lúc này thì snapdrop tỏ ra cực kỳ hữu ích đấy 😁

    » Xem thêm
  • 24 sự thật thú vị về SQLite Collection of insane and fun facts about SQLite. Phải nói rằng nó khủng thật 🔥

    » Xem thêm

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!

Cao cấp
Hello

Tôi & khao khát "chơi chữ"

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.

Bình luận (2)

Nội dung bình luận...
Avatar
Trịnh Cường8 tháng trước
very sure bro :))
Trả lời
Avatar
Trịnh Cường8 tháng trước
cố lên bạn, mình tin là bạn sẽ làm đc ;)
Trả lời
Avatar
Xuân Hoài Tống8 tháng trước
Cảm ơn bạn Cường đã động viên tinh thần. Nhớ dùng sp của mình sắp tới nhé
Bấm hoặc cuộn mạnh để sang bài mới