簡體   English   中英

如何構建需要與客戶端進行雙向通信的Django應用

[英]How to architect a django app that requires bidirectional communication with the client

我有一個通過互聯網(完全獨立的網絡)連接的webapp(django / node.js)和一個客戶端(不是瀏覽器,一個使用請求包的控制台應用)。 預期客戶端將不會一直存活,而是會通過不可靠的Internet連接連接到Internet。

我需要一些有關架構應用程序的建議,並且系統應該執行以下操作:

  1. 我需要能夠將數據從服務器推送到客戶端,並且發生這種情況時,客戶端將根據收到的數據更新其本地MSSQL數據庫,並向服務器確認數據更新成功(即雙向通信) )

  2. 服務器還可以詢問客戶端是否還活着...。客戶端將響應,如果它還活着,並且用作監視狀態客戶端的心跳。 如果它仍然存在,則服務器可以要求客戶端啟動一個較長的過程(例如,開始備份其數據庫並上傳)。 如果客戶端沒有響應,則會發生某種超時,並且將發送一封電子郵件,指出服務器無法訪問客戶端。

這里有一些限制:

  • 我曾嘗試將服務器端事件推送到客戶端,然后客戶端發布以響應其網址。 第一個問題是客戶端只是在等待事件時客戶端會消耗處理器的周期(即使我嘗試使用chrome或firefox之類的瀏覽器,也會遇到相同的問題-在等待時,處理器使用率會上升8%左右)或者)。 另一個問題是,從服務器啟動ARE_YOU_ALIVE的代碼將停滯,客戶端將發布到其他位置/視圖,我必須獲取該信息。 看起來像一場災難正在等待發生。 因此,這種方法被放棄了。

  • 我真的不想使用龍卷風,扭曲等等。現在真的不想在此花費時間。 我的大多數應用程序運行良好,並且不想為這種小功能重新發明輪子。

  • 我堅信正確的方法涉及node.js和socketio,並希望使用它們。 同時,我不是JS忍者,並且想讓django來做繁重的工作。 我喜歡本文解決問題的方式 ,並且具有最少的node.js,並讓django處理邏輯。 但是,問題似乎是node_api(request) (客戶端將在其上發布其響應的位置)將不知道客戶端正在響應哪個ARE_YOU_ALIVE請求。 我真的需要一些簡單的東西,例如:

     client_alive = Get_client_status(client) if client_alive: send_command_to_client(command['INIT_BACKUP'] response = Get_client_status(client) 
    block until response.state == "BACKUP_COMPLETE": response = Get_client_status(client) # need to handle timeout if backup is stuck and will not complete for some reason
    else: timeout? send_email_client_dead()
    人們通常如何處理這種情況是否存在已知模式? 我覺得我在做一些新的事情,但是還沒有遇到任何有關如何完成此工作的文檔。 我將不勝感激。

我建議在這里考慮使用HTTP的幾種選擇。

  1. 直接使用WebSocket進行客戶端和服務器通信。 如果使用Java,則客戶端和服務器端需要使用J2EE 7來支持此功能。 這樣,服務器可以直接向客戶端發送消息。 客戶端可以使用onMessage()之類的東西以事件通知的方式獲取消息。
  2. 使用普通的HTTP,但在HTTP之上建立一個協議。 例如,客戶端將通過每5或10秒將其發布到帶有時間戳的URL來向服務器發送心跳信號。 服務器端具有檢查是否存在某些心跳信號丟失的邏輯,例如在最近連續10次心跳中,右心跳低於50%,這意味着客戶端已死。 或您要在此處設置的任何規則。
  3. 在客戶端創建一個像Jetty這樣的輕量級服務器,以在HTTP上創建一個“實時或不實時”的Restful服務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM