进行mayr模型串联时出现了这种红线,有人懂如何解决吗,这条红线如何修改才能不出现错误呢
商品之间无关,所以多件商品和一件商品的情况类似。在用户下单后,n 件商品经过过滤,最终每件商品只有有效请求到达数据库,大大减少了数据库的压力。
比如,限制每个用户只能买 3 种商品,每个商品限购 2 件,系统应该怎么设计?
根据“只能有效请求到达数据库”原则,多余秒杀的商品不应该到达数据库浪费I/O资源,因此应该做前置过滤。解决方法是将 redis 集群前移。在 redis 里面将售卖规则创建成 key,后续用业务逻辑判断此次用户请求是否能够生成订单。
比如,一个用户请求到达之后,去 redis 取商品种类、商品单品数量、用户 id,带着想要秒杀的商品的 itemid 一起返回到 tomcat,由业务逻辑判断这个用户能不能下单,从而识别“有效请求”。你也可以用 redis 事务来处理一个用户的多个减库存,防止超出限购数量。识别了有效请求(防止超卖)后,生成订单即可,因为第三方支付是异步的,后续订单可以走队列了,无需再加锁。队列的迁移到后续的分库分表,是后续调优要考虑的问题。
另外,商品数量足够大的话,不同商品可能放在 redis 不同的节点中,稍显复杂,这个是开发人员要考虑的逻辑。redis 分区后,就不能使用 LUA 脚本和事务实现上述多个判断逻辑了,需要自己写逻辑实现了。