Yêu cầu thg 12 10, 2022 3:23 CH 98 0 2
  • 98 0 2
+4

[Rails] Tạo và quản lý jobs với dynamic thời gian chạy job và Timezone

Chia sẻ
  • 98 0 2

Xin chào mọi người, mình đang có một bài toán về việc tạo job trong ruby on rails như sau, xin ý kiến thảo luận giải pháp hay từ mọi người. Ứng dụng cho phép người dùng đặt lịch (schedule) để chạy một chiến dịch quảng cáo theo ngày. Người dùng có thể lựa chọn timezone tạo job, giờ bắt đầu chạy job, giờ kết thúc job trong một ngày và lựa chọn chạy lặp thời gian/lần.

Ví dụ: Tạo một job chạy vào các ngày thứ 3, 4, 6. Giờ bắt đầu chạy job: 9:00 AM #{Timezone}, kết thúc job: 14:00 #{Timezone}, trong khoảng thời gian chạy sẽ lặp 15ph/lần và lịch sẽ chạy vào tuần thứ 2 mỗi tháng.

Mình định sẽ tạo một bảng db gọi là schedule, lưu thông tin job cần chạy. Sau đó sẽ dùng một cái job tổng to chạy hằng ngày (vd 15ph/1 lần) để xem có schedule nào thảo mãn sẽ tạo một cái job để chạy. Cách này có vẻ performance không được cao. Xin kinh nghiệm giải quyết hay từ mọi người. Tks!

2 CÂU TRẢ LỜI


Đã trả lời thg 12 12, 2022 7:29 SA
+1

Mình thấy cách này cũng ổn mà.

  • Tạo một cái cronjob để cứ 1p / lần sẽ chạy cái một cái command của app.
  • Cái command này của app sẽ check xem schedule nào thoả mãn để xử lý.
  • Chỗ này bạn nên có cột status cho bảng schedule và tạo index phù hợp để tối ưu cho truy vấn sql
  • Trong cái command, phần logic chạy cho mỗi chiến dịch quảng cáo phù hợp bạn đưa vào hệ thống queue-job. Mình sẽ scale bằng cách có nhiều queue và nhiều queue-workers.
  • Nếu chưa đáp ứng được mà muốn scale hơn nữa thì bạn có thể chuyển hẳn phần chạy chíến dịch quảng cáo thành service riêng, viết bằng go hoặc rust chẳng hạn.

Bạn có thể chia sẻ thêm về vấn đề performance mà bạn đang gặp phải được không?

Chia sẻ
Avatar Dat Nguyen @nguyennhudat
thg 12 12, 2022 3:20 CH

@huukimit cảm ơn b, hiện tại mình cũng đang triển khai theo cách này, chỉ là mình cảm thấy nếu check liên tục như vậy và sau có nhiều user thì việc tạo nhiều job chạy cùng lúc có thể gây quá tải ko 😄

Đã trả lời thg 12 15, 2022 9:35 SA
+1

Theo mình thì bạn có thể tạo thêm 1 table phụ, sau đó tạo 1 job chạy vào 0h sáng hằng ngày, nhiệm vụ của job này sẽ lấy thông tin của các schedules có lịch trình trong ngày hôm nay đưa vào table phụ kia. Còn cái job chính thì vẫn để chạy liên tục, nhưng thay vì cứ truy vấn trong cái table Schedule với lượng data khủng, thì để cho nó query cái table phụ kia thôi. Vừa đỡ về lượng data truy vấn, với đỡ cái là có những ngày chỉ có 1, 2 schedule, nhưng nếu theo cách ban đầu thì nó vẫn cứ quét hết cái table chính (thử tưởng tượng cái table đó có tầm vài nghìn, vài trăm nghìn record thì hơi phí)

Chia sẻ
Avatar Dat Nguyen @nguyennhudat
thg 12 17, 2022 2:08 CH

@NgocPH cảm ơn b đã chia sẻ, nhưng có thể sẽ có case trong ngày đấy user có thể thêm các schedule vào thời điểm sau 0h sáng thì mấy cái schedule mới thêm này sẽ ko check được, mình sẽ phải check thêm case này

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí