- 快召唤伙伴们来围观吧
- 微博 QQ QQ空间 贴吧
- 文档嵌入链接
- 复制
- 微信扫一扫分享
- 已成功复制到剪贴板
基础架构-大型应用系统复杂性应对之道-王清培
展开查看详情
1 .应用平台复杂性应对之道
2 .个人简介 王清培 资深架构师 负责沪江交易、营销、商品中心架构 擅长:企业应用架构、SOA/Microservices\DDD\OOA/D/P、 Modeling、MMD、JAVA、C#、RabbitMQ、Redis 畅销书《NET框架设计-模式、配置、工具》作者、微软C# MVP 图灵专家顾问团专家、51CTO特约讲师 • Blogs:http://www.cnblogs.com/wangiqngpei557 • GitHub:https://github.com/Plen-wang
3 .沪江学习产品 词汇类 C C Ta l k 网校 阅读类 口语类
4 .大纲 • 背景介绍 • 业内方案 • 案例分享 • Q&A
5 .背景介绍 业务模式 B2C自营模式 C2C+SAAS平台模式 B2C自营+B2B模式 商品 营销 交易 虚拟/实物商品 批次管理 卡/码/券 限时促销 配送 虚拟币 价格管理 采购管理 团购 营销规则计算 价格分摊 售后
6 .背景介绍 分子公司 沪江网校 CC Talk HI Talk 新互 其他 学员 电子学籍 课程 机构 直播课 录播课 场景 外教 角色 阅读 实体书 虚拟课程 电子课件 领域数据 课节 公共业务平台 交易 商品 营销 售后 清结算 订单 配送 SPU 机构 活动 Promotion 售后单 退换货 结算单 结算周期/T+N
7 .业内方案-领域驱动 领域划分—战略模式 编码落地—战术模式 Core Domain SERVICES Supporting REPOSITORIES 访问 Subdomain(A) Bounded Context 维护完整性 Supporting Bounded Context Subdomain(B) ENTITIES 根引用 AGGREGATES Bounded Context 封装 Bounded Context Generic Bounded 封装 Context Subdomain VALUE OBJECTS (External) 封装 FACTORIES
8 .业内方案-元数据驱动 应用程序或者设计器配置 用户接口 虚拟应用程序实例 工作流/规则集合 实体模型 可配置 多租户部署 元数据服务 应用程序运行时 应用程序运行时部署容器 租户资料 可扩展性 配置数据
9 .案例分享-团购系统
10 .案例分享-生命周期 活动开始 开团 团生命周期 活 动 开团 生 团生命周期 命 周 期 开团 团生命周期 活动结束
11 .案例分享-活动建模
12 .案例分享-团建模
13 .案例分享-平台化复杂性 逻辑下沉 模型突出 扩展流程 活动延迟时间 阶梯退款 业务方通知成团 团长无需支付 手动退款 业务方通知退款 团开始/结束时间 拼团/阶梯团模型差异 业务方计算参团人数 分层处理 精化模型 规则插件化
14 .案例分享-活动规则
15 .案例分享-团规则
16 .案例分享-规则插件 Rules RuleRepository Metadata RuleManager
17 .案例分享-配置活动规则 "activityRules": { "rebateType": 1, //返佣类型 1: 成团人数,2:成团收入 "rebateAmount": 100, // 返利金额 "rebateRadio": 20, //返利比例 "rebateMode": 1 //返利模式 1:现金,2:学币 }
18 .案例分享-规则类型 public enum RuleType { REBATE_RULE(2, "返佣规则"), }
19 .案例分享-元数据类型 public enum DataType { STRING(1, "字符串类型"), NUMBER(2, "数字类型"), DECIMAL(3, "浮点类型"), DATE(4, "日期类型"), BOOLEAN(5,"布尔类型"); }
20 .案例分享-活动规则 SQL 存储 activity_id rule_type rule_order 3899 2 1 3899 3 1 3899 6 1 3899 8 1 3899 9 1 4800 2 1 4800 3 1 3911 2 1 3911 3 1 3911 4 1 3911 5 1
21 .案例分享-规则元数据 SQL 存储 activity_id rule_type rule_key rule_value rule_mapping_id data_type 3911 2 rebateType 2 14940 2 3911 2 rebateMode 1 14940 2 3911 2 rebateRadio 0.15 14940 2 3911 3 maxUserNumLimit 9999 14941 2 3911 4 repeatIncludeRMA false 14942 5 3911 5 mixtureUserNum 35 14943 2
22 .案例分享-分组数据 SQL 存储 activi condition_ condition_va condition_data_ discount_t discount_val discount_da rule_level ty_id type lue value ype ue ta_value 3911 1 1 2 2 99.99 3 1 3911 1 2 2 2 50 3 2 3911 1 9999 2 2 19.1 3 3
23 .案例分享-规则集 规则名称 规则描述 BusinessSideNotifyGroupRule 业务方通知成团规则 BusinessSideNotifyRefundRule 业务方通知退款规则 GroupEndTimeLimitRule 团结束时间限时规则 GroupFinishedRefundRule 团结束全额退款规则 GroupStartTimeLimitRule 团开始时间限制规则 LastLadderRefundRule 最后阶梯退款规则 MixtureRule 混拼规则 OwnerBuyRule 团长支付规则 RepeatRule 重复购买规则 UserNumLimitRule 参团人数限制规则
24 .案例分享-规则逻辑高内聚 public class GroupStartTimeLimitRule implements Rule { @Override public void doAction(RuleContext context, RuleResult result) { // 团开始时间不能早于活动开始时间 if (groupStartTimeLimitRuleContext.getActivityStartTime().after(now)) { // 当限制团开始时间时候 ,校验团开始时间不能小于活动开始时间 if(BooleanUtils.isNotTrue(context.getGroupStartTimeLimitRuleContext().getIsGroupStartTimeUnLimit())) { //活动时间未开始 ……… }else{ //不限制团开始时间,设置团的开始时间为活动的开始时间 …… } } else { //活动已开始,设置团开始时间为当前时间 …… } } }
25 .案例分享-高内聚低耦合 /** * 手动处理团领域实体。 /** */ * 最后一个阶梯退款。 public class HandGroupDomainEntity extends BaseDomainEntity { */ /** public interface LastLadderRefundRule extends Rule { * 当前活动下的所有未成的团 */ /** private List<Group> groups; * 计算退款 * /** */ * 规则引擎 void calculateRefund(LastLadderRefundContext context, */ LastLadderRefundResult result); private RuleManage ruleManage; /** /** * 执行退款 * 手动成团 * */ */ public void handHasGroup() {} void onRefund(Map<Long, GrouponDismissMessage> refundMessageMap, List<GroupDetail> groupDetails); /** * 配送 /** */ * 对当前团订单进行退款 public void delivery(Group group) {} * */ /** Map<Long, GrouponDismissMessage> buildRefund(List<GroupDetail> groupDetails, * 获取配送并发lock Group group, ActivityPreferentialBo currentLevel); * 不能有配送且不能有退款 */ } public boolean getDeliveryConcurrentLock(GroupDetail item) {} }
26 .案例分享-CQRS + Domain-Event 开户 Host Process 注册资金 使用资金 Application Service Bounded Context Account Aggregate Read-Model Synchroniser Read AccountCreated Model DB BalanceUpdated
27 .案例分享-事件驱动&异步通知 团购系统事件列表: 事件名称 事件定义 事件描述 消费者 回调地址 散团消息 groupon.dismiss 当团解散当时候会发出散团消息 售后、CC 无需回调 参团消息 groupon.success 当成团的时候会发出成团消息 配送、售后 无需回调 活动终止消息 groupon.activitystop 当活动被手动终止时发送活动终止消息 团购前台 无需回调 团购系统事件消费者: 事件定义 exchange name 所有者 groupon.dismiss common.groupon.topic.ex 团购 groupon.success common.groupon.topic.ex 团购 groupon.activitystop common.groupon.topic.ex 团购 业务方通知: 通知类型 routing key 通知者 业务方通知成团 common.groupon.businessnotifygroup 网校通知成团(拼团) 业务方通知退款 ccweb.trade.Groupon.BreakRefundEvented CC通知退款(阶梯团)
28 .案例分享-精准投递 Event Message CC Talk 拼团 topic: 200.groupon.success.event 阶梯团 事件中心 沪江网校 groupon.success.event(成团事件) 拼团 messageBody{ companyId:200, topic: 200.groupon.success.event activityId:1010101, topic: 100.groupon.success.event 阶梯团 groupId:20010 } 消息投递组件 团购系统 Pull register events: CCTalk:{100}.groupon.success.event HJClass:{200}.groupon.success.event
29 .案例分享-微服务部署 Docker Host Logical “Groupon” Microservice “Groupon API” Container Reads Queries & External IP ViewModels Application “Groupon” and Port Layer Updates Database Commands & Domain-Model