zoukankan      html  css  js  c++  java
  • 秒杀系统的设计猜想

    首先声明,本人没有设计过秒杀系统。

    仅仅是今天在面试时被问到了这个问题。感觉回答的不是非常好。回来后细细想了想再加上请教同事,并查询了一些资料。

    整理出了一个思路。


    1、首先秒杀系统要考虑到多并发的排序问题,同一时候来了上千个请求,那么首先要负载均衡这些请求。

    将这些请求分散到不同的server上,那么做负载均衡的有Nginx等。


    2、请求有先来后到问题。则须要排序,那么排序就要用到队列。
         队列的实现方式:
         a、 java concurrent 包中有几个Queue。如 LinkedBlockingQueue (线程安全的堵塞队列)。
          ConcurrentLinkedQueue(採用CAS操作,来保证元素的一致性),ArrayBlockingQueue。

         b、MQ Server的消息队列(如ActiveMQ)。当然用MQ有个问题,假设你从队列中取出来的消息,但是写
            失败的怎么办? 由于MQ是异步的。它当时并不返回成功或失败的结果,假设过了一会儿
           返回的结果是失败,该怎么办?

           这时就要用NoSQL 来做一个保证机制了,如NoSQL中也要有个字段来标识
           消息是否写成功,假设没有写成功。则再将失败的消息写回MQ。

    3、用户抢到商品后,怎样保证该商品不再被其他用户抢到,这里面就涉及到一个对数据的原子
          操作
    问题。或加锁问题。

          a、假设要用数据库实现(由于假设定比較严格的锁,则对数据表的操作是原子性的,比方:对行加排它锁)。

          b、但数据库的性能是比較低的由于它归根结底要对IO进行操作,
              假设对性能要求非常高,则能够用NOSQL来实现。由于NOSQL是常驻内存的,
             比方Redis。由于Redis的操作也是原子性的,这是就能够用Redis来保存商品的信息。


            
             假设Redis的性能也不够用的情况下怎么办? 我想是不是还有性能更高的NoSQL: 比方 MongDB,memcached? 


    以上仅仅是设想,没有实际用过。欢迎拍砖。



  • 相关阅读:
    Codeforces Gym 100571A A. Cursed Query 离线
    codeforces Gym 100500 J. Bye Bye Russia
    codeforces Gym 100500H H. ICPC Quest 水题
    codeforces Gym 100500H A. Potion of Immortality 简单DP
    Codeforces Gym 100500F Problem F. Door Lock 二分
    codeforces Gym 100500C D.Hall of Fame 排序
    spring data jpa 创建方法名进行简单查询
    Spring集成JPA提示Not an managed type
    hibernate配置文件中的catalog属性
    SonarLint插件的安装与使用
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/7183582.html
Copyright © 2011-2022 走看看