Một phương pháp xử lý job trong Elixir có từ một thập kỷ trước đang nhận được sự quan tâm trở lại khi các nhà phát triển khám phá các lựa chọn thay thế cho các giải pháp chính thống. Cuộc thảo luận tập trung vào việc xây dựng các job runner tùy chỉnh sử dụng GenStage, framework producer-consumer tích hợp sẵn của Elixir, thay vì chỉ dựa vào các thư viện đã được thiết lập.
Cuộc trò chuyện làm nổi bật một thách thức dai dẳng trong hệ sinh thái Elixir: việc áp dụng trên thị trường. Mặc dù có những ưu thế về mặt kỹ thuật, các nhà phát triển vẫn tiếp tục gặp phải sự kháng cự khi đề xuất các giải pháp dựa trên Elixir trong môi trường doanh nghiệp. Một nhà phát triển đã chia sẻ kinh nghiệm của họ về việc xây dựng một hệ thống thông báo Pub/Sub production đã chạy thành công trong nhiều năm, nhưng vẫn gặp phải sự hoài nghi từ khách hàng, những người thích các công nghệ thông thường hơn như Java, .NET, Python, hoặc PHP.
Các thành phần kiến trúc GenStage:
- Producer: Tạo ra các thông điệp/công việc (UUID trong ví dụ)
- Consumer: Xử lý các công việc được lấy từ producers
- Supervisor: Quản lý vòng đời tiến trình và khởi động lại
- Built-in Buffer: Lưu trữ các mục trong bộ nhớ trước khi xử lý
Oban thống trị các triển khai Production
Trong khi các implementation GenStage tùy chỉnh mang lại giá trị học tập, cộng đồng mạnh mẽ hướng về Oban cho việc sử dụng trong production. Thư viện xử lý job đã được thiết lập này cung cấp cả phiên bản mã nguồn mở và chuyên nghiệp, với phiên bản sau cung cấp các tính năng nâng cao như workflows, rate limiting, và kiểm soát concurrency. Tuy nhiên, một số nhà phát triển bày tỏ lo ngại về những hạn chế tính năng trong phiên bản miễn phí, đặc biệt khi xây dựng các dự án mã nguồn mở có thể hưởng lợi từ các tính năng Pro.
Cuộc thảo luận tiết lộ một căng thẳng thực tế giữa tính chất toàn diện của các giải pháp thương mại và tính linh hoạt của các implementation tùy chỉnh. Trong khi Oban xử lý hầu hết các yêu cầu production một cách hiệu quả, các nhà phát triển quan tâm đến các mẫu kiến trúc cụ thể hoặc các bài tập học tập thấy giá trị trong việc hiểu các cơ chế GenStage cơ bản.
So sánh phiên bản Oban:
- Mã nguồn mở: Xử lý công việc cơ bản, lập lịch, xử lý lỗi
- Phiên bản Pro: Các tính năng nâng cao bao gồm quy trình làm việc, giới hạn tốc độ, kiểm soát đồng thời và điều phối đa worker
Cơ hội tích hợp PostgreSQL
Một hướng phát triển thú vị đã xuất hiện xung quanh việc xử lý job dựa trên PostgreSQL. Các nhà phát triển đang khám phá việc tích hợp với các extension PostgreSQL như pgmq và pg_cron, tương tự như các phương pháp được sử dụng bởi pgflow. Hướng này phù hợp với các xu hướng rộng lớn hơn hướng tới việc xử lý job tập trung vào cơ sở dữ liệu, tận dụng các tính năng nâng cao của PostgreSQL cho quản lý queue và scheduling.
Tôi rất muốn thấy một cái cho Elixir được xây dựng xung quanh các extension Postgres pgmq và pg_cron tương tự như những gì pgflow đang làm
Phương pháp PostgreSQL cung cấp những ưu thế tiềm năng trong các môi trường đã đầu tư mạnh vào cơ sở hạ tầng PostgreSQL, đặc biệt là những môi trường sử dụng các tính năng realtime của Supabase, được hỗ trợ bởi Elixir và giám sát Write-Ahead Log của PostgreSQL.
Các tùy chọn tích hợp PostgreSQL:
- Tiện ích mở rộng pgmq: Chức năng hàng đợi tin nhắn
- Tiện ích mở rộng pg_cron: Khả năng lập lịch
- Phương pháp pgflow: Xử lý công việc tập trung vào cơ sở dữ liệu
- FOR UPDATE SKIP LOCKED: Xử lý công việc đồng thời với khóa cấp độ hàng
Giá trị giáo dục và tính ổn định của Code dài hạn
Việc tái khám phá code GenStage từ một thập kỷ trước chứng minh tính ổn định của Elixir và sự liên quan lâu dài của mô hình concurrency của nó. Các nhà phát triển lưu ý rằng implementation gốc đã hoạt động tốt như thế nào theo thời gian, cho thấy các mẫu Elixir cơ bản vẫn mạnh mẽ và có thể bảo trì. Tính ổn định này tương phản với sự phát triển nhanh chóng được thấy trong nhiều technology stack khác.
Khía cạnh giáo dục đặc biệt cộng hưởng với các nhà phát triển đang học các khả năng distributed computing của Elixir. Khả năng xây dựng các hệ thống xử lý job phức tạp với code tương đối đơn giản thể hiện những điểm mạnh của Elixir trong các ứng dụng concurrent và distributed.
Cuộc thảo luận đang diễn ra phản ánh các chủ đề rộng lớn hơn trong cộng đồng Elixir: sự xuất sắc về kỹ thuật kết hợp với những thách thức về việc áp dụng, sự cân bằng giữa các giải pháp tùy chỉnh và các thư viện đã được thiết lập, và sự phát triển liên tục của các mẫu tích hợp PostgreSQL. Khi các nhà phát triển tiếp tục khám phá những phương pháp này, sự kết hợp giữa tính ổn định đã được chứng minh và các yêu cầu hiện đại tiếp tục thúc đẩy sự đổi mới trong các giải pháp xử lý job Elixir.
Tham khảo: Writing A Job Runner (in Elixir) (Again) (10 years later)