2011-12-22 27 views
5

Tôi có nhiều năm kinh nghiệm phát triển các ứng dụng web với PHP và tôi cũng đã làm việc với Java rộng rãi (tuy nhiên không bao giờ phát triển ứng dụng web). Tôi đang hoàn thành một dự án lớn mà tôi đã làm việc trong sáu tháng qua được xây dựng bằng PHP/CodeIgniter và được lưu trữ với CloudControl (cung cấp khả năng mở rộng và cung cấp máy chủ tự động).Câu hỏi về Java cho phát triển web từ một nhà phát triển PHP

Dự án đã hoạt động tốt và PHP đã phục vụ nhu cầu của tôi - nhưng bây giờ tôi đang trong giai đoạn đầu của việc phát triển một ứng dụng web sẽ hướng đến người dùng doanh nghiệp và tôi đang xem xét sử dụng Java (có thể là 'Grails') kết hợp với AWS Elastic Beanstalk.

Câu hỏi đầu tiên của tôi là: đa luồng, tần suất nó được sử dụng trong phát triển ứng dụng web cho Java như thế nào? Với ứng dụng PHP của tôi, máy chủ của tôi có thể đã được yêu cầu thực hiện cuộc gọi API tới facebook theo yêu cầu của người dùng (nói bài đăng lên tường của người dùng). Để tránh quá trình PHP của tôi chờ đợi khi cuộc gọi API hoàn thành trước khi trở về người dùng, tôi đã sử dụng các máy chủ xếp hàng công việc Gearman với các công nhân để tải công việc từ máy chủ ứng dụng chính của tôi xuống một nhân viên nền.

Một nhà phát triển Java có thể chỉ đơn thuần xoay vòng một chuỗi chỉ để xử lý cuộc gọi API và có quá trình chính trả lại cho người dùng không? Đây có phải là cường độ phát triển Java lớn nhất trên PHP không? Cảm ơn!

+1

Tôi đã tự nuôi bằng cả hai ngôn ngữ trong một thời gian hehe. Ý kiến ​​rất khiêm tốn của tôi là: sức mạnh của Java là sự sẵn có của các API và thư viện. Đối với PHP là tốc độ để xây dựng một nguyên mẫu hoặc một phiên bản chức năng. Nhìn vào tôi ngay bây giờ, tôi đã chọn java một lần nữa cho một dự án mới bởi vì tôi biết tôi có thể sử dụng Apache POI thay vì PHPExcel ... loại lười biếng. :) – Alfabravo

+1

Tôi biết khả năng tạo ra các luồng mới là một sự mới lạ đối với một nhà phát triển PHP (như bản thân mình) và có khả năng sử dụng tính năng tuyệt vời này mà PHP tuyệt vọng thiếu để tăng lên toàn bộ "ooh, tôi có thể làm điều này, và điều này, và những điều này "loại suy nghĩ - nhưng được tha. Tôi đã nghe quá nhiều câu chuyện của các nhà phát triển đến từ PHP vào một số ngôn ngữ cho phép đa luồng và tham gia vào một tình huống mà họ đã bắt đầu 100 chủ đề để thực hiện công việc của một thứ có thể hợp lý trong 3, và sau đó tự hỏi tại sao máy chủ đang chạy như một con chó. – DaveRandom

+0

Tôi đã sử dụng các chủ đề khi người dùng yêu cầu dữ liệu có sẵn (hiệu suất là một tính năng!) Và thu thập tất cả sẽ yêu cầu thời gian chờ đợi lâu trong một chuỗi duy nhất. Tôi chắc chắn có rất nhiều trường hợp khác, nơi nó chứng minh hữu ích nhưng nó không phải là một viên đạn bạc hay một ý nghĩ đầu tiên khi xây dựng một cái gì đó. – Alfabravo

Trả lời

2

Một nhà phát triển Java có thể chỉ đơn thuần xoay chuỗi chỉ để xử lý cuộc gọi API và có quy trình chính trả lại cho người dùng không?

Tùy theo.

Nếu bạn làm điều đó, thì chuỗi ban đầu có thể làm điều gì đó khác một chút, nhưng trừ khi nó được thiết kế để dựa trên sự kiện, thì cuối cùng nó sẽ cần đợi chuỗi thứ hai kết thúc ... và bạn trở lại nơi bạn bắt đầu. (Trên thực tế bạn đang xấu đi ... vì bây giờ bạn đã có 2 đề chờ đợi.)


Trong trường hợp của một máy chủ web thực hiện sử dụng Java servlets cổ điển, mỗi yêu cầu người sử dụng được chạy trên thread riêng của mình. Cách tiếp cận đơn giản là thực hiện cuộc gọi API trên chuỗi yêu cầu. Điều này ngăn chặn các chủ đề, nhưng chủ đề khác có thể được làm việc trên các yêu cầu khác trong khi điều này đang xảy ra. Giả sử rằng bạn có đủ chủ đề trong hồ chứa thread của trang web này hoạt động tốt ... mặc dù bạn kết thúc bằng cách sử dụng rất nhiều tài nguyên (bộ nhớ) trên ngăn xếp chủ đề.

Phiên bản mới nhất của thông số kỹ thuật servlet Java đã thêm hỗ trợ cho xử lý không đồng bộ. Tôi không lên đến tốc độ trên các chi tiết, nhưng điều này sẽ trong lý thuyết cho phép bạn ngắt kết nối một chuỗi yêu cầu từ một yêu cầu trong khi sau này đã làm một cái gì đó mà mất một thời gian dài. Tuy nhiên, tôi không tin rằng điều này sẽ giúp ở đây ... trừ khi bạn đã thực hiện phía khách hàng của API tương tự như vậy có thể chạy nhiều yêu cầu đồng thời song song bằng cách sử dụng một số lượng nhỏ các chuỗi Java.

Có thể có các lựa chọn thay thế khác, nhưng chúng có thể hoạt động nhiều hơn.


Lời khuyên của tôi sẽ là giải pháp đơn giản để bắt đầu. Chỉ cần thực hiện cuộc gọi API trên chuỗi yêu cầu và định cấu hình máy chủ web của bạn để sử dụng số chuỗi yêu cầu hợp lý.

Cơ hội là bạn sẽ có thể thoát khỏi "lãng phí" một số bộ nhớ để có được thông lượng bạn thực sự cần. Về lâu dài, bạn có thể cần phải giải quyết điều đó, nhưng bạn sẽ có thời gian để tìm hiểu thêm về các lựa chọn thay thế có khả năng mở rộng hơn sau đó.

+0

OK Bây giờ tôi thấy rằng bất kỳ chủ đề sinh ra bởi một quá trình phải hoàn thành trước khi thread thực hiện đã được bắt đầu bởi một yêu cầu người dùng kết thúc. Với máy chủ PHP của tôi, CloudControl, tôi chỉ cho phép hai quy trình cho mỗi hộp. Để giảm bớt nhu cầu cung cấp các hộp bổ sung, tôi đã sử dụng máy chủ xếp hàng công việc và chạy một số công nhân nền chờ công việc - cho phép luồng chính trả về khi không phải chờ kết quả của cuộc gọi API –

Các vấn đề liên quan