0

我有一个通过互联网(完全独立的网络)连接的 web 应用程序(django/node.js)和一个客户端(不是浏览器,一个使用请求包的控制台应用程序)。预计客户端不会一直处于活动状态,而是会通过不可靠的 Internet 连接连接到 Internet。

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

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

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

以下是一些限制条件:

  • 我已经尝试将服务器端事件推送到客户端,然后客户端发布到 url 其响应。第一个问题是,客户端会消耗处理器上的周期,只是等待一个事件(即使我尝试使用 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()
    人们通常如何处理这种情况是否有已知的模式?我觉得我正在做一些新的事情,但没有遇到任何关于如何完成的文档。我将不胜感激任何指导。

4

1 回答 1

0

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

  1. 直接使用 WebSocket 进行客户端和服务器通信。如果使用 Java,客户端和服务器端需要使用 J2EE 7 来支持这一点。这样,服务器可以直接向客户端发送消息。客户端可以使用类似 onMessage() 的方法以事件通知的方式获取消息。
  2. 使用普通的 HTTP,但在 HTTP 之上创建一个协议。例如,客户端将通过每 5 或 10 秒发布到带有时间戳的 URL 来向服务器发送心跳信号。服务器端有一个逻辑来检查是否有一定的心跳信号丢失,比如最近连续10次心跳低于50%的右心跳,这意味着客户端已经死了。或者你想在这里设置的任何规则。
  3. 在客户端创建一个像 Jetty 这样的轻量级服务器,以在 HTTP 上创建一个“活动或不活动”的 Restful 服务。
于 2013-10-22T00:03:26.140 回答