在过去,为了提升用户从估价到下单各个阶段的转化率,业务会经常性的做一些活动投放或者用户召回等运营活动。这些活动往往都是粗投,没有细分用户群体。一是导致最终的转化率并不理想,二是不便于对不同群体的用户进行差异化的运营。
因此,希望搭建一个平台,能够根据各个阶段数据的变化,不断调整运营策略,使 ROI 最大化。
C2B长期运营以来,已经有较细致的数据支撑,但如何利用这部分数据,来帮助我们的业务更好的发展,是我们想要去实现精细化运营平台的初衷。
不同的数据指标如何联动?如何用这些数据帮助我们做出决策?通过分析细化数据后,如何能够帮助我们召回更多的用户?
以用户下单后取消的数据举例:
以任务为基础元素,通过创建计划驱动任务的执行
其实就是上文提到的触达方式,目前支持的触达方式有
运营通过后台创建任务,并配置任务所需的素材:如跳转链接、图片等
任务创建以后,并不能被真正的使用到,需要创建计划来驱动任务的执行,计划包含以下功能
对应上文:
我们最终打造了一套以阿拉丁(C2B营销系统)为基础,精细化运营平台为桥梁的精细化运营能力。
设计时,我们使用了Redis存储运营上传的用户数据,计划开始前完成对已上传用户文件解析储存,在任务结束时删除计划对应的用户群体。
zset缓存下用户数据后,当数据量过多时,会存在大key问题,导致在一些push场景,遍历用户数据时,会存在耗时较高的情况。
解决方案:
通过用户token/uid 对key进行分片,将用户数据分散在N个Redis key中,避免单个key过大。
//获取分片索引
private String getClusterKey(String key, String member) {
int hash = Hashing.murmur3_32().hashString(member, Charsets.UTF_8).asInt();
hash = Math.abs(hash);
final int clusterIndex = (hash & (CommonConstant.CLUSTER_COUNT - 1)) + 1;
return getClusterKey(key, clusterIndex);
}
//遍历分片进行推送
private void runSingleJob(JobInfoDto jobInfoDto, PlanInfoDto planInfoDto) {
try {
PlanUserDataCondition condition = new PlanUserDataCondition();
condition.setPageCount(100);
condition.setPlanId(planInfoDto.getPlanId());
for (int i = IntelligentOperateDataCacheService.MIN_CLUSTER_INDEX; i <= IntelligentOperateDataCacheService.MAX_CLUSTER_INDEX; i++) {
condition.setClusterIndex(i);
int pageNum = 1;
while (true) {
condition.setPageNum(pageNum);
List<Long> uidList = intelligentOperateDataCacheService.listPlanUidByCondition(condition, "IntelligentOperatePushTask");
if (CollectionUtils.isEmpty(uidList)) {
log.info("BeginSendMessageUserProfilePrivateHandler 当前分片已无可执行的数据 planId={} index={}", planInfoDto.getPlanId(), i);
break;
}
if (apolloConfigService.getJobProcessSwitch()) {
log.info("开关关闭,终止....... {}", planInfoDto.getPlanId());
break;
}
CountDownLatch countDownLatch = new CountDownLatch(uidList.size());
for (Long uid : uidList) {
ThreadUtil.execute(() -> send(uid, planInfoDto, jobInfoDto, countDownLatch));
}
countDownLatch.await();
log.info("BeginSendMessageUserProfilePrivateHandler 当前页结束 planId={} jobId={} num={}", planInfoDto.getPlanId(), jobInfoDto.getJobId(), pageNum);
pageNum++;
}
}
} catch (Exception e) {
log.info("runSingleJob error, e=", e);
}
}
本文介绍了转转C2B业务下精细化运营平台的搭建。在系统上线以来,在用户召回转化上有了一定的成效。在未来,会继续丰富系统的功能:更多的触达方式、更多的转化手段。也会持续探索系统开放性,让更多的业务可以接入使用。
关于作者
多斯,转转C2B业务研发工程师
转转研发中心及业界小伙伴们的技术学习交流平台,定期分享一线的实战经验及业界前沿的技术话题。
关注公众号「转转技术」(综合性)、「大转转FE」(专注于FE)、「转转QA」(专注于QA),更多干货实践,欢迎交流分享~