Chà, lại là một ngày cuối tuần và tôi lại ngồi đây, gõ lạch cạch chia sẻ với anh em về cái gọi là “Phoenix vs”. Thực ra thì chả có “vs” với thằng nào cụ thể đâu, mà là cái quá trình tôi “vật lộn” rồi “say đắm” với thằng Phoenix này như thế nào thôi. Anh em thông cảm, tôi thích đặt tiêu đề giật gân tí cho nó có không khí.
Bắt đầu từ đâu nhỉ?
À, nhớ rồi. Dạo đó tôi đang làm một dự án cá nhân, dùng một cái framework cũ rích, mỗi lần build hay deploy là y như rằng ngồi pha ấm trà chờ. Bực mình không chịu nổi! Thế là quyết tâm tìm một cái gì đó mới mẻ, hiệu năng cao hơn, mà cộng đồng cũng phải xôm tụ một tí để có gì còn hỏi. Lang thang trên mạng, đọc hết diễn đàn này tới blog nọ, thấy anh em khen Phoenix của Elixir quá trời. Nào là tốc độ bàn thờ, nào là xử lý đồng thời ngon lành cành đào, nào là LiveView làm frontend nhàn tênh. Nghe bùi tai phết!
Nghi ngờ ban đầu
Nói thật là ban đầu tôi cũng hơi rén. Elixir? Erlang/OTP? Nghe lạ hoắc. Trước giờ toàn code mấy ngôn ngữ quen thuộc, giờ nhảy sang cái này không biết có kham nổi không. Cú pháp thì nhìn qua cũng hơi khác bọt. Liệu có khó học quá không? Tài liệu có nhiều không? Thư viện có đủ dùng không? Một đống câu hỏi cứ lởn vởn trong đầu.
Lao vào thử thách
Nhưng mà máu liều nhiều hơn máu não, tôi quyết định thử. “Không thử sao biết!”, tôi tự nhủ thế. Tôi bắt đầu bằng việc cài đặt Elixir và Phoenix. Cũng may là tài liệu hướng dẫn cài đặt trên trang chủ của Phoenix khá chi tiết, làm theo từng bước thì cũng ổn. Sau đó là mò mẫm làm theo cái tutorial “Hello Phoenix” kinh điển. Cảm giác đầu tiên là: “Ồ, cũng không đến nỗi nào!”
- Cú pháp Elixir: Lúc đầu nhìn hơi lạ, nhất là cái kiểu pattern matching với mấy cái pipe operator `>`. Nhưng code nhiều thành quen, thậm chí còn thấy nó khá là mạch lạc, dễ đọc nữa.
- OTP và GenServer: Khái niệm này thì đúng là hơi trừu tượng. Tôi phải đọc đi đọc lại mấy lần, xem thêm vài cái video giải thích thì mới lờ mờ hiểu được cái ý tưởng của nó về concurrency và fault tolerance. Đúng là một chân trời mới!
- Ecto: Cái này để làm việc với database. Ban đầu tôi cứ so sánh nó với mấy cái ORM cũ, thấy hơi khác. Nhưng dùng rồi mới thấy Ecto nó mạnh mẽ và linh hoạt hơn nhiều, nhất là khoản viết query.
- LiveView: Đây mới thực sự là thứ làm tôi “wow”. Xây dựng giao diện tương tác real-time mà không cần viết nhiều JavaScript, thậm chí là không cần luôn nếu chỉ là mấy cái đơn giản. Mọi thứ xử lý hết ở backend. Cái cảm giác nó “mượt” khó tả lắm anh em ạ. Trước kia làm mấy cái real-time chat hay thông báo, tôi phải loay hoay với WebSocket, rồi JavaScript đủ kiểu, phức tạp vãi. Giờ với LiveView, mọi thứ nó gọn gàng hơn hẳn.
Những khó khăn không thể tránh khỏi
Tất nhiên là không phải lúc nào cũng màu hồng. Có những lúc tôi cũng bí ý tưởng, gặp lỗi không biết sửa thế nào. Cộng đồng Phoenix tuy nhiệt tình nhưng đôi khi có những vấn đề đặc thù quá thì cũng khó tìm được câu trả lời ngay. Rồi thì việc tìm thư viện cho một vài tác vụ ngách cũng không phong phú bằng mấy thằng lớn như * hay Ruby on Rails. Có những lúc phải tự tay viết lấy hoặc tìm cách tích hợp từ những nguồn khác.
Ví dụ, có lần tôi cần tích hợp một cái dịch vụ thanh toán khá là “chuối” của Việt Nam, tài liệu thì sơ sài. Loay hoay cả tuần trời mới xong. Hay như việc deploy lần đầu, cũng phải mày mò cấu hình Nginx, rồi systemd service các kiểu. Đúng là không có gì dễ dàng cả.
Kết quả và cảm nhận
Sau một thời gian vật lộn, cuối cùng thì cái dự án cá nhân của tôi cũng chạy được trên Phoenix. Phải nói là sướng! Tốc độ cải thiện rõ rệt. Khả năng chịu tải cũng tốt hơn hẳn. Mà cái tôi thích nhất là sự ổn định. Từ ngày chuyển qua, tôi ít phải lo lắng về mấy cái lỗi vặt vãnh hay sập server bất tử nữa.
So sánh nhẹ (với chính mình trước đây):
- Hiệu năng: Thằng Phoenix này chạy nhanh hơn hẳn mấy cái tôi dùng trước đây. Cảm giác nó nhẹ nhàng, thanh thoát.
- Khả năng mở rộng: Nhờ có OTP, việc xử lý nhiều request đồng thời ngon hơn, sau này muốn scale hệ thống cũng tự tin hơn.
- Trải nghiệm phát triển: Mặc dù ban đầu có hơi khó khăn để làm quen, nhưng khi đã quen rồi thì code sướng tay lắm. Nhất là với LiveView, tiết kiệm được bao nhiêu thời gian làm frontend.
- Sự ổn định: Cái này thì khỏi bàn. Erlang/OTP nó sinh ra để làm mấy hệ thống yêu cầu độ tin cậy cao mà.
Nói tóm lại, cái quá trình “Phoenix vs” của tôi, thực ra là “Phoenix và tôi”, là một hành trình khá thú vị. Từ nghi ngờ, đến thử thách, rồi cuối cùng là hài lòng. Tất nhiên, không có công nghệ nào là hoàn hảo, Phoenix cũng có những điểm mạnh, điểm yếu riêng. Quan trọng là nó có phù hợp với bài toán và sở thích của mình hay không thôi.
Hôm nay chia sẻ tới đây thôi. Hy vọng chút kinh nghiệm thực tế này của tôi giúp anh em có thêm cái nhìn về Phoenix. Chúc anh em code vui!