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? 


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



  • 相关阅读:
    高阶函数
    js严格模式
    改变函数内this指向方法——call、apply、bind
    vue动态组件
    微信支付接口IP获取与调用之统一下单
    node.js实现微信公众号支付
    微信支付(公众号支付JSAPI)--转载
    公众号微信支付流程-(转)
    python 3 代码一模一样,出现运行结果不同的情况(只是不以为一样而已)
    pycharm设置自动换行
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/7183582.html
Copyright © 2011-2022 走看看