我目前正在设计一个iOS应用程序(使用MonoTouch),该应用程序将在Windows Azure上运行服务器组件。该应用程序本质上是一种聊天类型的应用程序,用户将在其客户端内生成消息并将其发送到服务器,然后服务器需要尽快将这些消息转发给用户发送消息的其他客户端。
我的问题是 - 有没有推荐的做法来设计这样的应用程序,其中客户端需要从服务器接收“推送”消息?
我考虑了一些选项,但希望得到反馈。
第一种选择是使用Apple的推送通知服务(APNs)。我对此有两个顾虑-首先,客户端只需要在在线时接收消息(APNs也会在应用程序关闭时发送消息,但我不需要或不想要);其次,可能会有大量消息,我知道苹果可能会对此感到不满(完全合理)。
我考虑的第二个选项是使用基于WCF的Web服务,并让客户端每隔(比如)2-3秒钟调用此服务,这是我们可以容忍的最大延迟。虽然这似乎涉及大量潜在的不必要网络流量(“你有什么东西给我吗?”,“没有”,反复出现)。
第三个选项是在客户端和服务器之间维护持久的Web服务连接。当客户端应用程序启动时,它将在后台线程上调用Web服务方法。服务器将保持连接处于打开状态(通过不返回任何内容),如果有任何消息传递,则会立即返回它们。此连接可能会在2分钟后超时,然后重新建立。这似乎可以实现我的目标,但是我担心在任何时刻都可能向服务器打开大量连接,这可能需要不必要的服务器资源。
第四个选项是使用TCP上的持久连接(或UDP,尽管从我所发现的情况来看,Windows Azure不支持此功能)。这似乎是一个不错的选择,但在服务器使用方面可能过度 - 可能会有数百甚至数千个客户端随时连接着。
第五个选项是以某种方式直接将服务器推送消息到客户端,例如通过让客户端运行迷你Web服务器或类似的东西。但是,由于该应用程序将在3G和WiFi网络上运行(超出我的控制范围),因此我不认为传入端口将对此类事情开放。
如果有人有其他建议,或者认为上述选项之一是一个好主意(或是解决此类问题的标准方法),我将非常感兴趣。
提前致谢,
约翰
我的问题是 - 有没有推荐的做法来设计这样的应用程序,其中客户端需要从服务器接收“推送”消息?
我考虑了一些选项,但希望得到反馈。
第一种选择是使用Apple的推送通知服务(APNs)。我对此有两个顾虑-首先,客户端只需要在在线时接收消息(APNs也会在应用程序关闭时发送消息,但我不需要或不想要);其次,可能会有大量消息,我知道苹果可能会对此感到不满(完全合理)。
我考虑的第二个选项是使用基于WCF的Web服务,并让客户端每隔(比如)2-3秒钟调用此服务,这是我们可以容忍的最大延迟。虽然这似乎涉及大量潜在的不必要网络流量(“你有什么东西给我吗?”,“没有”,反复出现)。
第三个选项是在客户端和服务器之间维护持久的Web服务连接。当客户端应用程序启动时,它将在后台线程上调用Web服务方法。服务器将保持连接处于打开状态(通过不返回任何内容),如果有任何消息传递,则会立即返回它们。此连接可能会在2分钟后超时,然后重新建立。这似乎可以实现我的目标,但是我担心在任何时刻都可能向服务器打开大量连接,这可能需要不必要的服务器资源。
第四个选项是使用TCP上的持久连接(或UDP,尽管从我所发现的情况来看,Windows Azure不支持此功能)。这似乎是一个不错的选择,但在服务器使用方面可能过度 - 可能会有数百甚至数千个客户端随时连接着。
第五个选项是以某种方式直接将服务器推送消息到客户端,例如通过让客户端运行迷你Web服务器或类似的东西。但是,由于该应用程序将在3G和WiFi网络上运行(超出我的控制范围),因此我不认为传入端口将对此类事情开放。
如果有人有其他建议,或者认为上述选项之一是一个好主意(或是解决此类问题的标准方法),我将非常感兴趣。
提前致谢,
约翰