基于LiteFlow构建实时会员权益体系

news2024/10/6 22:26:12

知识简介:通过LiteFlow规则引擎构建会员权益体系,实现权益节点可插拔,可编排,可复用的特性。完成会员权益数据底盘建设,将分散的权益数据集中,提升权益查询及管理水平。

历史痛点

    1)不同等级权益列表均为硬编码实现,难以做到权益的动态调整。(顺序,增删);

    2)权益迭代由不同的服务及人员开发,数据分散在不同库中,维护困难;

    3)权益领取状态需调用不同服务请求,响应时长不可控,需建设统一的权益查询归属;

    4)权益列表多接口串行查询,性能差。

建设流程

一、搭建实时权益数据底盘

    构建权益底盘表,实时同步权益领取状态。为校验数据准确性,将原数据源信息同步至BDP,T+1校对数据。

二、基于规则引擎编排权益

    基于规则引擎的开源方式、学习成本、社区活跃度、性能与支持度,权益体系综合考虑使用LiteFlow 作为权益节点编排工具。

  1) 为什么要用规则引擎,跟会员权益的契合点在哪里?

    研发角度:

       · 逻辑复杂 顺丰会员根据会员等级,享有不同的权益项,且根据渠道,时间,权益优先级展示不同的权益列表,其中每项权益又需要校验不同的领取规则,要使用大量if-else来实现或者设计模式。但过于复杂的规则逻辑,使用设计模式也往往是存在大量并且关系复杂的类,导致代码难于维护,对新加入的同学极不友好。

       · 变更时需要从头梳理逻辑,在适当的地方进行if...else...代码逻辑调整,耗费大量时间进行梳理。

       · 开发周期较长,需求发生变更时,需要研发人员安排开发周期上线,对于快速变化的业务,传统的开发工作方式显得捉襟见肘。

    产品角度:

       ·  期望能够实现热部署,对于权益的下线和权益的优先级列表,产品期望可配置式的变更。

       ·  降低需求变动的时间成本,快速验证发布。

  2)会员权益继承规则引擎的两大特性

       · 将瀑布流式的代码,转变成以权益组件为核心概念的代码结构,这种结构的好处是可以任意编排,权益组件与组件之间是解耦的,组件之间的流转全靠规则来驱动。

  3)基于规则引擎构建会员权益

      ·  构建权益组件  将会员权益抽象出来,每项权益定义为一个组件,在组件内将当前权益所需结果数据封装至流程上下文中。

       权益类继承NodeComponent,并通过@LiteflowComponent注解标识权益节点并命名。权益节点校验流程:每项权益需进行权益前置校验(是否满足权益展示条件),权益领取校验,之后构建权益返参上下文,组合流程数据。(升级有礼为例)

            

      ·  权益节点编排。根据权益使用场景、会员等级、权益优先级等,构建不同的权益调用链。会员权益编排涉及两大场景,一是会员首页的会员福利模块,展示当前用户待领取及已领取权益。二是各渠道运营位的弹框,增加会员权益的曝光。

       (1)会员福利模块的权益编排:(不同等级用户调用链上权益组件不同,下图为V7等级调用链及权益组件)

        在权益底盘建设前,为提升接口响应效率,采用多权益并行编排。下图为通过XML中配置THEN+WHEN的方式实现调用链配置。

             

        底盘建设完成后,所有权益领取状态在前置节点查询出来,通过上下文传递到各节点,完成结果数据的拼装。

        

                权益列表前端效果展示:

                     

               

              (2)推荐权益编排:跟权益列表需要走完所有权益组件不同,推荐权益在命中后,会直接走到后置节点组件,装配权益文案及图片流程数据后返回。

            下图为通过XML中配置THEN+FINALLY后置节点方式实现V0用户的调用链,接口调用发现生日有礼还未被推荐过时,则直接跳 转到后置节点(下图虚线权益组件将被跳过),完成生日有礼的文案图片配置,将结果数据返回。

          

        推荐权益前端效果展示(APP会员首页运营位)

                                      

注意事项

1) 并行编排 注意使用线程安全的队列

权益列表上线后,每日会有20个左右的空指针(由于异常被捕获和前端兜底,不会对业务造成影响)

排查异常出现在最终列表排序阶段:

       equityVo.getReceiveEquityLists().stream().sorted(Comparator.comparing(ReceiveEquityVO::getIsToReceive,Comparator.reverseOrder()).thenComparing(ReceiveEquityVO::getSort)).collect(Collectors.toList());

本地模拟调用,发现receiveEquityLists中会有空对象出现,将并发模式修改为串行调用则无此现象。观察receiveEquityLists使用ArrayList实现,在并发编排中线程不安全,修改为CopyOnWriteArrayList后问题解决。

故,在使用并行编排时。注意使用线程安全的队列。例如ConcurrentMap,CopyOnWriteArrayList

2) 内存缓存的配置

推荐权益中使用的文案及图片,均在会员配置表中配置,并使用@Cacheable提供本地缓存能力。测试中需要对某项权益图片进行替换,库中更新后,本地缓存较长时间内并未更新成功。查看原有本地缓存配置项:

caffeine.expireAfterAccess=300

caffeine.refreshAfterWrite=300

更新配置为

caffeine.expireAfterWrite =300

caffeine.refreshAfterWrite=300

配置项说明:

expireAfterAccess为访问过期,即有访问则自动续期

expireAfterWrite 当缓存项在指定的时间段内没有更新就会被回收

refreshAfterWrite 当缓存项上一次更新操作之后的多久会被刷新



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1247251.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Grafana 如何实现雷达图

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》&…

「德州仪器嵌入式技术创新发展研讨会」落幕,飞凌嵌入式携手TI推动技术创新

11月22日,德州仪器嵌入式技术创新发展研讨会(北京站)顺利举行,本次研讨会邀请了众多业界领先的企业和专家到场,飞凌嵌入式作为TI生态伙伴受邀参加,与众多业内伙伴共话嵌入式技术的未来发展趋势。 在本次研…

Pix2Pix 使用指南:从原理到项目应用

Pix2Pix Pix2Pix 介绍:使用条件 GAN 进行图像到图像的转换Pix2Pix 原理Pix2Pix 模型结构生成器:Unet结构判别器:PatchGAN目标函数 Pix2Pix 项目使用 Pix2Pix 介绍:使用条件 GAN 进行图像到图像的转换 Pix2Pix 论文:ht…

安防系统智能视频监控中出现画面异常该如何自检?

大家都知道,在当今社会,摄像头无处不在,除了常见的生活与工作场景中,在一些无法人员无法长期驻点场景,如野生动物监测、高空作业监控、高压电缆监控等场景,在这些地方安装摄像头就是为方便日常监控。但是由…

leaflet对线设置渐变色

效果展示: 引用leaflet-polycolor组件 npm install leaflet-polycolor .vue文件中使用 import leafletPolycolor from leaflet-polycolor; leafletPolycolor(L); const latLngs = [[37.03, 111.92], [37.53444, 111.98555], [36.88, 112.12], [37.53444, 112.24], [36.88, 1…

node-red - 节点实战总结1

node-red - 节点实战总结1 二、功能2.1 循环(for\while) 三、网络四、序列五、解析六、存储七、协议7.1 modbus协议7.2 opcua 八、formats8.1 时间格式化与时区转换 二、功能 2.1 循环(for\while) 安装节点node-red-contrib-loop-processing,该节点支持三种方式的循环&#xf…

Linux:配置Ubuntu系统的镜像软件下载地址

一、原理介绍 好处:从国内服务器下载APT软件,速度快。 二、配置 我这里配置的是清华大学的镜像服务器地址 https://mirrors.tuna.tsinghua.edu.cn/ 1、备份文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak2、清空sources.list ec…

openEuler 22.03 LTS x86_64 cephadm 部署ceph 16.2.14 未完成 笔记

环境 准备三台虚拟机 10.47.76.94 node-1 10.47.76.95 node-2 10.47.76.96 node-3 下载cephadm [rootnode-1 ~]# yum install cephadm Last metadata expiration check: 0:11:31 ago on Tue 21 Nov 2023 10:00:20 AM CST. Dependencies resolved. Package …

【python入门篇】函数(6)

这一节将详细介绍Python中函数的用法,包括函数的定义、调用、参数、返回值、作用域等。 函数的概述: Python函数是一种封装了特定任务的可重用代码块。通过将程序分解为更小、更具体的任务,函数提供了一种有效的方式来组织和管理代码&#xf…

社交媒体广告数据采集:Jsoup 的最佳实践

搜狐是中国领先的综合门户网站之一,广告在其网站上广泛投放。为了了解搜狐广告的策略和趋势,采集和分析搜狐广告数据变得至关重要。但是,搜狐网站的广告数据通常需要通过网页抓取的方式获取,这就需要一个强大的工具来解析和提取数…

教师编制缩减

近年来,教师编制缩减成为了老师们备受关注的话题。各国为了优化教育资源,提高教育质量,纷纷开始对教师编制进行调整。 一、教师编制缩减的背景 教师编制缩减的背景主要源于两个方面:一是人口变化趋势,二是教育资源的优…

flutter编译和构建鸿蒙应用程序(windows环境)

flutter编译和构建鸿蒙应用程序(windows环境) 问题背景 针对 OpenHarmony 的 Flutter 版本已经开源,参考 https://gitee.com/openharmony-sig/flutter_flutter。 本文为实践该流程,实现flutter打包鸿蒙hap包的流程。目前流程已经…

通达信沙夫趋势周期指标(STC)选股公式,结合了MACD和KDJ的原理

沙夫趋势周期指标(Schaff Trend Cycle,简称STC)是由道格舒夫(Doug Schaff)发明的技术分析工具,用于识别股票、期货或外汇市场中的趋势。STC指标巧妙结合了MACD和KDJ的原理,相当于增强版的震荡指…

三分钟快速理解 ChatGPT 背后的大模型技术

在过去的十年中,人工智能领域取得了重大突破,其中自然语言处理(NLP)是其重要子领域之一。NLP使用的模型之一是大型语言模型(LLMs)。LLMs被设计用于处理大量文本数据,采用先进的神经网络架构&…

工业级5G路由器:稳定性更高,网络速度更快!

随着5G技术的发展,5G路由器也越来越受到人们的关注。特别是工业级5G路由器,它的应用范围更广,稳定性更高,网络速度更快,已成为许多企业和工业领域的必备选择。 一、工业级5G路由器的特点 工业级5G路由器具有很多独特的…

浅谈 Binius:用 Rust 实现的硬件优化 SNARK 协议

作者:Ulvetanna 团队 编译:TinTinLand 原文链接:https://www.ulvetanna.io/news/binius-hardware-optimized-snark 在一篇新的研究论文中,零知识证明技术开发团队 Ulvetanna 展示了一种基于二进制域塔 (Towers of Bi…

【2021研电赛】多路超高清摄像头控制器设计|HDC队

本作品介绍参与极术社区的有奖征集|分享研电赛作品扩大影响力,更有重磅电子产品免费领取! 1.作品简介 超高清摄像头广泛应用于各个领域,越来越多的应用场景需要多摄像头协同工作。然而,市面上现有的摄像头往往采用单个镜头,缺少…

深入理解 Django 中的事务管理

概要 在数据库操作中,事务是确保数据完整性和一致性的关键机制。Django 作为一个强大的 Python Web 框架,提供了灵活而强大的事务管理功能。理解和正确使用 Django 中的事务对于开发高质量的 Web 应用至关重要。本文将深入探讨 Django 的事务管理机制&a…

一起学docker系列之八使用 Docker 安装配置 MySQL

目录 前言步骤 1:拉取 MySQL 镜像步骤 2:运行 MySQL 容器步骤 3:检查容器状态步骤 4:进入 MySQL 容器步骤 5:配置 MySQL 字符编码步骤 6:重启 MySQL 容器步骤 7:测试字符编码步骤 8:…