如何设计一个高可用的运营系统

概述

一个产品业务的发展老是离不开运营二字。随着业务快速的发展以及新业务的扩充,运营需求愈来愈大,而且不少时候须要追热点,所以在有限的资源下,如何作到快速、准确、灵活、稳定的知足日趋增多的运营需求,成了个问题。咱们根据运营的四个基本要数(目标、人群、门槛、激励)经过对活动的抽象、建模、组件化,实现了能知足80%的运营需求的自动化运营系统,运营产品同窗只须要经过一份配置文件就能够生成一个新的活动。前端

引子

 

一般,咱们作一个活动,咱们须要作什么?面试

咱们须要UI设计、前端排版、接口定义、数据库建立、测试流程等等。这样下来整个流程快一点上一个活动大概一周左右,慢一点可能两周左右。redis

但不少时候,一个活动的生命周期可能就一周、一个月左右。咱们是否有必要花如此大的开发代价去作这样事情?一个活动如此,那十个,一百个呢。数据库

咱们先来经过三个活动来了解一下活动的本质。后端

活动1,为了拉新,针对老用户,每拉来一我的,奖励20元的额度提高。缓存

活动2,为了拉GMV,针对老用户,每还款xx元,奖励多少优惠券。安全

活动3,为了拉绑卡,针对所有用户,完成绑卡,就有机会抢100张1000元现金券。架构

...分布式

咱们能够发现活动的四个要素:人群、目标、门槛、激励工具

咱们能够用一句话归纳运营活动:

针对什么人群,咱们想要达到什么目标,设置什么样的门槛(规则),最后给用户什么样的激励措施。

活动生命周期这么短,咱们是否能够以比较小的开发代价来完成活动的开发呢? 是否针对某个业务的一个活动开发完?我能够快速的复用到其余业务上呢?

在这些活动的开发中,咱们遇到了挑战和难题:

可维护性差:活动的生命周期短,活动下线,接口、数据库废弃,但代码遗留,代码维护性差。

开发效率低:重复开发、开发效率低、没法复用。每一个活动新建接口、新建数据库表

可扩展性不高:每一个活动只能运用到本身的业务上,没法快速复用到其余业务。

性能和监控: 无可靠的数据监控、性能低下。

安全低:没有作接口签名、接口限流等等,容易被刷。

运营要作什么?

因而我花了一段时间来系统性的来梳理运营体系相关东西,经过已经作了什么,来思考,咱们未来怎么作?

接入业务:有了具体的产品,咱们才有运营他的基础。

运营活动:有了具体的业务,经过运营活动来运营业务。

用户触达:活动出来后,咱们须要告知用户才行。

数据分析:活动效果如何,咱们须要分析数据,改进咱们的方案。

监控告警:系统自己不是100%可靠,咱们须要一些仪表盘来监控咱们的系统。

安全/防刷:运营是有激励措施的,有利益,须要防止恶意侵入。

基础能力:经过抽象化、工具化提升开发效率。

组件化系统:是否有个可视化的界面,以便于运营人员的快速接入呢。

根据已作的活动经验和遇到的问题,让我不断的思考,我该如何去优化该运营系统,来提升开发效率、安全、和性能。最后,肯定的一个大方向:

平台化、标准化、配置化、组件化。

系统架构设计

 

 

从上往下看:

前端层:作先后分离,动静分离、接入按钮触发统计系统、组件化模块。

网关层:接入协议适配、签名校验,接口监控统计、限流等等。保障接口安全。

逻辑层:分三个子层。

第一层:接入统一配置中心,接口标准统一化、插件化、组件化经常使用模块。消息处理引入观察者,抽象公用模块。

第二层:根据运营四要素,抽象出规则集(绑卡?还款等等)、奖励集(优惠券、实物?等等)构成活动主逻辑。

第三层:抽象全部活动储存结构(标签服务)、配置、监控、分布式锁计数器以服务形式提供给上层调用。

基础平台:一些依赖的基础能力:好比用户信息、订单信息、平台优惠券系统、基础推送能力等等。

存储层:全部活动数据以统一结构存储。

从左往右看:

一个活动能够快速复用到其余业务。

将活动经过广告系统、消息推送系统等推送出去。经过数据分析系统作数据分析和优化活动流程。

说明几个点:

1.活动路由

全部接口统一经过SaleService.handler接入

根据活动ID与方法找到对应执行方法。

参考MVC的路由方式

经过反射+代理模式实现

这样作的一些好处:

因为活动的什么周期短,能够经过对配置的更改,调整接口的有无。维护方便。

能够很方便的作一些公共校验或埋一些钩子,(好比是否限制登陆、是否过时等)

能够与配置系统深度整合。

作一些接口监控和拦截。

2. mq消息(消息的解耦)

观察者模式

对修改关闭,对扩展开放

3.统一配置中心

能够参考以前写的统一配置中心

这里能够优化的点是,引入版本号,先更新配置+新的版本号到redis,而后再更新每一个配置的版本号id, 客户端来取配置的时候,先取配置的版本,在根据版本号+配置key去redis中取配置内容,这样能够平滑的将缓存配置切换到新的缓存配置。

4.关于组件化

一个活动一般能够当作若干个组件组成。

每个组件又有他本身的特性。

先后端如何经过组件交互?

最好能在OA编辑就完美了

最后,经过一些配置,能够快速的上线一些活动,无需开发接入,作到自动化运营。

一些我的观点

程序的开发,应该是一个搭积木的过程,一些小的模块组合成一个中等模块,若干中等模块组合成一个系统,若干系统组合成一个业务等等。

一个大的问题,能够分层分模块成若干小问题,解决若干小问题,最后解决大问题。

了解业务,才能作出更好的系统设计。

系统设计,要充分考虑到性能、可用性、可扩展性、可伸缩性、安全性等。

欢迎工做一到五年的Java工程师朋友们加入Java架构开发:744677563

本群提供免费的学习指导 架构资料 以及免费的解答

不懂得问题均可以在本群提出来 以后还会有职业生涯规划以及面试指导

相关文章
相关标签/搜索