2011-12-22 84 views
5

我有幾年使用PHP開發Web應用程序的經驗,而且我也廣泛地使用過Java(但從來沒有用於Web應用程序開發)。我正在完成一個在PHP/CodeIgniter中構建並在CloudControl中託管的過去六個月中一直在進行的大型項目(提供自動服務器配置和可伸縮性)。關於從PHP開發人員進行Web開發的Java的問題

該項目進展順利,PHP滿足了我的需求 - 但現在我正處於開發一個針對企業用戶的Web應用程序的開始階段,我正在考慮使用Java(可能是'Grails')結合AWS Elastic Beanstalk。

我的第一個問題是:多線程,它在Java應用程序開發中的頻率如何?使用我的PHP應用程序,我的服務器可能需要響應用戶的請求(例如發佈到用戶的牆上)對Facebook進行API調用。爲避免讓我的PHP進程在返回給用戶之前等待API調用完成,我使用Gearman作業隊列服務器w/workers將工作從主應用程序服務器卸載到後臺工作。

Java開發人員是否只需旋轉一個線程來處理API調用,並讓主進程返回給用戶?這是通過PHP進行Java開發的最大優勢嗎?謝謝!

+1

我一直在用兩種語言餵養自己一段時間呵呵。我非常謙虛的觀點是:Java的優勢在於API和庫的可用性。對於PHP來說,構建原型或功能版本的速度很快。現在看看我,我又選擇了一個新的項目,因爲我知道我可以使用Apache POI而不是PHPExcel ......有點懶惰。 :) – Alfabravo 2011-12-22 23:38:21

+1

我知道產生新線程的能力對於PHP開發人員(比如我自己)來說是新鮮事物,並且有能力使用PHP非常缺乏的這個很好的功能,從而產生了一大堆「哦,我可以做這個,這個,這些東西「的思想類型 - 但要保守。我聽到有太多關於PHP開發人員使用某種允許多線程的語言的故事,並且進入了一種情況,他們已經開始使用100個線程來完成可以在3中合理完成的任務,然後想知道爲什麼服務器像狗一樣運行。 – DaveRandom 2011-12-22 23:41:44

+0

當用戶需要數據可用時(性能是一項功能!),我已經使用了線程,並且在單個線程中收集它們都需要很長的等待時間。我相信還有很多其他案例證明它有幫助,但它不是一個銀色的子彈,也不是建立某種東西時的首要想法。 – Alfabravo 2011-12-23 16:14:18

回答

2

Java開發人員只需旋轉一個線程即可處理API調用,並讓主進程返回給用戶?

這取決於。

如果你這樣做,那麼原來的線程可以做一些其他的事情,但除非它被設計成基於事件,那麼它最終將需要等待二級線程完成......而你是回到你開始的地方。 (其實你是更糟......因爲你現在已經有2個線程等待。)


在使用傳統的Java servlet來實現Web服務器的情況下,每個用戶的請求在自己的線程中運行。簡單的方法是在請求線程上執行API調用。這會阻塞該線程,但其他線程可以在處理其他請求時進行處理。假設你在Web容器的線程池中有足夠的線程,這工作正常......儘管你最終在線程堆棧上使用了大量資源(內存)。

最新版本的Java servlet規範增加了對異步處理的支持。我沒有仔細研究細節,但是理論上這可以讓你從請求中斷開一個請求線程,而後者正在做一些需要很長時間的事情。然而,我不相信這會對此有所幫助,除非你有一個API的客戶端實現,它可以同時運行多個併發請求,使用一個小的(有界的)數量的Java線程。

可能還有其他的選擇,但他們可能會做更多的工作。


我的建議是去一個簡單的解決方案開始。只需在請求線程上進行API調用,然後將Web服務器配置爲使用合理數量的請求線程。

很有可能您將能夠通過「浪費」一些內存來獲得您實際需要的吞吐量。從長遠來看,您可能需要解決這個問題,但到那時您將有時間瞭解更多可擴展的替代方案。

+0

好吧我現在看到,由用戶請求啓動的執行線程結束之前,進程產生的任何線程都必須完成。使用我的PHP主機CloudControl,每個框只允許兩個進程。爲了減少配置額外盒子的需要,我使用了一個作業排隊服務器並運行了幾個等待作業的後臺工作人員 - 允許主線程在不需要等待API調用的結果時返回 – 2011-12-22 23:52:20