分类: 架构设计与优化
2017-01-04 16:46:40
红包是春节习俗,原本是讨个吉利的意图。在互联网技术高度发展的今天,用手机抢红包已经成为一种文化、一种生活方式;据支付宝统计的数据显示,2016年2月7日除夕夜,支付宝共四轮“咻一咻”互动平台的总参与次数达到了3245亿次;在21点09分,用户的参与热情达到了顶峰,“咻一咻”峰值一度达到210亿次/分钟。
业务需求催生技术升级,随着红包业务的大众化、普遍化,我们对高可用、可扩展、按需提供服务的技术架构要求越来越高。下面介绍一种基于阿里云容器服务及相关云产品组成的高可用抢红包系统框架;
下图给出了基于阿里云相关产品实现的抢红包系统架构,所涉及的产品包括阿里云容器服务,MNS,RDS,SLB,SLS等。
用户端:模拟用户抢红包软件(如支付宝),能发送用户的的抢红包请求,并携带身份ID等信息;根据服务端的响应,把中奖信息反馈给用户;
请求处理逻辑:用户发送抢红包信息到“请求处理逻辑集群”,这部分有SLB、ECS集群,ECS集群通过阿里云容器服务实现容器化。可以接收用户请红包请求,并调用接口进行身份验证、MNS获取消息(抢红包)等;通过MNS反馈消息判断是否中奖,并反馈给用户;
身份验证模块:用户验证抢红包用户的身份,可以根据业务实现不同的限制;例如约定同一个用户ID在一定时间内只能抢一次、或者随机放弃1/2的用户请求;
红包管理监控:显示当前MNS中有效红包数;进行红包发放操作,可以设定总红包数,多批次发放,以及发放时间间隔等;可以基于SLS日志服务进行红包数据统计;
MNS服务:模拟红包队列,请求处理模块通过从MNS抢消息来模拟抢红包,抢到消息的请求即为抢到红包;同时通过往MNS中发送消息模拟赛红包;
SLS服务:日志存储服务,会把抢红包过程中产生的状态日志(中奖、未中奖、验证错误等)进行统计、并持久化;
RDS服务:存储用户相关信息,验证抢红包用户的身份;持久化红包发放信息,包含抽中红包用户的ID,时间,红包ID等;
SLB服务:对用户请求进行负载均衡;
其中MNS、SLS、RDS、SLB都通过阿里云提供的云服务实现,其余组件均通过简单的代码实现,并通过容器服务进行微服务化;
下图以容器服务为中心描述了系统之间的调用:
系统通过4个微服务相互配合,并引用RDS、MNS、SLS等提供的服务能力;下面是通过容器服务部署的编排文件内容:
webpage:
image: registry.cn-hangzhou.aliyuncs.com/junbao/redpacket_webpage:v5
restart: always
labels:
aliyun.routing.port_80: http://test/webpage aliyun.logs: /var/log
aliyun.probe.url: http://container/index.jsp aliyun.scale: '3' aliyun.auto_scaling.max_cpu: '70' aliyun.auto_scaling.min_cpu: '40' aliyun.auto_scaling.step: '1' redpacket:
image: registry.cn-hangzhou.aliyuncs.com/junbao/redpacket_redpacket:v12
restart: always
environment:
DB_HOST: "rm-bp1y1o7ga6hsm257o.mysql.rds.aliyuncs.com" DB_PORT: "3306" DB_NAME: "redpacket_account_check" DB_USER: "docker" DB_PASSWD: "***" ACCOUNT_CHECK_IP: "account.local" MNS_URL: "" ACCESS_KEY_ID: "hDfTgHQ5xKn45q8a" ACCESS_KEY_SECRET: "*******" external_links:
- "account.local" labels:
aliyun.routing.port_80: http://test/redpacket aliyun.logs: /var/log
aliyun.probe.url: http://container/redpacket/test aliyun.scale: '2' aliyun.log_store_redpacket: /var/log/redpacket_access.log aliyun.log.timestamp: "false" aliyun.auto_scaling.max_cpu: '70' aliyun.auto_scaling.min_cpu: '40' aliyun.auto_scaling.step: '1' account:
image: registry.cn-hangzhou.aliyuncs.com/junbao/redpacket_account:v12
restart: always
environment:
DB_HOST: "rm-bp1y1o7ga6hsm257o.mysql.rds.aliyuncs.com" DB_PORT: "3306" DB_NAME: "redpacket_account_check" DB_USER: "docker" DB_PASSWD: "***" labels:
aliyun.routing.port_80: account.local aliyun.logs: /var/log
aliyun.probe.url: http://container/test aliyun.scale: '2' aliyun.auto_scaling.max_cpu: '70' aliyun.auto_scaling.min_cpu: '40' aliyun.auto_scaling.step: '1' monitor:
image: registry.cn-hangzhou.aliyuncs.com/junbao/redpacket_monitor:v18
restart: always
environment:
DB_HOST: "rm-bp1y1o7ga6hsm257o.mysql.rds.aliyuncs.com" DB_PORT: "3306" DB_NAME: "redpacket_account_check" DB_USER: "docker" DB_PASSWD: "***" MNS_URL: "" ACCESS_KEY_ID: "hDfTgHQ5xKn45q8a" ACCESS_KEY_SECRET: "****" labels:
aliyun.routing.port_80: http://test/monitor aliyun.logs: /var/log
aliyun.scale: '1'
根据上面编排模板内容介绍阿里云容器服务特点:
可通过对CPU、内存的使用限制定义容器服务的伸缩功能;
aliyun.auto_scaling.max_cpu: '70' aliyun.auto_scaling.min_cpu: '40' aliyun.auto_scaling.step: '1'
上面配置表示容器内CPU使用率超过70%时会自动扩展一个容器,且容器内CPU使用率低于40%时会自动缩减一个容器;详见:
https://help.aliyun.com/document_detail/26017.html?spm=5176.doc26018.6.601.fo3Esr
在编排模板中添加 routing 标签,定义相应的域名或者域名前缀。可以实现简单的 7 层协议负载均衡;
aliyun.routing.port_80: http://test/monitor
上面配置表示可以通过以下域名访问服务,其中test为域名的前缀,monitor为URL的path部分;
阅读全文请点击: