繁体   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