秒杀系统的设计猜测

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

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

整理出了一个思路。数据库


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

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


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

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

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

负载均衡

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

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

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


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


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

相关文章
相关标签/搜索