假设我有两个应用程序,它们必须在一定程度上协同工作。

  1. Web 应用程序(PHP、Ruby on Rails...)
  2. 桌面应用程序(Java、C++...)

桌面应用程序必须从 Web 应用程序收到通知,并且发送和接收通知之间的延迟必须很短。(< 10 秒)

有哪些可能的方法可以做到这一点?我可以考虑以 10 秒的间隔进行轮询,但如果必须通知许多桌面应用程序,这会产生大量流量。在 LAN 上我会使用 UDP 广播,但不幸的是这在这里不可能......

我很感激你能给我的任何想法。

有帮助吗?

解决方案

我认为这里的“最佳实践”将取决于您期望服务的桌面客户端的数量。如果只有一个桌面需要通知,那么轮询很可能是一种很好的方法 - 是的,轮询比基于事件的通知开销要大得多,但它肯定是最容易实现的解决方案。

如果轮询的开销确实不可接受,那么我会看到两种基本的替代方案:

  1. 保持桌面和 Web 服务器之间的持久连接打开(可以是“comet”式 Web 请求,或原始套接字连接)
  2. 从桌面应用程序中公开服务,并向 Web 服务器注册该服务的地址。这样,网络服务器就可以根据需要调用桌面。

但请注意——这两种选择都充满了陷阱。几个亮点:

  • 保持连接打开可能很棘手,因为您希望网络服务器可热插拔
  • 从 Web 服务器调用外部服务(例如您的桌面)是危险的,因为此请求可能会挂起。您希望将此通知移至单独的线程,以避免占用网络服务器。

为了减轻一些问题,您可以通过引入中间通知服务器将不可靠的桌面与 Web 服务器解耦——Web 服务器可以在某处发布更新,而桌面可以在那里轮询/连接/注册以获得通知。为了避免在这里重新发明轮子,这可能涉及某种 MessageQueue 系统......当然,这增加了维护新中介的复杂性。

同样,所有这些方法可能都非常复杂,所以我认为轮询可能是最好的选择。

其他提示

我可以看到两种方法:

  • 您的桌面应用程序轮询网络应用程序
  • 您的 Web 应用程序通知桌面应用程序

您的 Web 应用程序可以发布 RSS 提要,但您的桌面应用程序仍然必须每 10 秒轮询一次提要。

流量不必很大:如果您使用 HTTP 请求,您将收到一个小数据包,其中包含上次修改的日期(方便地命名为 上一次更改).

我不知道该怎么做才能完成您的任务,但我可以建议在桌面应用程序PC上创建一个Windows服务。

此服务会在每个时间间隔检查Web应用程序以进行新的更改,如果发生更改,它可以运行桌面应用程序,并通知Web应用程序和Web应用程序中的更改,如果发生任何更改,您可以响应确认

我希望这可能有用我没有完全尝试,但我建议使用这样的想法。

一个联合层将有助于扩展系统。

桌面应用可以使用<!> quot; publisher <!>注册自己。 service(在多台/多台计算机之一上运行)此发布服务接收<!> quot; notice <!> quot;从您的网络应用程序中发生了一些变化,并立即开始通知所有注册用户。

您需要的发布商数量会随着用户数量的增加而增加。

编辑:忘记提及桌面应用需要监听套接字。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top