2015-10-19 71 views
0

我正在開發Android應用程序,用於農業機器。在Java WebSerivce(REST vs WebSocket)中發送大量記錄的最佳選擇

此應用程序將平均每分鐘生成10到40個日誌。

20小時後,SQLite中會存儲12,000到48,000條記錄。

我的問題是關於使用Internet將這些記錄提交給服務器的最佳選擇。

今天,我正在使用帶有JSF頁面和JAX-RS(澤西島)的Java Web應用程序來與Android進行通信。對於我使用PostgreSQL 9通過JPA連接的數據庫(EclipseLink)。

在我正在做的測試中,在我看來有問題通過REST發送所有這些數據,因爲這個過程很長。我遇到超時問題 等等。

嘗試解決問題並確保數據一致性。我正在發送分頁數據,並且只有在發送所有記錄後纔開始數據庫插入。

這解決了部分問題,但我不確定這是否是最好的方法。數據在服務器上的插入時間較長,由於超時,Android無法等待進程完成。

因此,用戶不確定該過程是否成功。只有經過很長時間,插入結束和用戶才能確認該過程是否成功。

它也會產生其他問題,因爲我必須阻止用戶執行新的發送數據,直到它從前一個進程收到確認。

這種情況的最佳解決方案是什麼?

我打算看的解決方案之一是WebSocket,但想知道其他開發人員的經驗。

+0

您的服務器是否有狀態?如果是這樣,爲什麼不在異步POST請求完成時請求異步,然後客戶端請求返回,這將允許您對處理狀態進行一些輪詢?這解決了超時問題,並允許一定程度的用戶反饋;聽起來好像問題是溝通機制,聽起來不太合適。 – Fallso

+0

我想一想。今天我做這樣的事情。但是我對流程進行了手動控制,我在會話中保留了一個ID/STATUS,但所有這些似乎都不安全。進程可能會崩潰,我無法控制它們。是否有任何優雅的解決方案來運行這些進程? –

+0

看起來您的設置並未使用像Ajax這樣的可用工具,如果我無法控制現有的正在運行的進程或超時超時,我會非常擔心。你需要先解決這些問題!但是,這可能是有用的http://blog.arungupta.me/rest-vs-websocket-comparison-benchmarks/ – brianlmerritt

回答

0

經過一番測試和評估,我得到了一個很好的解決方案。將記錄上載並存儲到服務器的過程不到40秒。

在Android應用我使用的是下面的一組:

  • Realm database來存儲數據:它的優點運行查詢時,並不是所有的數據加載到內存中。數據按需加載。
  • Jackson要序列化爲Json:它的優點是序列化數據並按需寫入文件。我不得不創建一個自定義序列化器。
  • GZIPOutputStream壓縮數據:允許傑克遜寫壓縮數據。
  • Retrofit將數據上傳:因爲是漂亮:)

這組的結果對我來說非常好。大約15秒內就可以讀取,壓縮併發送50,000條Android的記錄到服務器。壓縮的數據大約爲400KB。

在服務器:

  • JPA & EclipseLink + PostgresSQL來存儲數據:一些額外的設置,你可以得到一個偉大的業績。
  • Jackson反序列化JSON:我不得不創建一個自定義的反序列化器。
  • GZIPInputStream解壓縮數據:允許傑克遜讀取壓縮數據。
  • Jersey接收請求:是一個很好的實現與CDI + EJB一起工作。

服務器接收壓縮數據並存儲到磁盤。計劃任務解壓並插入數據庫後。該過程需要15到20秒才能記錄50,000條記錄。

這對我很好,我希望這可以對其他開發者有所貢獻。