2015-10-14 135 views
1

HTTPWebSockets這個令人愉快的問題再次出現,不過即使退出了幾百條關於versus博客文章,SO問題等的閱讀之後,我仍然完全喪失了什麼我應該爲我們的應用而努力。在這篇文章中,我將提供有關應用程序功能的信息,以及當前應用程序中使用的請求/響應類型。我應該使用AJAX還是WebSockets。

目前我們的應用程序是一個草率的作品,用AngularJSAJAX請求到Apache服務器上運行PHP,即XAMPP扔在一起。隨着應用程序的啓動,我注意到當服務器處於任何負載狀態時,我們遇到了響應時間問題。這可能與我們服務器的臃腫架構,硬件以及我們的MySQL數據庫沒有完全優化的事實有關。

但是,有了這樣的忠實粉絲羣和投資者看到我們的應用程序的潛力,並給我們一個機會推出2.0我一直在努力研究如何將此應用程序變成低延遲可伸縮性的強大。老實說,最好的選擇是hire someone with experience,但不幸的是我是一個業餘愛好者,也是一個沒有太多經驗的單人軍隊。

經過一番深入的研究,我決定使用NodeJS這次寫入後端。不過,我很難決定HTTPWebsockets。以下是在服務器/客戶端之間完成的事務類型。

  • 客戶端以JSON格式向服務器發送請求。該請求有幾個不同的東西。

    • 請求ID(對於基於請求處理邏輯)
    • 與請求ID相關聯的數據。
  • 服務器收到請求,輪詢數據庫(如果需要),然後以JSON格式響應客戶端。有時服務器正在向客戶端提供文件。即Base64格式的圖像。

目前應用(當使用時),將請求發送到服務器的每一個接口被改變時,其平均爲我們的應用程序是每隔幾秒鐘。我們接口上的每個操作都會向服務器發送另一個請求。應用程序還會每8秒發送一次檢查通知/消息的請求(或兩秒,具體取決於它們是否位於消息傳遞界面上)。

目前,通過與我們的應用程序的stateless連接,我看到stated連接的好處。

  • 如果說明連接,我可以消除通知和消息的請求,因爲只要服務器可用就可以告訴客戶端。這可以每秒向服務器單獨消除x(n)/4個請求。

  • 處理像服務器斷開連接一樣簡單,試圖重新連接,而不是處理每個請求超時/錯誤,這隻能在套接字上處理。

  • 通過刪除數據庫交互的安全密鑰可以獲得額外的安全性,這應該可以防止session_key的Hijacking(?)的可能性並使用它來操作或訪問其他用戶數據。由於AJAX設置中沒有狀態,因此僅需要session_key。

但是,我是通過TCP遊戲服務器仿真開始學習編程的人。所以我明白STANDARD連接的some好處,但我根本不明白STATELESS連接的好處。我知道他們都有他們的好處和怪癖,但我很好奇什麼是我們最好的方法。

我們主要在尋找可伸縮性,因爲我們有一個本地應用程序的啓動,並在48小時內成爲近10,000個用戶的瓶頸。幸運的是,我宣佈這是一個BETA,並且在得知我自己作爲一個學習項目完成之後,這些用戶正在削弱我很多的負擔。我已經禁用註冊,同時尋求改進應用程序的前臺和後臺。

重要:

如果使用的WebSockets,將我們能夠asynchronously圖片下載從服務器喜歡,我們可以用AJAX?例如,我可以使用AJAX向服務器發送5個請求,以獲得5個不同的圖像,並且他們都將立即開始下載,使用指定的連接,我必須等待每個照片流傳送到下一個請求之前?這僅僅是一個單用戶還是每個等待請求完成的用戶?

+0

對不起,讓您的生活困難,但我會重新考慮'Node.js' ...'Node.js'是一個單線程的反應器爲基礎的框架,除非你有很長處理作業是驚人的,美妙的 - 比如未優化數據庫查詢會導致您的服務器(而不是數據庫)組織或處理數據。如果您有任何請求需要一段時間才能處理(並且您的帖子指出您這樣做),則「Node.js」可能不是最佳選擇,並且可能會導致您的服務器在每次客戶端請求需要很長時間處理的事情時掛起...(無論是你還是付出更多的縮放)。 – Myst

+0

@Myst - 我很清楚NodeJS帶來的風險,查詢可以像數據庫結構一樣輕鬆優化。這一切都將在此過渡期間重做,因爲我將從MySQL遷移到MongoDB。另外,值得注意的是Node可以使用'Sticky-session'在所有處理器上使用。我已經建立了自己的機器,它坐落在服務器託管站,雖然技術上是高規格桌面,但我很幸運地知道人們爲我的「桌面服務器」獲得10Gbit連接和管理。 1TB SSD,32GB Ram,Debian,四核4.6GHz處理器。 – Hobbyist

+0

請注意,應用程序原始版本中的一半性能問題是因爲我對開發完全懶惰。我在做迷戀內存複製,講述數據庫中的原始文件數據,而不是鏈接到文件系統等。顯然它會結結巴巴地說。嘿。 – Hobbyist

回答

1

這一切都歸結於您的應用程序如何工作以及如何擴展。我會使用純粹的WebSockets而不是任何包裝,因爲它是一個已經很容易使用的API,當你需要擴展時,你的手不會被束縛。

這裏有些鏈接會給你洞察力,雖然不是你的問題的具體答案,因爲如我所說,這取決於你的期望。

Hard downsides of long polling?

WebSocket/REST: Client connections?

Websockets, and identifying unique peers[PHP]

How HTML5 Web Sockets Interact With Proxy Servers

2

如果您的問題我應該使用HTTP過的WebSockets?,迴應是:您不應該

即使是速度更快,因爲你不會失去打開連接時,你也失去了所有喜歡的動詞(GETPOSTPATCHPUT,...),路徑,身體,同時也響應HTTP規範,狀態碼。這接近簡單,但你必須重新實現這些協議的全部或部分。

所以你應該使用Ajax,只要它是一個實在的請求。

當您需要每2秒發出一次ajax請求時,您實際上需要服務器向您發送數據,而不是您請求服務器檢查Api更改(如果已更改)。所以這表示你應該實現一個websocket服務器。

+1

這是我正在尋找的建議。 – uchuugaka