4年多JAVA开发经验,负责过很多项目的技术选型,架构搭建。Java基础扎实,对高并发处理方面有着自己的见解和积累,熟悉IM方面的技术和架构,掌握dubbo,zk,mq,hystrix,thrift,es,spring boot,spring cloud等框架,对微服务治理方面有着不错的认知和学习。
Ping是公司内部的聊天工具,类似于微信。Ping红包项目是在Ping系统同接入红包功能,实现ping上的红包发送和接受。发送红包的流程为客户端根据红包金额和个数,以及红包类型,调用封装支付宝请求参数的接口,获取支付宝请求参数后端这个时间红包数据预落地,并将红包信息缓存入redis,然后根据请求参数调用支付宝客服端进行付款,付款成功后调用服务端的result check接口,服务端完善红包数据,并将红包信息推送到activemq(供红包24小时过期设置使用),并将红包发送人封装信息同时缓存入redis和本地cache。抢红包分为两个流程,第一个拆红包的权限校验(检验红包是否过期红包是否领完,该用户是否已经领取过该红包)所有的的校验全部在redis中进行通过lua脚本实现。第二部拆红包(利用redis限流已经过滤掉大部分的请求),此时再做一次权限校验,校验通过,从redis里面取出一个红包id(此id对应DB红包id),然后修改DB中红包的领取状态,再通过mq实现支付宝异步打款。
系统中设计思路
安全性:服务端所有接口均做签名校验
降级思路:为了防止redis挂掉,DB这一层面做了降级策略,一旦redis挂掉,DB这边采取利用CAS原理尝试去获取红包。
缓存:采用redis,本地cache两级缓存,红包发送人信息和红包的领取信息(在红包领取完的情况下)缓存入redis和本地cache。
限流:利用nginx做简单的qps层面的限流,利用redis做业务限流。
性能优化:利用mq做支付宝异步打款,利用redis系统提高性能
系统上线后,经过压测8台服务器(8核16g)在并发16000的场景下,系统的响应时间90线可以保证在1.2s以内。
餐饮钉钉项目致力于为中国餐饮行业中小企业提供移动互联网办公平台,系统提供IM,考勤,审批,日志,公告,排班,营业报表多平台(饿了么,二维火,美味不用等)数据整合,宿舍管理功能模块,大大提高餐饮行业的工作效率。项目在在性能,安全,容错方面追求极致。
ping项目 ,ping作为公司聊天平台,为全公司的员工提供消息收发,消息已读未读,会议室预定,电话会议,工作台,ping红包,单据审批等一系列功能。
ping架构:
整个ping分为三个部分,push_bm,push_cm,notify,push_cm服务与客户端通过netty建立长链,redis缓存用户连接push_cm的对应关系,push_bm负责转发消息和相关的逻辑处理,notify负责不在线用户的第三方推送。
服务之间的通讯使用pylon(公司的java rpc框架),消息的协议使用mqtt,数据传输使用protobuf
消息发送流程:
A用户通过netty连接到集群中的一台push_cm上,经过connect认证之后,像push_cm发送消息,push_cm将消息转发到push_bm集群中的一台服务器上,通过redis查询目标用户B所连接的push_cm服务器信息并判断用户B是否在线,如果用户B在线,将消息转发到对应push_cm服务器,push_cm服务器将消息发送给用户B。如果用户B不在线,将消息缓存到redis中,并调用notify发送第三方推送;