问题的
我们的iphone应用程序允许用户向商家付费并赚取报酬。
用户也可以这样做:
由于可用的交易或奖励、事务历史记录和引用在任何时候都可能发生变化,所以我们在用户的设备上有一个经典的缓存失效问题。
我们当前的体系结构是相当标准的,并且包含诸如"/merchants“、"/rewards”、"/transactions“、"/deals”等API内点。
我们目前通过以下方法解决陈旧的缓存问题:
我们使用etags来避免重新发送未修改的数据(例如,整个商家列表),但是我们目前的方法仍然浪费了大量的带宽。例如,如果一个商人改变了,所有的商人都会感到不满。如果添加了单个新事务,则所有事务都将重新启动。
在实践中,从用户的角度来看,这通常不是什么大问题,因为我们谈论的是1到200 K的最大尺寸,而且通常更少。然而,在手机接收能力差的地区,这可能是一个问题,这种情况经常出现,以至于我们听到投诉。
在服务器端,所有这些轮询都会产生大量不必要的负载,特别是因为即使etags不变,也会发生处理和数据库查询,
我们正在重新设计应用程序和服务器代码,并考虑其他策略。由于这是一个相当常见的问题,我想知道其他人是如何解决的。
我到目前为止有一些想法:
现在,我倾向于2而不是1,因为1似乎充满了问题。我对在手机上依赖websockets有一些担忧,但在这里、在SO和其他地方做了研究之后,这种担心似乎是不成立的。
我很想听听其他可能完全不同的解决这些问题的建议。
发布于 2015-12-30 20:58:45
因为它是一个本地应用程序,如果你愿意的话,你可以完全避开HTTP。
您可以使用HTTP/2.0,它允许流。流是线头阻塞(HOL)阻塞的部分解决方案,允许多个请求共享单个TCP连接,并以增量和一致的方式交付。它还允许一些服务器发起的通信.它仍然是TCP,所以它不是HOL阻塞的完整解决方案。
您可以使用WebRTC,它使用DTLS来完全避免HOL阻塞,并有效地启用服务器或对等事件。
对于这种用例,我倾向于避免HTTP,因为它给应用程序数据请求流设置了人为的和毫无同情心的约束。这在浏览器中是必需的,但在应用程序中则不然。HTTP的优势是为所有基于broswer、桌面和移动应用程序的客户端提供单一的服务界面,尽管如此,我们可以放心地接受它。
您可以在端口443上使用基于TLS的AMQP (类似于RabbitMQ),并通过其消息队列进行基于事件的通信。后端服务会将更新推到队列中,或者中间更新程序服务将调用REST服务并更新它们。在TCP级别,这仍然会受到HOL阻塞的影响。
另一种选择是ZeroMQ和CurveZMQ。这也是一种面向消息的解决方案,但您不需要像AMQP这样的独立的中央代理。您的应用程序可以通过消息直接与您的服务器对话。您的服务器可以执行REST轮询和状态管理,并尽可能频繁或不频繁地将更新推送到客户端。这允许在失败情况下优雅地退化。这是最灵活的,也可以说是最精简的选项,但是TCP也是如此,所以不能完全避免HOL阻塞。
值得的是,HOL阻塞不太可能接近您当前的问题,解决它需要重大的妥协。
https://softwareengineering.stackexchange.com/questions/306061
复制相似问题