大话业务场景与解决方案-做任务

背景

多数的移动端APP都会有做任务领取奖励的功能模块,这类需求的目的是培养用户使用习惯,提升用户活跃性,用户完成任务获得积分奖励,通过积分兑换商品或者充值话费,微信体现等。

拟定需求场景(如图↓),概要:APP底部导航中新增小任务Tab,点击Tab可查看任务完成进度和领取情况,点击去完成跳转到做任务的业务界面,当用户完成任务并且满足领取条件的时候,任务Tab需要红点提醒用户当前有奖励可领取,用户领取后并且当前没有待领取奖励小红点消失,任务完成进度和领取状态仅保持当天,隔天刷新。


业务分析

在开发前需要对需求进行整理,对细节进行确认,然后设计解决方案,预估开发时间,这里将对于业务中核心的内容进行梳理:

  1. 用户想要完成任务,需要去操作其他业务功能,如:评论成功后需要完成每日评论任务,关注主题后完成关注新手任务,这里就涉及核心问题,任务需要依赖于其他业务
  2. 为了保障后续拓展性,任务需要支持后台管理,配置任务名,描述,任务类型(每日,新手,活动),完成次数,奖励积分数量,去完成跳转uri 等
  3. 用户完成任务后不用自动领取奖励,需要进入到任务列表点击领取操作,可领取时导航Tab需要小红点提醒,和产品确认任务的完成和提醒的用户体验 可以接受短时间延迟
  4. 用户多次操作业务,或者出现重复操作(恶意并发请求刷积分),保证任务只能完成一次并且只能领取一次奖励,需要保证幂等性

方案设计

核心目标:
  1. 任务依赖其他业务,需要进行解耦,不影响其他业务的功能和性能
  2. 设计后台可管理,便于后续拓展
  3. 抽象任务模块,代码抽象开发
  4. 完成任务和领取需要保证幂等性
  5. 高可用
名词定义:

事件

  • 任务中涉及依赖其他业务,这里需要抽象出一个概念,用户通过操作业务,完成任务的这个操作,我们把这个过程定义为用户完成任务事件触发完成,如:评论事件,点赞事件,关注事件,等
解决方案:

在实现方案上,采用异步消耗队列的方式,依赖业务接口埋入事件上报,将用户成功操作业务的任务事件上报到队里中,然后开发消息消耗的脚本程序,对消息中用户触发的任务事件进行业务逻辑处理和DB操作,更新用户任务进度和可领取状态,响应给用户(完成任务红点提醒),设计图:

  • 依赖业务解耦

    • 依赖业务将操作成功用户的任务事件上报到消息队列,然后程序进行异步消耗
    • 方案解决了依赖业务之间的强耦合,并且基本不影响现有依赖业务的接口性能
  • 高可用:
    • 通过调度系统启动多进程对队列进行消耗

      • 进程守护系统,守护进程保活,奔溃重启,可对执行日志进行记录与查看
      • 如: gocron
    • 消息队列监控,无法及时消耗进行预警,保障即时性,避免长时间的延迟
      • rabbitmq
      • redis list
      • ... ...
    • 容错与补偿
      • 队列消耗失败需要进行记录,并可根据业务场景,通过另外程序进行补充处理
      • 用户操作业务上报任务事件不限制次数,以免用户没完成任务,允许用户重新尝试去做任务,程序消耗需要控制任务只能完成一次


表结构:

-- 任务表
CREATE TABLE `task` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT ‘自增‘,
  `icon` varchar(300) NOT NULL DEFAULT ‘‘ COMMENT ‘图标‘,
  `title` varchar(30) NOT NULL DEFAULT ‘‘ COMMENT ‘任务标题‘,
  `type` tinyint(4) NOT NULL DEFAULT ‘0‘ COMMENT ‘任务类型,新手任务=1,每日任务=2‘,
  `event` int(11) NOT NULL DEFAULT ‘0‘ COMMENT ‘事件‘,
  `des` varchar(30) NOT NULL DEFAULT ‘‘ COMMENT ‘任务描述‘,
  `target_num` int(11) NOT NULL DEFAULT ‘0‘ COMMENT ‘目标数量‘,
  `points` int(11) NOT NULL DEFAULT ‘0‘ COMMENT ‘金币‘,
  `sort` int(11) NOT NULL DEFAULT ‘0‘ COMMENT ‘排序‘,
  `status` tinyint(4) NOT NULL DEFAULT ‘0‘ COMMENT ‘状态 0=下线,1=上线,-1=删除‘,
  `app_version` varchar(15) NOT NULL DEFAULT ‘‘ COMMENT ‘app版本号‘,
  `app_version_compare` varchar(10) NOT NULL DEFAULT ‘‘ COMMENT ‘app版本号比较运算符‘,
  `operator` varchar(10) NOT NULL DEFAULT ‘‘ COMMENT ‘操作人‘,
  `jump_uri` varchar(300) NOT NULL DEFAULT ‘‘ COMMENT ‘跳转协议‘,
  `create_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间‘,
  `update_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘更新时间‘,
  `event_begin` timestamp NOT NULL DEFAULT ‘1970-01-02 00:00:00‘ COMMENT ‘事件开始时间‘,
  `event_end` timestamp NOT NULL DEFAULT ‘1970-01-02 00:00:00‘ COMMENT ‘事件结束时间‘,
  `task_begin` timestamp NOT NULL DEFAULT ‘1970-01-02 00:00:00‘ COMMENT ‘任务开始时间‘,
  `task_end` timestamp NOT NULL DEFAULT ‘1970-01-02 00:00:00‘ COMMENT ‘任务结束时间‘,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 用户任务情况表
CREATE TABLE `user_task_case` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT ‘用户任务情况‘,
  `user_id` bigint(20) NOT NULL DEFAULT ‘0‘ COMMENT ‘用户ID‘,
  `task_id` int(11) NOT NULL DEFAULT ‘0‘ COMMENT ‘任务id‘,
  `task_type` int(11) NOT NULL DEFAULT ‘0‘ COMMENT ‘任务类型‘,
  `event` int(11) NOT NULL DEFAULT ‘0‘ COMMENT ‘事件‘,
  `task_uni` varchar(30) NOT NULL DEFAULT ‘‘ COMMENT ‘任务唯一标识(唯一约束) ‘,
  `target_num` int(11) NOT NULL DEFAULT ‘0‘ COMMENT ‘目标数量‘,
  `finish_num` int(11) NOT NULL DEFAULT ‘0‘ COMMENT ‘完成数量‘,
  `points` int(11) NOT NULL DEFAULT ‘0‘ COMMENT ‘可领取金币数量‘,
  `status` tinyint(4) NOT NULL DEFAULT ‘0‘ COMMENT ‘状态 0=待完成,1=待领取,2=已经领取‘,
  `finish_at` timestamp NOT NULL DEFAULT ‘1970-01-02 00:00:00‘ COMMENT ‘完成任务时间‘,
  `get_at` timestamp NOT NULL DEFAULT ‘1970-01-02 00:00:00‘ COMMENT ‘领取时间‘,
  `create_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间‘,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uni_user_id_task_uni` (`user_id`,`task_uni`) USING BTREE,
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COMMENT=‘用户任务情况表‘;

更新语句:

-- 更新领取状态,注意:WHERE条件,强校验
UPDATE user_task_case
SET  `status`=2,finish_at=CURRENT_TIMESTAMP
WHERE id=:id AND user_id=:user_id AND `status`=1 AND finish_num>=target_num

表重点字段说明:

  • task_uni

    • 任务唯一标识
  • user_id和task_uni 组合唯一约束索引
    • 每日任务:

      • 任务id_任务类型_日期(task_id_type_date)
    • 默认都是只做一次(新手任务/活动任务):
      • 任务id(task_id)
  • 幂等性
    • user_task_case 表中 user_id和task_uni 组合唯一约束索引,通过mysql的唯一约束,保证了多进程并行消耗事件队列的情况下,每日任务和一次性任务不能重复INSERT
    • 通过UPDATE的WHERE条件校验保障领取的幂等性

管理后台:

产品在规划需求的时候会设计出相关后台,但是不一定设计的合理,所以这里需要根据确认的解决方案协助产品对于管理后台进行调整,保障后续的拓展性


代码层面:

  • 面向抽象开发,合理使用设计模式,便于后续的拓展

话外篇:

谈近一年的感悟,近一年参与了新APP项目的开发,从0开始搭建项目,看着DAU一点点儿的涨起来,还是挺有成就感的。

角色上产生了变化,现在感觉自己更像是一个项目的参与者,而不是任务的执行人,完成业务开发的同时也会对产品上有根深了解。

空闲时间也会对竞品调研以及用户使用意见或者问题进行跟进,站在用户角度提供产品上的一些建议。

后续会把新项目开发过程中遇到问题或者常见的业务场景下的解决方案进行梳理出来进行博文分享。



首发于Github : [

原文地址:https://blog.51cto.com/sflyq/2485204

时间: 2024-07-30 07:24:12

大话业务场景与解决方案-做任务的相关文章

轻流五大「业务场景」解决方案,助您解决企业管理难题

亲爱的轻流用户们,今天给大家带来一份轻流的业务场景解决方案大合集,看看在进销存管理.客户关系管理.工程项目管理.售后管理.外包服务管理等场景下,轻流是如何解决令您头疼的业务管理难题的吧! 一:轻流 × 进销存管理 轻流进销存管理方案,可以通过完全的自定义流程实现采购.库存.项目.客户.内部管理的流程化.数据化及智能化,轻松解决了传统标准化的ERP软件难以适用于每家公司实际业务场景的问题. 实时的在线Excel,权限更明晰的进销存 通过业务流程自动化实现库存实时汇总,每一笔消耗均可溯源,从根源节省

阿里开发者们的第15个感悟:做一款优秀大数据引擎,要找准重点解决的业务场景

1月10日,做一款优秀大数据引擎,要找准重点解决的业务场景.这是我们送给开发者的第15个感悟. 沐远在社区分享了他的博文,<使用spark分析云HBase的数据><hive数据导入云hbase>,粉丝评论说请收下我的膝盖. 李伟(沐远)阿里云数据库技术专家专注大数据分布式计算数据库领域, 研发Spark及自主研发内存计算,目前为广大公有云用户提供专业的云HBase数据库及计算服务. 做一款优秀大数据引擎,要找准重点解决的业务场景,打磨一套易用的API,构架与上下游联动的生态. 推荐

如何对业务场景做数据分析?

企业的数据分析是个很复杂的工程,需要业务和分析技术两块知识.这里从业务的角度切入,谈谈如何对业务分析,文章参考帆软软件的零售业数据管理方案. 首先,企业的分析主要分为管理分析和经营业务分析,分析整体的思路是:明确业务场景--确定分析目标--构建分析体系--梳理核心指标. 因为每个企业/行业的业务不同,分析体系也不同,这里主要说一下零售电商,按照不同的分析场景来探讨下.其他行业也欢迎大家勾搭,或者可以看看这个专栏里里的案例(比较偏向报表体系,有一定借鉴意义):帆软数据应用研究院 以电商为例,常用的

Hadoop的计算特征以及一般用在哪些业务场景?(转载)

其实我们要知道大数据的实质特性:针对增量中海量的结构化,非结构化,半结构数据,在这种情况下,如何快速反复计算挖掘出高效益的市场数据? 带着这个问题渗透到业务中去分析,就知道hadoop需要应用到什么业务场景了!!!如果关系型数据库都能应付的工作还需要hadoop吗? 比如 1.银行的信用卡业务,当你正在刷卡完一笔消费的那一瞬间,假如在你当天消费基础上再消费满某个额度,你就可以免费获得某种令你非常满意的利益等等,你可能就会心动再去消费,这样就可能提高银行信用卡业务,那么这个消费额度是如何从海量的业

了解场景以及解决方案来学习技术

目前对于一个开发人员来说,没有几年的项目开发经验,对于技术的理解可能不是很深.工作2年了,接触的都是针对某一行业的系统开发,可能使用的技术基本固定,比较好项目可能就是后期对代码框架的优化,对其进行二次封装,对系统进行拆分多个模块,抽象构建代码框架,最后使得项目适合多人快速开发,最后就是对业务进行运营监控. 但是到后期可以参与这些的员工,多数都是老员工,当然了要求也比较高,技术业务都得了解,但是也可能导致最后项目失败,最后重新开发. 作为一个开发经验不足的员工,了解一些业务场景,看看人家的解决方案

React Hooks简单业务场景实战(非源码解读)

前言 React Hooks 是React 16.7.0-alpha 版本推出的新特性.从 16.8.0 开始,React更稳定的支持了这一新特性. 它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性. 注意:React 16.8.0 是第一个支持 Hook 的版本.升级时,请注意更新所有的 package,包括 React DOM.React Native 将在下一个稳定版本中支持 Hook. 如果说promise是JavaScript异步的终极解决方案,那

我的监控世界观(5)--如何在监控中反映业务场景

我在<我的监控世界观>1 ~ 4 中更多的阐述了对于某个监控点的监控.存储.展现.但是在现实世界中,整个世界的联系更像是一个图,每个点可以是某个监控点,而边是他们之间的调用关系或者数据流 举例: webserver –> mysql 对于一个最简单的web 服务, 它可能有两部分组成,webserver 和 mysql存储店铺.商品信息,webserver 服务直接和浏览器用户进行交互.在这样一个业务场景中,webserver 上有的监控点,可能包括单位时间内的UV.PV,而mysql

wpf企业级开发中的几种常见业务场景

前阵子在公司弄个内部的进销存管理系统,从了解需求.系统设计到编码,大约耗费了两个月时间,后来公司有了其他的安排,这东西就算黄了.顺便吐槽一下,厂里的一些人说话真心不顾别人感受,邮件啥的没一句舒服的.不过以前在别的地方干活都是很多人弄,一直都是按领导的意思办即可,基本上不怎么跟人打交道,不能保持淡定的心态说明还是too young了点,这也算是个历练吧. 弄这个项目,好歹也辛苦了一阵子,另外细节方面感觉自己差不多做到位了,也算尽心了.这里先附几张效果图,接下来将针对几种常见的业务场景抠出一些代码,

上海天旦解决方案 — 城市农商行业务性能监控解决方案

上海天旦 BPC 业务性能监控解决方案,帮助城商行以可控的投入来建立灵活开放的业务运维保障系统,并支撑城商行进行基于交易数据的金融创新. 从城市信用社发展而来的城市商业银行,信息系统的运维复杂性随着电子渠道的发展和金融创新的要求而变得越来越具有挑战性,亟需建立自主可控的统一运平台,同时信息系统也需要为金融创新的需求提供有力支撑. 上海天旦 BPC 采用成熟可靠的技术,大大简化了部署难度,可以快速落地业务监控系统,实现高实时性的交易监控和自动故障定位,同时利用 BPC 产品在金融行业的大量成功案例