当前位置: 首页 > 后端技术 > Java

ToC业务用户弹窗技术解决方案

时间:2023-04-01 14:18:18 Java

现在很多ToC客户端,比如:滴滴,美团,携程等都有很多弹窗,那么如何设计后台更合理,更方便、成本低毛呢布?我这里说的弹窗是指一级页面的弹窗,比如客户端的首页,个人中心页面,订单页面等。这种一级页面是一般负责一个专门的部门,其他业务方需要访问弹窗,需要通过这个部门访问。这里定义了两个角色:接入方是需要在首页和其他页面放置弹窗的业务部门。public,负责主页等公共页面的部门。下面是我们的设计方案:1弹窗后台界面设计1.1弹窗的类型很重要。首先,必须约束弹窗的类型,|序列号|弹窗类型|类型描述||:-|:-|:-||1|单张图片|弹出一张图片,点击图片跳转||2|单身乐透|弹出动图,点击动图或按钮跳转||3|双乐蒂|弹出动图,点击或自动跳转到第二个1动画,点击第二个动画跳转||4|其他弹出窗口1|比如需要前端拼接显示完整图片的类型||5|其他弹窗|一种|1.2弹窗界面设计字段名副字段字段类型描述statusint成功失败状态码messageString成功失败信息数据popNameString弹窗名称,可用于区分弹窗点和弹窗popInfoObject弹窗资源资源,各个不同类型的弹窗中的字段不一致。例如图片弹窗的字段名popInfo字段类型描述imgaeUrlStringimageurlimageWidthint图片宽度imageHeight图片高度jumpUrlString跳转urlpopTypeint弹窗类型其他类型的弹窗可以根据字段需要设计2配置是弹窗的标准类型弹窗需要支持配置,不需要重复开发。支持配置,有两种:一种是大家弹出的弹窗,一种是可以直接配置静态资源。首先是根据各个访问方的情况判断是否显示,弹出资源访问方自行控制。这就需要接入方提供一个接口,这个接口是标准接口。第一种方法比较简单,就不说了。直接说第二种,直接制定标准接口,接入方直接实现即可。统一输入参数,仅供参考,可按需设计:字段名字段类型描述userIdString用户iduserNameString用户昵称deviceIdString设备idlatStringlatitudelonStringlongitude统一输出参数,这里以单图弹窗为例:字段名secondaryfield字段类型Descriptionstatusint成功/失败状态码messageString成功/失败信息dataimgaeUrlString图片urlimageWidthint图片宽度imageHeightint图片高度jumpUrlString跳转地址其他公共字段String埋点等一般字段访问,公共方配置接口地址作为Can的访问方。3变频控制的两种技术方案基本上除部分APP外,所有APP的弹窗都不会无限弹出,需要变频控制,否则可能导致用户体验下降,用户流失.3.1redissetex弹出缓存自动过期。每次用户弹出,他使用redissetex设置过期时间。这个时间是业务允许的最小两次弹窗间隔。关键设计:popName+userId优点:所有弹窗都在后台可控。如果有问题,可操作性强,可以操作redis,解除部分用户的频率控制限制。缺点:需要Redis,增加了架构的复杂度。如果其他功能不需要使用redis,成本会增加。在用户量很大的情况下,比如上亿:redis的key会非常大,对redis造成压力。3.2前端缓存每个弹窗的最后弹出时间。前端存储每个用户弹窗的时间。请求后端时,带上所有弹窗的最后一次弹出时间给后端,后端计算是否在频控时间范围内。新弹窗的弹出时间由后端返回给前端,由前端存储,下次请求时带入后端。优点:不需要额外存储,弹窗最后一次弹出时间存储在用户客户端。架构很简单。问题很容易排查,看请求参数即可。缺点:用户卸载重装客户端时,会丢失数据,频率控制失效;整个变频控制需要前后端配合完成,任何一方出现问题都可能导致功能出现问题。4如何保证异步执行所有弹窗的速度,按顺序返回第一个有数据的弹窗,参考:Reactor多任务并发执行,按顺序返回第一个结果欢迎大家提供更好的实现