秒殺場景
一般是在京東、淘寶活動日,譬如京東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>