方案集

作者: saoraozhe3hao | 来源:发表于2018-11-07 10:33 被阅读0次

    定时器

    1、Linux,Crontab,周期运行Shell脚本,可以用于清理日志
    详见:https://www.jianshu.com/p/988a2dd7c242
    2、Java Timer,周期运行Java程序
    详见:https://www.jianshu.com/p/f82f3b9a3f9e
    3、Spring Scheduling,周期运行Java程序
    详见:https://www.jianshu.com/p/4ae315debf03
    Spring部署了多台,需要分布式锁,保证只有一台执行了定时任务
    4、RocketMQ,setDelayTimeLevel(),单次定时消费
    详见:https://www.jianshu.com/p/b18107ac8abf
    5、MySQL,create event on schedule,周期运行存储过程,可以用于清理数据
    详见:https://www.jianshu.com/p/058daf3f44d7

    单点登录

    SSO:Single Sign On,单点登录
    角色:认证中心、子系统
    认证中心:只有一个认证中心,只在认证中心提供登录界面
    全局会话:认证中心持有的用户会话信息
    局部会话:单个子系统持有的用户会话信息

    认证流程
    1、用户访问子系统,子系统发现没有该用户的局部会话,跳转到认证中心
    2、认证中心发现没有该用户的全局会话,跳转到登录界面
    3、用户登录后,认证中心创建该用户的全局会话 和 授权令牌,带着授权令牌跳转回子系统
    4、子系统拿令牌让认证中心校验令牌有效性,并创建局部会话

    注销流程
    1、用户在子系统注销,子系统拿令牌让认证中心注销全局会话
    2、认证中心向所有子系统发出注销请求,各子系统销毁局部会话,重回认证流程

    方案
    1、Apereo CAS
    CAS:Central Authentication Service
    官网:https://apereo.github.io/cas/5.3.x/index.html
    源码:https://github.com/apereo/cas
    Jasig组织:Java in Administration Special Interest Group,是1999年成立于美国的开源组织
    Apereo基金会:2012年,Jasig组织与Sakai基金会合并为Apereo基金会
    历史:CAS最早由Yale大学创立,2004年成为Jasig的项目,现由Apereo维护

    2、Spring Security OAuth 与 Spring Social
    见:https://www.jianshu.com/p/98af876d2e2c

    秒杀

    问题:用户会不停刷新秒杀页面
    方案:前端性能优化 + CDN

    问题:客户端时间与服务器时间不同步
    方案:刷新页面时,从服务端获取时间,对比与本地时间的差距,之后每分钟与服务器同步一次时间

    # Nginx直接返回时间
    location ~ ^/get_time {
        default_type application/json;
        return 200 '{"status":"success","time":"$time_local"}';
    }
    

    问题:用户会重复点击抢购按钮
    方案:点击一次以后灰化按钮,刷新页面再点击,提示已抢购 或 自己的抢购结果 或 秒杀进度

    问题:内行人员会绕过浏览器,重复抢单
    方案:对同一个会话进行限流,一个会话只能提交一次

    问题:海量订单写请求
    方案:将订单请求push到消息队列,队列长度上限即库存量,push不进队列的请求,直接返回抢购失败

    问题:海量库存读请求
    方案:将库存提前写入缓存,接受来自客户端 和 消息消费者 的库存查询

    分布式锁

    功能:保证同一个方法在同一时间只能被一台机器上的一个线程执行
    概念
    加锁:语义上可以和 “获得锁”、“得到锁”通用
    拥有锁:加锁后即拥有了锁
    可重入锁:锁的拥有者 可以重复加锁
    悲观锁:即悲观得认为别人随时会来更新数据,所以一开始就加锁。一锁二查三更新。数据库自带机制,select * from person for update of person.name; 锁定person.name,事务提交或回滚后才释放
    乐观锁:即乐观得认为别人不会来更新数据,所以一开始不用加锁。表中引入一个版本号(version)字段,查数据时得到version,更新数据时检查数据库中version是否变化,如果是,则正常更新,同时version加1。如果不是,则更新失败。

    一、基于数据库实现分布式锁
    原理:
    1、数据库里设置一张表,有唯一性约束的method_name字段
    2、加锁时,插入一条记录
    3、释放锁时,删除这条记录
    缺点:
    1、锁没有失效时间,一旦解锁操作失败,后续再也没有线程能加锁
    2、没有加锁排队机制
    3、不能重入
    4、性能稍差

    二、基于缓存实现分布式锁
    原理:与一类似
    缺点:
    1、没有加锁排队机制
    2、不能重入

    三、基于Zookeeper实现分布式锁
    原理:
    1、客户端在ZK中创建一个临时锁,一旦Session连接断开,这个临时锁就会自动删除
    2、有加锁排队机制,客户端可以监听队列变化
    3、客户端可以查询自己是否拥有锁

    OpenAPI

    术语约定:secret,key 约定为 key

    方案1:每次请求带上key
    案例:旷世Face++平台

    方案2:用key调用登录接口得到token,后续每次请求都带上token
    缺点:token有有效期,客户端需要管理token
    案例:百度大脑平台

    方案3:让请求参数 和 key参与签名得到sign,请求时带上sign
    优点:不用在请求中带key
    案例:腾讯AI开放平台

    随机数

    1、commons-lang3

            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>3.9</version>
            </dependency>
    
    RandomStringUtils.randomAlphanumeric(16);
    

    2、commons-codec

            <dependency>
                <groupId>commons-codec</groupId>
                <artifactId>commons-codec</artifactId>
                <version>1.12</version>
            </dependency>
    
    new SecureRandom().generateSeed(8);
    

    JSON

    1、Jackson

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.9.5</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.5</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.9.5</version>
    </dependency>
    
    new ObjectMapper().writeValueAsString(object or map)
    

    2、FastJson

            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.58</version>
            </dependency>
    
    JSONObject.toJSONString(object or map)
    

    相关文章

      网友评论

          本文标题:方案集

          本文链接:https://www.haomeiwen.com/subject/bjmmxqtx.html