一、开篇之前
红包作为提高在整58APP平台上,对于提升用户留存,引流用户到第三方平台起到非常重要的作用,58APP融合了多个第三方的红包数据,为各个第三方提供入口,红包数据直接同用户的经济利益有直接关系;同时,直接关系到第三方平台的利益,因此对该服务的实时、准确、一致性,以及稳定性有很高的要求。
该项目存在于58APP生态系统中,最终为用户呈现的效果如下图所示:
用户在获得新的红包之后,在个人中心我的红包ICON上显示小红点,作为用户红包数据变更提醒。用户在点击ICON之后,进入红包列表页查看红包后,个人中心红包ICON红点消失,即用户已查看红包数据。
在项目的使用场景上,58APP个人中心用户红包模块需要对接多个第三方的红包平台数据,将多平台红包数据整合到58APP的信息平台上进行多方数据源的数据整合。
二、我们需要考虑的问题
在整个红包项目的设计中需要考虑如下问题:
1、如何防止本方服务不被多个依赖服务拖慢以及依赖服务宕机所导致的本方服务拖垮。
在大中型分布式系统中,通常系统很多依赖(HTTP,Netty,Dubbo等),如下图:
上图中红色代表服务存在大量依赖失败,绿色表示服务正常,在高并发访问下,这些依赖的稳定性与否对系统的影响非常大,但是依赖有很多不可控问题:如网络连接缓慢,资源繁忙,暂时不可用,服务脱机等。
在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败,在某个服务节点产生宕机后,其它依赖仍然可用的情况下。高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险。
因此在整个的项目技术架构上,我们使用了Hystrix框架,对所有依赖的的第三方服务调用进行了异步调用,并且使用了线程隔离机制,当依赖服务发生大量异常、响应超时,不可用等情况,上层服务会自动进行线程熔断同第三方服务进行物理隔离,进行方案降级。当第三方服务响应正常可用的情况下,上层服务会自动切换回主线程继续调用第三方服务,避免上述依赖造成的风险。
2、多平台多个第三方数据不在当前项目中如何保证数据实时准确。
整个项目中,由于数据分散在多个第三方,为了保证数据实时准确一致,因此在项目中不建议使用缓存策略去存储第三方数据,因为一份数据源存储在多个节点中就会存在数据不一致的问题,因此对于红包这种实时性较高的数据我们需要依赖于第三方接口的实时提供。
在数据交互的过程中,另一个问题就是在获取依赖服务数据是采用推送还是拉取来获得最终的数据。
在APP中对于APP的消息推送通常我们会使用诸如JPush极光推送、腾讯信鸽推送、小米公司的米PUSH等第三方推送平台第三方的推送平台,但是这种第三方的推送需要在客户端和服务端维护一个或多个长连接,保证服务端与客户端的消息推送,这种长连接的保持一般会在设计上存在如下的问题:
2.1、客户端如何持续保持与服务端的长连接。
·也就是心跳机制,在WIFI,2G,3G,4G环境下的心跳间隔,额外触发心跳的机制(切换网络环境)
·心跳机制是主要影响app耗电的一个问题
·Android上的定时机制,AlarmManager和Timer的区别
2.2、服务端缓存离线客户端的消息机制
·客户端难免有时会离线,登出,服务端应该如何缓存客户端的信息,缓存多少等等。
2.3、服务器宕机后,重新启动后大量客户端同时连接客户端(雪崩效应)的解决方案。
如果我们想要高数据一致性和高网络性能,我们就应该选择推送方式。但是,推送会带来一些扩展性问题;服务器应用程序CPU使用率是拉取方式的7倍。根据实际测评的结果,服务器性能会在-个用户时趋于饱和。对于更大数量的用户,负载均衡和服务器集群技术就在所难免了。使用拉取方式,要想达到完整的数据一致性以及很高的网络性能是很困难的。如果拉取的时间间隔大于数据更新的时间间隔,就会发生一些数据的遗失。而如果小于数据更新的时间间隔,网络性能就会受到影响。拉取方式只有在拉取时间间隔等同于数据更新时间间隔时,才会恰到好处。但是,为了达到那样的目标,我们就需要提前知道准确的数据更新时间间隔。
然而,数据更新的时间间隔很少是静态不变并可以预知的。这使得拉取方式只有在数据是根据某种特定模式发布的情况才有用。
因此对于APP而言,在APP内部的ICON的小红点的设计上,我们一般要尽可能的减少对这种消息推送产生的长连接的使用。并且服务依赖于多个第三方平台,考虑后期拓展很难保证多个第三方统一使用相同的第三方推送平台,为了保证后期更多平台的拓展,最终放弃这种异构消息推送方案,最终选择基于用户行为的同步数据调用的方式实现该功能呢。
3、功能上红点的显隐控制受多个平台的数据同步影响。
在这个问题上我们采取了多服务异步调用,即多个第三方服务采用异步调用,只要有满足数据变动条件立即返回,不等待未执行完的红包数据,最终数据呈现由拉取服务中第一个满足条件的数据标记红点是否显示。
4、对于整个服务如何解决数据的高吞吐序列化产生的CPU过多计算产生的影响
项目使用Velocity模板,将最终接口数据中放回结构中固定不变的内容抽取出来,将其序列化之后的结果提前存放在一个静态资源文件中,这样整个用户中心首页中的ICON列表数据在后台代码中只需要控制一些依赖于服务和业务场景下需要变动的字段,开发者在编码的过程中不必国庆节,来衢江品尝国家元首套餐ACR2010年关于纤维肌痛综合征的诊断