秒杀系统的设计猜想

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

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

整理出了一个思路。


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

将这些请求分散到不同的服务器上,那么做负载均衡的有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? 


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值