秒杀系统的设计猜想

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

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

整理出了一个思路。


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? 


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