几天前,我收到了这个问题。要求是设计一个移动应用程序,为用户提供体育内容(比如足球)。该应用程序将允许用户订阅到特定的团队。根据用户的团队选择,应用程序仅在用户的主屏幕上提供与该团队相关的内容。当然,用户可以选择查看所有团队的内容(通过菜单选项)。
特别关注的是用户主页上的内容如何自动刷新,并且还应该考虑用户是否订阅了特定的团队。
对于最后一个问题,我提出了以下两个解决方案:
1)应用程序可以向服务器发送微小的请求,其中只包含用户的标识符,用户的团队选择。根据输入请求中的团队选择,服务器将只返回与团队相关的内容。
2)如果内容数量较少,不同团队的数量较少,则广播所有信息,并让应用程序进行必要的过滤(当然,这与#1相比效率较低)。
在论坛上分享这一点以获得其他可能的设计决策。如果这不是正确的论坛,请在评论中回答,我将在适当的论坛中发布。
谢谢
发布于 2016-05-10 15:15:25
基本上,当你想做一个自动刷新系统时,你只有两种方法:
1:客户端定期发送请求。在以下情况下,这就足够了:
结果不会花费太多
这可以通过在数据库服务器端天真地使用一些查询来实现。当然,如果您需要更高的性能,您可以使用一些中间层。
2:从服务器推送结果:这对于适当的架构来说有点棘手,但这里有一些优点:
wise是最好的clients
然而,限制更重要:
但是因为有比您更多的需求,所以这个架构解决方案存在:这里是Javaworld中最适合您的:
JMS : Java消息服务,是一种面向消息的中间件(MOM)。
JMS是一种具有不同实现的规范,我个人倾向于activeMQ,它是Apache规范。这里有一个关于这方面的主题:Which JMS implementation do you use?
如果您不/不能使用JMS,那么只需记住这一点:Messare-Oriented-Middleware.谷歌应该可以帮助你找到你需要的东西。
发布于 2016-05-06 13:37:51
当然是选项1)。
我们在其他行业开发了类似的东西,在这些行业中,用户有兴趣获得关于不同资源状态的信息。架构是这样的:
现在,考虑到推送通知不能保证投递(尽管总体投递率相当不错),您可能还想实现某种http资源,移动应用程序可以不时轮询以检查是否有针对特定用户的新闻(这是可选的)。
发布于 2016-05-17 12:42:28
你还有第三个选择:
3)遵循发布-订阅模式。
要实现这一点,您可以使用诸如Amazon Simple Notification Service (SNS)之类的系统。首先,您需要设置一个包含API (适用于Android)或私钥和APNS证书(适用于iOS)的平台应用程序。
当用户第一次启动你的应用程序时,应用程序会要求用户授权推送通知访问,联系你的服务器并发送令牌(用于在SNS平台应用程序上注册端点)。
这使您能够向用户设备上运行的应用程序发送推送通知(可以静默处理,也可以显示为有新数据可用的实时通知)。
然后,您可以为每个团队设置主题,给定用户可以选择订阅。当用户选择一个团队时,应用程序会向您的服务器发送一个订阅主题的请求,您可以使用其API将该主题转发给AWS。如果用户想要取消订阅某个主题,您可以再次将此请求转发给AWS。
这使您可以将每个团队的更新发送到适当的主题,并将此信息仅分发给订阅、可伸缩和实时的用户。您的服务器只需ping该主题一次,AWS将处理对每个用户的交付。
当然,您需要实现逻辑来处理通知、订阅、注册等,但它确实允许您的用户实时接收更新。
查看您的选项:
1)最容易实现,对于尚未注册的新安装可能也是必要的。无论采用哪种方式,您都将需要此方法,因此我建议您首先实现此方法。然而,您的服务器将承受与用户成比例的负载,因此当您进行扩展(并使用HTTP缓存,如varnish或squid以最小化计算和数据库负载)时,值得考虑选项3)。
2)没有必要将此信息广播给所有用户,但它是有效的发布-订阅与单个主题(所有用户)。只通知关心的用户会更有效率。
3)这是最具伸缩性的选项,并且具有实时的附加优势。您将能够通知用户更新,即使他们当时没有使用您的应用程序。在发布-订阅架构下,您将能够仅通知与您的信息相关的用户,并且一旦更新,您可以设置一个超时值,以防止用户在XX时间之前从您的服务器进行更新。这样,如果更新比超时值更频繁,用户将永远不需要访问您的服务器。
https://stackoverflow.com/questions/37048754
复制相似问题