Implement Go-worker with Sidekiq Enqueue

Chào mọi người,

Đã từ lâu mình muốn viết bài về một số Backgroud worker ngoài những backgroud mình đã giới thiệu trước.

Như đã biết Ruby là ngôn ngữ thông dịch, về nguyên tắc thì ngôn ngữ thông dịch sẽ bị hạn chế về tốc độ so với ngôn ngữ biên dịch. Hiện nay Golang đang khá nổi trên thị trường, vậy tại sao chúng ta không sử dụng thế mạnh tốc độ của golang để xây dựng một worker làm việc tốt với Rails nhỉ?

Hôm nay mình xin giới thiệu về cách tích hợp cơ bản Goworker với Rails thông qua sidekiq enqueue (dựa trên Redis là nơi lưu trữ)

Ở phần này mình sẽ không nhắc lại cơ chế làm việc của Backgroud Worker, các bạn có thể tham khảo các bài trước nhé.

Cùng xem đoạn Go như sau:

Đoạn code trên miêu tả cấu trúc của 1 object person có firstname, lastname và gender.

Cùng xây dựng một worker trên go như code sau: (file go_with_sidekiq.go)

Khi thực hiện chạy code này với lệnh: go run go_with_sidekiq.go

Đến đây chúng ta chỉ mới khởi động được go worker, vậy cách nào để Rails có thể làm việc được nó (?) -> Back to basic: dựa trên kiến trúc cơ bản về giao tiếp dữ liệu sẽ được trao đổi thông qua 1 queue trên Redis.

Vì vậy nếu như Go worker lắng nghe trên 1 kênh, thì khi ta đẩy dữ liệu vào kênh này từ Rails, hẳn là Goworker sẽ nhận được, từ đó dùng dữ liệu này xử lý như chúng ta cần.

Cùng mở Rails console và chạy đoạn lệnh sau:

Về cơ bản các lệnh trên sẽ cấu hình Sidekiq sử dụng redis db nào.

Từ rails app tạo một active job như sau:

Vậy là ta đã đủ các yếu tố để thử một vài ví dụ và so sánh kết quả:

Các bạn cùng xem demo về việc tạo 30 000 object person thông qua Goworker và Sidekiq.

Go-worker

Sidekiq

Một vài đánh giá mình tổng kết được như sau:

Vòng sơ loại ta chỉ đánh giá việc in ra 30.000 messages

Vòng tuyển dụng chúng ta sẽ insert 30.000 object person dùng mongodb lưu trữ lần lượt dùng sidekiq và go-worker, cùng xem kết quả mình tổng hợp nhé.

Có rất nhiều nhận xét từ kết qủa trên, nhưng theo mình một bức ảnh hơn triệu lời nói. Các bạn có thể sử dụng code dựng sẵn, chạy thử và tổng hợp kết quả tuỳ ý để đưa ra kết luận cho chính bản thân.

P/s: Phần sau mình sẽ hướng đến tích hợp với Rust-worker để đánh giá thêm thú vị.

Thân,

 

Tiến An

Admin tại RubySG.com

You may also like...