Xử lý vấn đề conflict system resource gây ra bởi cron job bằng Row Locking (Active Record)
RubyOnRails
40
background_job
1
White

To Tuan Vinh viết ngày 23/05/2015

Bài toán

Trong các dự án web xây dựng trên máy chủ Unix với Rails chúng ta thường xây dựng các cron jobs để xử lý các công việc mang tính quy trình lặp (vd: 5 phút chạy 1 lần, chạy vào sáng thứ 2, ...)
Các cron jobs này có thể xử lý các vấn đề: bảo trì data, nâng cấp version web ...
Trong bài toán về cron jobs có 1 vấn đề mà chúng ta cần giải quyết đó là double-execution.
Ví dụ:
Cron job được đặt chạy 5 phút 1 lần, 1 process được gọi nhưng hết 5 phút chưa xử lý xong, nhưng cron job vẫn tạo thêm 1 process xử lý khác, dẫn đến xung đột tài nguyên hệ thống

Giải pháp

Có 2 giải pháp sau

  1. Sử dụng run-and-sleep model. Với phương pháp này chúng ta cần tạo 1 background daemon process luôn luôn chạy, kết hợp với các gem về quản lý process như god hoặc sensu

  2. Sử dụng các gem tạo cron job như whenever đồng thời sử dụng các phương pháp để ngăn chặn double-execution như là file locking, row locking. Sau đây tôi sẽ hướng dẫn cách sử dụng row locking

Sử dụng Row Locking (DB locking)

Tại sao lại sử dụng Row locking mà không phải là File locking?
Với các dự án multi servers thì việc sử dụng FIle locking sẽ khá risk. Sử dụng DB locking sẽ giải quyết được các hạn chế này.

Tôi sẽ sử dụng chức năng Row Locking của ActiveRecord.
Code khá đơn giản như sau

class LockTable < ActiveRecord::Base
# create new Lock table for row locking
end

class MyService
  LockTable.transaction do
    LockTable.lock.find(1)
    #your logic here
  end # row will be freed
end
Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

To Tuan Vinh

1 bài viết.
1 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Bài viết liên quan
White
8 1
Tiếp theo (Link) Mình sẽ hướng dẫn cách test căn bản cho API mình tạo. Thật ra mà nói thì mình phải viết test trước khi làm nhưng mà để tránh việc...
My Mai viết hơn 3 năm trước
8 1
White
7 4
Nếu ai đã làm Rails thì không còn lạ lẫm gì với chức năng Migration của Rails. Nếu ai chưa biết thì tôi xin giới thiệu sơ qua chức năng này. Rails ...
Lơi Rệ viết hơn 3 năm trước
7 4
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
1 bài viết.
1 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!