如何构建一个需要与客户端进行双向通信的django应用程序

时间:2013-10-17 22:17:48

标签: python django node.js architecture

我有一个webapp(django / node.js)和一个通过互联网连接的客户端(不是浏览器,使用请求包的控制台应用程序)(完全独立的网络)。预计客户端不会永远存在,将通过不可靠的互联网连接连接到互联网。

我需要一些关于构建应用程序的建议,系统应该执行以下操作:

  1. 我需要能够从服务器将数据推送到客户端,当发生这种情况时,客户端将根据收到的数据更新其本地MSSQL数据库,并向服务器确认数据更新是成功的(即双向沟通)

  2. 服务器还可以询问客户端是否处于活动状态....如果客户端处于活动状态,客户端将响应,并将其用作监视状态客户端的心跳。如果它处于活动状态,则服务器可以要求客户端启动一个长进程(例如,开始备份其数据库并上传)。如果客户端没有响应,则会出现一种超时,并且会发送一封电子邮件,说服务器无法访问客户端。

  3. 以下是一些限制因素:

    • 我已尝试将服务器端事件推送到客户端,并且客户端发布了url其响应。第一个问题是,客户端会在处理器上消耗周期而只是为了一个事件(同样的问题,即使我尝试使用像chrome或firefox这样的浏览器 - 当它等待时,处理器使用率的百分比上升到8%左右或者)。另一个问题是从服务器踢出ARE_YOU_ALIVE的代码将停止,客户端将发布到不同的位置/视图,我必须获取该信息。看起来像是等待发生的灾难。所以这种做法被放弃了。

    • 我真的不想使用龙卷风,扭曲等。真的不想在此为此投入时间。我的大部分应用都运行良好,并且不想为这个小功能重新发明轮子。

    • 我确信正确的方法涉及node.js和socketio,并且想要使用它们。与此同时,我不是JS忍者,而且想让django做重任。我喜欢this article solves the problem,并且有最小的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()
      关于人们通常如何处理这种情况,是否存在已知模式?我觉得我正在做一些新的事情,但是没有遇到任何关于如何做到这一点的文档。我将不胜感激任何指导。

1 个答案:

答案 0 :(得分:0)

我建议在这里考虑几个选项,如果坚持使用HTTP。

  1. 直接使用WebSocket进行客户端和服务器通信。如果使用Java,客户端和服务器端需要使用J2EE 7来支持这一点。这样,服务器可以直接向客户端发送消息。并且客户端可以使用类似onMessage()的方式以事件通知方式获取消息。
  2. 使用普通HTTP,但在HTTP之上制作协议。例如。客户端将通过每隔5或10秒发布一个时间戳的URL向服务器发送心跳信号。服务器端有一个逻辑来检查是否存在某些心跳信号丢失,比如在最近的连续10次心跳中右心跳低于50%,这意味着客户端已经死亡。或者你想在这里设置什么规则。
  3. 在客户端创建一个像Jetty这样的轻量级服务器,以在HTTP上创建“实时与否”Restful服务。