基于通用jar、动态配置、组件编排的会员任务中心系统设计
# 一、聊聊本文想说什么:
为更好帮助商家的会员快速成长,保持用户活性,完善用户的成长体系,有赞用户中心-会员成长团队基于现有的业务场景,设计了一套较完备任务中心系统。同时也有很多通用技术组件能够落地。接下来本文会简单分享下这些常用的技术组件,抛砖引玉。
在开始之前我们会先提几个问题:
* 1.任务中心对于普通商户有什么用处?
* 2.如何实现任务中心,做到快速接入,扩展性好?
* 3.有哪些技术可以结合任务中心一起落地?
## 1.1 我们内部的一些黑话
[![eToqXD.png](https://img2018.cnblogs.com/blog/1812065/201909/1812065-20190920141800149-1767496679.png)](https://imgchr.com/i/eToqXD)
#二、为什么要做任务中心?
## 2.1 任务中心的出发点:
- a、用户激活:提升用户体验,增加客户活跃,方便商户进行用户信息采集,完善自己的信息网。
- b、提高留存:引导客户每日参与任务,通过会员体系+积分成长值奖励,提高用户粘性。
- c、提高用户复购和客单价:设置购买任务和结合积分购买等特权。
- d、老带新传播:通过拉新任务或者拼团任务等活动,持续拉新。
## 2.2 任务中心的目标:
[![eToH1K.png](https://img2018.cnblogs.com/blog/1812065/201909/1812065-20190920141801411-1096986630.png)](https://imgchr.com/i/eToH1K)
- B端: 商户可视的任务配置中心,方便管理控制任务。
- C端:用户领取完成任务,异步或同步处理完成,提供:定时任务、阶段任务。
- 接入、使用方:快速可视化接入,任务完成回执简单。
- 系统本身:对于新任务接入,可拓展性,尽量保证主流程改动最小。
# 三、我们是如何实现的?
## 3.1 我们的技术方案
我们从现有的业务体系中,剥离出B端的配置中心和C端的任务处理中心,集合一些常用的系统组件,尽量做到接口原子化,可编排、能力内聚;在结合通用工具jar,是业务系统接入足够快速;同时设置了平台型通用配置,使用基于apollo的动态加载配置信息到本地缓存,达到不用发布应用,就可以快速接入新任务。
[![eTo7p6.png](https://img2018.cnblogs.com/blog/1812065/201909/1812065-20190920141802450-521670273.png)](https://imgchr.com/i/eTo7p6)
## 3.2 如何串联平台、商户、用户?
有赞虽然是一家saas公司,但是在有赞内部平台、商户、用户的概念是都有维护的,可以说三者相辅相成,不会独立出现。
* 1.平台侧可以通过后台系统快速接入,给产品同学进行审批和配置落地。
* 2.商户端可以在页面,快速配置任务信息和任务奖励。
* 3.给业务方提供多种任务快速接入方式,通用的任务调度完成以及商户维度的通用奖励发放能力。
[![eTob6O.png](https://img2018.cnblogs.com/blog/1812065/201909/1812065-20190920141804120-1315732110.png)](https://imgchr.com/i/eTob6O)
## 3.2 我们还提供了哪些能力?
[![eToofx.png](https://img2018.cnblogs.com/blog/1812065/201909/1812065-20190920141805041-381961717.png)](https://imgchr.com/i/eToofx)
## 3.3 任务的常用状态
通用的合理的状态流转,可以快速定位区分C端用户的任务完成情况,失败和终止的业务可以依赖定时任务做任务完成重放,快速推进到完结,并发放奖励,规避异常给用户带来的奖励信息不同步的问题,保证系统内的一致性。
[![eToOne.png](https://img2018.cnblogs.com/blog/1812065/201909/1812065-20190920141805672-1496710867.png)](https://imgchr.com/i/eToOne)
# 四、我们使用了哪些核心技术组件
## 4.1 幂等控制组件
### 4.1.1 为什么要要使用幂等组件
在任务中心落地中,很多场景需要控制任务的唯一幂等,多次发放不会重发等等。之前我们主要是通过db幂等表,插入业务唯一索引来保证幂等,但是需要数据库的事务保证,即幂等流水和业务要一起提交,失败即回滚。当使用到多库的场景时,业务系统每个库都要增加一张流水表,并且控制本分片内业务id和分片id一致,比较繁琐。
还有一部分内部系统使用分布式存储(比如redis),来保存业务请求记录。服务端在接收到请求后,用原子性的查询和保存操作(比如redis的setnx命令),来保证业务唯一流水落到存储中,在业务设置的超时时间前,控制业务流水的幂等。当发现重复流水时,按照一定的策略返回。
在任务中心系统落地时,同时保留了两种模式,并且还要考虑接入方依赖的存储的拓展性和快速接入。
### 4.1.2 幂等组件的规则
* 幂等使用支持注解方式快速接入+spEL表达式拼接幂等入参信息。
* 基于apollo的动态配置推送。
* 幂等存储策略:
* 1.缓存redis存储(优先)2.mysql存储 等
* 幂等拒绝策略:
* 1.多次返回相同结果 2.返回幂等码 3.抛出异常 等
### 4.1.3 幂等组件的设计
通过基础的工具jar包,承载整个幂等组件逻辑,达到快速接入的目的,通过apollo可以动态推送相关配置,达到业务系统快速切换分支,随时线上应急。
[![eToX0H.png](https://img2018.cnblogs.com/blog/1812065/201909/1812065-20190920141806245-849798240.png)](https://imgchr.com/i/eToX0H)
## 4.2 集成了通用缓存能力流程编排组件
由于多个任务中,很多基础组件能力都可以直接复用。比如发放奖励中:发放成长值、发放积分、优惠券等等,很多任务都有相同的逻辑,为了达到无需重复开发,新任务快速接入的目的。
我们开发了一套基于db+xml配置流程编排引擎,可以快速编排已有逻辑,减少重复开发工作。
编排还提供的基础能力:
* 1.持续开发基于热加载的模板动态加载机制。进一步增加流程的动态可配置能力。
* 2.同时在通用模板中,实现了缓存通用逻辑以及热点缓存功能,在大促或者商家有营销活动时,任务中心也可以稳定支持。
[![eToj7d.png](https://img2018.cnblogs.com/blog/1812065/201909/1812065-20190920141807857-1720699062.png)](https://imgchr.com/i/eToj7d)
## 4.3 动态配置变更组件
目前很多基础配置都是通过依赖配置文件,或者apollo的动态配置。
但是这两种方式都是有一定优缺点的:配置文件的方式,虽然存储容量没有限制,但是配置变更后,需要重启应用,比较复杂。而apollo开关的方式虽然可以动态变更,但是存储的配置信息很少,有一定长度限制。对于任务中心这种多任务平台型的配置,有一定影响。
所以最后使用了基于jvm+apollo的延时加载的策略,即保证了不用频繁发布,同时可以动态变更配置信息。
## 4.4 独立的异步日志流水记录
传统的同步日志记录,占用系统资源,并且由于任务中心的特性,C端任务完成流水信息会很多。 所以任务中心落地时转化为日志的异步流水事件,由单独的日志系统提供日志采集、上传、可视化、检索等通用能力。
# 五、未来,我们还在砥砺前行:
本着可视化、配置化的原则,为了让外围接入更容易,同时减少内部开发量的原则。接下来我们还会去继续完善系统:
* 1.任务中心运维产品化(在建中):单独开发的一套产品层应用,使用可视化的页面后台管理。方便业务接入和日常运维。可以独立通过页面完成配置+上线。
* 2.基于回调和配置的扩展点+流程共建(在建中):通过扩展点共建方式,将流程编排的能力,暴露给内外部的开发者,完成任务中心的共建。
有你有赞,未来可期(附内推邮箱:sunchang@youzan.com,欢迎加入有赞业务中台-用户中心)
预览
基于通用jar、动态配置、组件编排的会员任务中心系统设计的更多相关文章
- 实战:基于 Spring 的应用配置如何迁移至阿里云应用配置管理 ACM
最近遇到一些开发者朋友,准备将原有的Java Spring的应用配置迁移到 阿里云应用配置管理 ACM 中.迁移过程中,遇到不少有趣的问题.本文将通过一个简单的样例来还原迁移过程中遇到的问题和相关解决 ...
- 基于.net的通用内存缓存模型组件
谈到缓存,我们自然而然就会想到缓存的好处,比如: 降低高并发数据读取的系统压力:静态数据访问.动态数据访问 存储预处理数据,提升系统响应速度和TPS 降低高并发数据写入的系统压力 提升系统可用性,后台 ...
- 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性
基于.net的分布式系统限流组件 在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...
- .NET Core的响应式框架,基于Ace Admin框架菜单导航,Bootstrap布局,fontAwesome图标,内嵌Iframe用EasyUI做数据绑定,动态配置列表,动态配置表单
netnrf 响应式框架 用于快速开发的响应式框架 演示:https://rf2.netnr.com v3.x 前端采用 jQuery + Bootstrap + EasyUI + AceAdmin ...
- spring基于通用Dao的多数据源配置详解【ds1】
spring基于通用Dao的多数据源配置详解 有时候在一个项目中会连接多个数据库,需要在spring中配置多个数据源,最近就遇到了这个问题,由于我的项目之前是基于通用Dao的,配置的时候问题不断,这种 ...
- 基于JMX动态配置Log4J日志级别
先来看比较low的修改日志级别的方式,在写程序里面. http://blog.gssxgss.me/java%E8%BF%90%E8%A1%8C%E6%97%B6%E5%8A%A8%E6%80%81% ...
- 基于Django+celery二次开发动态配置定时任务 ( 二)
一.需求 结合上一篇,使用djcelery模块开发定时任务时,定时任务的参数都保存在djcelery_periodictask表的args.kwargs字段里,并且是json格式.那么,当定时任务多了 ...
- spring基于通用Dao的多数据源配置
有时候在一个项目中会连接多个数据库,须要在spring中配置多个数据源,近期就遇到了这个问题,因为我的项目之前是基于通用Dao的,配置的时候问题不断.这样的方式和资源文件冲突:扫描映射文件的话,Sql ...
- 【架构篇】ASP.NET Core 基于 Consul 动态配置热更新
背景 通常,.Net 应用程序中的配置存储在配置文件中,例如 App.config.Web.config 或 appsettings.json.从 ASP.Net Core 开始,出现了一个新的可扩展 ...
随机推荐
- Linux 中如何查询端口被占用的情况
Linux如何查看端口 1.lsof -i:端口号 用于查看某一端口的占用情况,比如查看8000端口使用情况,lsof -i:8000,如下图 可以看到8000端口已经被轻量级文件系统转发服务lwfs ...
- MySQL--单表查询、多表查询简单概述
表的前期准备: create table emp( id int not null unique auto_increment, name ) not null, sex enum('male','f ...
- Java面向对象特性总结
1.面对对象与面对过程的区别 什么是封装?我看到过这样一个例子: 我要用洗衣机洗衣服,只需要按一下开关和洗涤模式就可以了.有必要了解洗衣机内 部的结构吗?有必要碰电动机吗?有必要了解如何通电的吗? 如 ...
- 纯数据结构Java实现(5/11)(Set&Map)
纯数据结构Java实现(5/11)(Set&Map) Set 和 Map 都是抽象或者高级数据结构,至于底层是采用树还是散列则根据需要而定. 可以细想一下 TreeMap/HashMap, T ...
- 基于HttpClient4.5.1实现Http访问工具类
本工具类基于httpclient4.5.1实现 <dependency> <groupId>org.apache.httpcomponents</groupId> ...
- SpringBoot:elasticSearch 7.2.0 Java High Level REST Client 搜索 API
Springboot整合最新版elasticSearch参考之前的文章:SpingBoot:整合ElasticSearch 7.2.0 Search API SearchRequest用于与搜索文档, ...
- 渗透之路基础 -- 跨站脚本攻击XSS
目录 漏洞原理及防御 XSS 原理分析:输出问题导致js代码被识别执行 XSS 技术分类 Cookie盗取 基于Xss的WebShell箱子的攻击 XSS相关防护过滤及绕过分析(参考链接) 防护: 绕 ...
- HandlerMethodArgumentResolver(二):Map参数类型和固定参数类型【享学Spring MVC】
每篇一句 黄金的导电性最好,为什么电脑主板还是要用铜? 飞机最快,为什么还有人做火车? 清华大学最好,为什么还有人去普通学校? 因为资源都是有限的,我们现实生活中必须兼顾成本与产出的平衡 前言 上文 ...
- Leetcode之回溯法专题-51. N皇后(N-Queens)
Leetcode之回溯法专题-51. N皇后(N-Queens) n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给 ...
- 【Linux命令】nohup命令
nohup命令 不挂断的运行,它会使您的脚本被忽略SIGHUP,并重定向stdout/stderr到一个文件nohup.out,以便在您注销后该命令可以在后台继续运行. 1)语法 nohup Comm ...