[Part 1] Chức năng reminders

Đăng bởi Lưu Đại vào ngày 01-02-2023

1. Vấn đề. 

  • Mình cần một hệ thống thông báo để nhắc nhở mình viết bài hằng ngày
  • Tuy nhiên sau khi suy nghĩ lại thì mình thấy nên làm một hệ thống thông báo động hơn tức là mình có thể thêm xóa các thông báo nhận hàng ngày dùng giao diện để cài thông báo chạy vào ngày nào, giờ nào và sau này có thể sửa được thông báo đó. 

2. Ý tưởng. 

  • Mình không rõ đã có thư viện nào hỗ trợ sẵn cho tính năng này chưa nhưng thấy có thể làm bằng cronjob và backgroundjob nên mình làm luôn mà không tìm thư viện nữa. 
  • Đầu tiên là mình sẽ cần một bảng để quản lý các bản ghi thông báo, mình gọi là reminders. Bảng này sẽ gồm các thuộc tính title (dùng để làm chủ để cho trường hợp mình muốn thông báo bằng email hoặc notification), content, days (một list các ngày để chạy noti như là thứ 2, 3 hàng tuần thì days sẽ lưu mảng Mon, Tue), hour, minute là thời gian job sẽ được chạy. Thêm bảng nữa là bảng trung gian liên kết với users.
  • Tiếp theo mình cần một cronjob để cứ mỗi 00:00 hàng ngày duyệt qua bảng reminders tìm kiếm những bản ghi thỏa mãn ngày trong trường days có gồm ngày hiện tại. Mỗi bản ghi thỏa mãn thì sẽ tạo ra một backgroundjob đặt trước thời gian perform job này theo các trường hour + minutes trong bảng reminder. 
  • Cuối cùng là một job để gửi noti về cho người dùng (là mình 😁).

3. Các thư viện sử dụng: 

  • Đầu tiên về framework mình vẫn sử dụng Ruby on Rails 
  • Thư viện chính trong phần này là whenever (để xử lý cron) và sidekiq (background job)
  • Ngoài ra còn redis để sidekiq có thể queue job vào nữa. 
Phần thực hiện sẽ viết trong part 2, và part 3 sẽ liệt kê những thứ mình học được trong quá trình làm chức năng này