Đầu năm 2013, nhu cầu khách hàng phát triển ứng dụng di động ios và android tăng kèm theo là yêu cầu phát triển cả phần server tập trung hóa dữ liệu. Về cơ bản đây không khác nhiều với mô hình client – server truyền thống, ngoại trừ, server thường phải host trên Internet thay vì mạng LAN, ứng dụng không trực tiếp kết nối vào CSDL mà gọi đến REST web service để gửi nhận dữ liệu định dạng JSON. Điểm khác biệt lớn nhất của ứng dụng di động kết nối server là số lượng người dùng đồng thời khá lớn, đôi khi có thể tăng vọt ở một số thời điểm trong ngày, tuần hoặc các sự kiện. Ngoài ra do sức ép cạnh tranh giá cả, việc phát triển ứng dụng web + web service cần phải nhanh, tốn ít công, hiệu suất lập trình cao, đáp ứng tải (concurrent load) tốt với điều kiện máy chủ hosting không được quá đắt là yếu tố sống còn.
Cá nhân tôi đã quen dùng WordPress. WordPress hỗ trợ gọi từ xa vào qua protocol XML-RPC. Điểm mạnh của WordPress là rất dễ cài, plugin, theme miễn phí rất nhiều và đẹp, nhưng protocol XML-RPC thì đã cũ. Cùng một nội dung thông tin, thể hiện định dạng XML sẽ tốn nhiều byte hơn định dạng JSON, chưa kể RPC (Remote Procedure Call) không thân thiện như chuẩn REST. Tốc độ phản hồi các yêu cầu của WordPress không thực sự tốt. Đối với người dùng cuối chỉ đọc các blog post, page thì để tăng tốc, quản trị WordPress dùng caching (Total Cache, Varnish Cache…) để giảm tối đa thao tác WordPress đọc ghi vào MySQL. Việc viết mới plugin rồi thêm bảng, tạo quan hệ bảng trong WordPress để hỗ trợ nghiệp vụ mới khác với chức năng CMS, Blog cơ bản phần nhiều là phức tạp hơn, tốn kém hơn là viết mới từ đầu.
Đội kỹ thuật Techmaster đã thử với Drupal từ 2011. Nền tảng này được giới thiệu là rất thích hợp với những chuyên gia lập trình. Nhưng còn lại đối với 80% dân IT chỉ cần sử dụng thì Drupal đúng là một thảm họa. Web site techmaster.vn từ 1/2011 đến 5/2011 chạy trên Drupal, việc sửa đổi theme, thêm thắt dăm ba chức năng cơ bản như form gửi thông tin đăng ký học phức tạp vô cùng. Trên cùng phần cứng, tốc độ Drupal tệ hơn WordPress, tôi cảm nhận rất rõ và benchmark của BlazeMeter.com cũng chỉ ra như vậy
Nói tóm lại, nếu bạn cần phát triển web site CMS giao diện đẹp, chức năng phổ thông bạn có thể chọn WordPress, Drupal, Joomla. Còn để xây dựng web service nghiệp vụ phục vụ kết nối từ thiết bị di động, bạn cần tìm đến một nền tảng mới, thư viên, thậm chí ngôn ngữ lập trình mới.
Danh sách ứng viên tiếp theo gồm có: Node.js, Ruby On Rails, Django, ASP.net, Java Spring, Play Framework, các PHP Framework như CodeIgnitor, YII, Laravel, Kohana, Phalcon.
Tiêu chí lựa chọn
Dễ lập trình, dễ tìm lập trình viên ở Việt nam, nếu làm được thì cũng dễ kiếm khách hàng trên thế giới, tốc độ phải tốt trên cấu hình phần cứng khiêm tốn (01 VPS). Dải ứng dụng cho khách hàng cỡ nhỏ đến trung, số lượng truy cập vài trăm kết nối đồng thời rất phổ biến. Khi tải tăng đến một giới hạn nào đó thì dù máy chủ mạnh đến đâu, các phương pháp tối ưu (scale up) trở nên tốn kém, không khả thi lúc này phải xây dựng hệ phân tán (distributed) và phân tải (load balance). Những dự án khủng đến mức này không có quá nhiều do đó tạm gác sang một bên, hoặc bạn nào có nhu cầu liên hệ Techmaster, chúng tôi sẽ phục vụ tận tình, giá hữu nghị.
Những ứng viên bị loại khỏi cuộc chơi sớm
- Django: sử dụng Python, quá hiếm ở Việt nam. Số lượng việc làm cho lập trình viên PHP vẫn cao hơn hẳn Python. Xem Infographics này
- ASP.net MVC: Microsoft đã có rất nhiều nỗ lực cải tiến bổ sung chức năng cho ASP.net MVC, ví dụ như thêm Web API. SignalR là công nghệ tuyệt hay đẩy thông báo từ server về client theo cơ chế subscribe event, push notification khác với cách cổ điển là pooling gây chậm server. Nếu có kinh phí tốt, hạ tầng tốt, có sẵn đội lập trình C# chắc chắn tôi dùng ASP.net MVC, Web API và SignalR. Tuy nhiên các khách hàng cỡ nhỏ lại không muốn trả tiền license hay phụ trội khi phải thuê máy chủ .NET.
- Spring: thời gian phát triển web service Spring, yêu cầu cấu hình và năng lực lập trình viên Java khiến Techmaster khá nản. Mặc dù đây là một lựa chọn rất tốt cho ứng dụng doanh nghiệp cần sử ổn định, khả năng phân tán, phân tải.
Những ứng viên tốt nhưng chúng tôi chưa dùng (có thể sẽ dùng trong tương lai)
- Node.JS: Ưu: tốc độ tốt, cơ chế NonBlocking I/O, ngôn ngữ JavaScript dễ lập trình, viết web service, re-active web tốt, các gói npm đa dạng. Nhược: số lượng việc làm chưa cao, ở Việt nam ít người biết, viết ứng dụng web giao diện không đơn giản (thường dùng gói express)
- Rails: Ưu: lập trình đơn giản, tutorial nhiều, các gói gem nhiều, viết web service tốt. Số việc làm cũng có, đặc biệt các startup nhỏ ở Mỹ và các công ty Nhật. Rails 4 thêm tính năng WebSocket. Nhược: chạy không nhanh, khó scale. Đội Techmaster ban đầu đã dùng Rails, nhưng sau khi benchmark đã quyết định tạm dừng. Tham khảo thêm các loại Rails Server ở đây, nghe đồn Puma cho tốc độ tốt nhất. Thực tế đã có nhiều công ty từ bỏ kiến trúc Rails để chuyển đến kiến trúc có khả năng chịu tải tốt hơn.
Framework chúng tôi chọn dùng, dùng xong thấy tốt, chia sẻ lại
A- Play Framework: Ưu điểm: đây là thư viện web được cho là tuân thủ 4 tiêu chí khắt khe của Reactive Manifesto. Play Framework được viết bằng ngôn ngữ Scala, chạy trên JVM (Java Virtual Machine), cho phép lập trình viên lập trình bằng cả Java hoặc Scala. Hỗ trợ tốt Web Socket, Server Sent Event và có sẵn khả năng phân tán dịch vụ (Akka Service). Đã có nhiều web site cực lớn sử dụng Play như Twitter, LinkedIn, Coursera, Gilt,.. Xem chi tiết các case study tại đây
Nhược điểm: Ngôn ngữ Scala mạnh nhưng rất khó học và dị. Nhiều lập trình bảo thủ sẽ thấy khó chịu với ngôn ngữ này vì nó kết hợp cả hướng đối tượng và lập trình hướng hàm (function programming).
Hiện Techmaster đang làm 3 dự án trên Play Framework, sắp tới sẽ tuyển thêm. Các bạn sinh viên không ngại ngôn ngữ lập trình mới, thích làm hệ thống phân tán phức tạp có thể email tới cuong[at]techmaster[dot]vn để xin thực tập.
Responsive: CSS giúp web site đáp ứng linh hoạt các kích thước độ phân giải khác nhau.
Scalable: khả năng mở rộng đáp ứng số lượng người dùng tăng, mà không phải thay đổi kiến trúc
Event Driven: được dẫn dắt bởi sự kiện. Thực chất là server thay vì thụ động chờ yêu cầu đến mới phản hồi. Nay Server và Client tạo kênh kết nối để trao đổi 2 chiều. Tính năng Server Sent Event tiêu biểu cho Event Driven.
Resilient: tính chịu lỗi
B-Phalcon. Ưu điểm: Phalcon là một thư viên có tính năng rất phong phú được viết bằng C biên dịch thành một PHP Extension. Điều này giúp tăng tốc độ xử lý, giảm tối đa bộ nhớ tiêu thụ khi có nhiều truy cập đồng thời.
Phalcon dễ học, dễ lập trình. Lập trình viên vẫn dùng ngôn ngữ lập trình PHP thông thường. Những hàm trong thư viện Phalcon sẽ được tối ưu tốc độ. Trong 2014, Phalcon 2.0 và ngôn ngữ Zephir sẽ phát hành. Lập trình viên viết các hàm hay dùng, cần tối ưu bằng Zephir để biên dịch ra các PHP extension mới. Web site viết bằng Phalcon chạy đồng thời, an toàn cùng các web site PHP viết bằng thư viện khác.
Nhược điểm: Phalcon không chạy được trên môi trường Shared Hosting. PHP chưa hỗ trợ WebSocket thực sự, nhược điểm này có thể khắc phục bằng thư viện Rachet
Phalcon vs Play Framework: Việc học lập trình PHP dễ dãi hơn rất nhiều so với Scala. Giải pháp Phalcon rất phù hợp những gói hosting VPS giá thấp những vẫn muốn tốc độ tốt. Việc bảo dưỡng web site viết bằng Phalcon không cầu kỳ, sửa file PHP đẩy lên là xong. Play Framework phù hợp cho hệ thống lớn, cần phân tán dịch vụ…
Tại sao Techmaster chọn Phalcon chứ không phải CodeIgniter, Laravel, YII, Zend, Kohana?
- CodeIgniter, Laravel, YII, Zend, Kohana các thư viện là thư viện PHP, cơ bản sẽ phải dịch lại khi có yêu cầu mới. Tốc độ chậm. Việc tăng tốc có giải pháp HHVM, APC Cache. HHVM do FaceBook phát triển tăng tốc triệt để, hiệu quả hơn, nhưng tiếc rằng nó còn chưa tương thích ở rất nhiều điểm và thiếu ổn định. Ở thời điểm này, dùng HHVM cho khách hàng doanh nghiệp là liều lĩnh.
- Mức độ dễ lập trình thì Phalcon tương đương các thư viện còn lại. Các lập trình viên Techmaster học thư viện Phalcon rất nhanh.
- Tốc độ vượt trội của Phalcon khiến đội chúng tôi không thể không dùng. Mặc dù trước đó nhiều anh em đã dùng thành thạo CodeIgniter hay Kohana, thậm chí Techmaster cũng đã dùng Kohana cho một dự án dài gần 1 năm.
Kinh nghiệm thực tế rút ra sau khi dùng Phalcon
Techmaster bắt đầu nghiên cứu vào đưa Phalcon vào các dự án viết web service (không có giao diện) và ứng dụng web có giao diện từ 7/2013. Chúng tôi đã triển khai được 2 dự án. Một dự án nhỏ để kiểm nghiệm, hơi mạo hiểm khi đó. Nhưng đến nay chưa có phàn nàn gì. Hệ thống chạy cực ổn định.
Một dự án thương mại điện tử gồm phát triển ứng dụng iPad, web service, web front end, chia thành nhiều giai đoạn. Mỗi giai đoạn bổ xung nhiều chức năng. Đến nay việc phát triển, bảo trì web site viết bằng Phalcon rất thuận lợi.
Các tính năng có sẵn trong Phalcon cực phong phú ORM, Caching (ra file, bộ nhớ, Redis), hỗ trợ nhiều loại CSDL: MySQL, Postgresql, Oracle, MongoDB.., quản lý người dùng, phân quyền, logging, event manager (tạo hook để can thiệp như trong Drupal và WordPress),… Cộng đồng sử dụng, tham gia đóng góp cải tiến mã nguồn mở tăng nhanh.
Phalcon không chạy song song cùng với HHVM được. Bạn có thể tối ưu hơn nữa bằng dùng Zephir để chuyển nốt các thư viện tự viết sang PHP Extension, nhưng phải chờ cho đến khi Phalcon 2.0 ra mắt.
Chú ý chúng tôi khuyên dùng tập các công nghệ sau đây sau khi đã kiểm thử tải trong nhiều tính huống khác nhau
Phalcon, PHP-FPM, Nginx, Percona Server (biến thể của MySQL, tốc độ thực thi nhanh hơn MySQL khoảng 5-10 lệnh/giây đối với VPS đơn lõi), hoặc Postgresql, trên CentOS. Ubuntu thân thiện hơn nhưng khả năng thu hồi bộ nhớ sau những cao điểm truy cập kém hơn CentOS.
Các benchmark kiểm chứng tham khảo:
Tác giả và đội phần mềm Techmaster rất mong nhận được nhiều ý kiến đóng góp, chỉ bảo từ các lập trình viên web và các chuyên gia tối ưu hiệu suất web server
Bình luận