可能这个库存服务部署了多个实例,那么必须保证说,执行数据更新操作,以及执行缓存更新操作的请求,对于同一商品的读写请求全部路由到同一台机器上。可以自己去做服务间的按照某个请求的参数做hash路由,也可以通过nginx服务器hash路由的功能路由到相同的服务实例上。
5.4 热点商品的路由问题,导致请求的倾斜万一某个商品的读写请求特别高,全部打到相同的机器的相同的队列里面去了,可能造成某台机器的压力过大。
但是因为只有在商品数据更新的时候才会清空缓存,然后才会导致读写并发,所以更新频率不是太高的话,这个问题的影响并不是特别大。
但是的确可能某些机器的负载会高一些。
三、总结一般来说,就是如果你的系统不是严格要求缓存+数据库必须一致性的话,缓存可以稍微的跟数据库偶尔有不一致的情况,那最好不要上述的串行化的这个方案,因为读请求和写请求串行化,串到一个内存队列里去,这样是可以保证一定不会出现不一致的情况。但是,串行化之后,就会导致系统的吞吐量会大幅度的降低,你就需要用比正常情况下多几倍的机器去支撑线上的一个请求。
另外,不是说,讲课的、写文章的就是超人,万能的。就跟写书一样,很可能会写错,也可能有些方案里的一些地方,没考虑到。或者有些方案只是适合某些场景,在某些场景下,可能需要你进行方案的优化和调整才能适用于你自己的项目。
如果大家觉得对这些方案有什么疑问或者见解,都可以沟通交流。如果的确觉得是讲解的不对,或者有些地方考虑不周,那么都是可以交流的,多多包涵。
整理自中华石杉老师的互联网Java突击面试课程。欢迎一起学习交流。