秒殺場景高併發處理

秒殺場景

一般是在京東、淘寶活動日,譬如京東618秒殺,淘寶雙11秒殺等,其本質即是超大的流量訪問秒殺接口,真正秒殺到的用戶很少;要求服務器能夠承載超大流量用戶的請求,保證用戶體驗。


如何能夠提高用戶體驗呢?

其實就是針對大流量進行削峯,限流,提高服務器併發量,秒殺架構圖如下圖所示:

秒殺架構圖

  • 服務器層面

可以水平擴展(增加服務器數量),垂直擴展(提高單機處理能力,增加cpu核心、內存等)

  • 前端處理CDN加速、靜態化頁面、驗證碼等

  • 代理層面

Nginx(可做集羣)反向代理,ip訪問頻率限制、ip黑名單限制、負載均衡(ip_hash、權重、輪詢、第三方等)等

  • 應用層面

緩存(Redis集羣)存儲商品庫存、產品主要信息,消息隊列(Rabbit MQ)異步處理庫存扣減、商品訂單生成入庫


注意

redis配置防止存儲亂碼

    @Bean
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);

        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(new StringRedisSerializer());
        template.setKeySerializer(new StringRedisSerializer());
        template.afterPropertiesSet();
        return template;
    }

防止數據庫庫存亂扣(添加個樂觀鎖)

    <update id="updateByStockId" parameterType="tjs.ax.seckill.bean.Stock">
        update t_stock set stock = stock - 1,data_version = data_version + 1
        where id = #{stock.id} and data_version = #{stock.dataVersion}
    </update>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章