• shuff1e
    2023-08-18 来自北京
    之前遇到过类似场景,QPS不高,用了一个分布式的悲观锁,同一个key的请求都会竞争这个分布式锁,只有竞争成功的才会继续往下执行。 没有想到过布隆过滤机,bit array,再加上redis的方案,可能是场景也不太一样。 不过也不得不感叹一句,人外有人,天外有天,大明老师还是对这种case做了一个系统的分析。

    作者回复: 嘿嘿,感谢感谢。你还可以考虑将同一个 Key 的都打过去一个分区,然后直接就不需要锁了。小心 rebalance 问题就可以。

    
    2
  • Hong
    2023-08-30 来自北京
    感觉布隆过滤器的假阳性坑挺大的,面试的时候能否这么设计呢:bitmap数组 + redis + mysql唯一索引,作为两点方案呢,因为大多数业务的用的唯一约束都是数字感觉。

    作者回复: 可以啊,这就是我在后面提到的,你可以用 bitmap 取代布隆过滤器。 不过bitmap 之后其实没太大必要接 Redis 了,因为 bitmap 咩有假阳性。也就是说,Bitmap 说有就是有,没有就是没有。

    共 2 条评论
    1
  • 陈斌
    2023-08-19 来自广东
    问题1: 如果隔离级别不是RR,就会出现在插入成功唯一索引之后,业务操作完成之后提交事务可能会出现失败的情况,导致因为索引冲突而引起的不必要的回滚。如果隔离级别为RR的话,就不会出现上述情况。 问题2: 老师您说的最后一种方案我认为是:布隆过滤器 + redis + 唯一索引方案 重复请求占比为百分之1的话,该方案可以将近99%的流量挡在布隆过滤器 与 redis 层级,当然前提是redis的键值失效时间设置合理或者说重复请求的间隔时间很短或者说布隆过滤器没有出现假阳性,此时系统可以承受高并发流量。

    作者回复: 哈哈哈哈,问题 2 可能出乎你的预料,重复请求占比 1% 的话,你只能挡住这 1% 的重复请求。 你可能会奇怪,这不就是寄了吗?但是你要知道,如果你连正常的流量都处理不了,就不用谈别的了。

    共 3 条评论
    1
  • ZhiguoXue_IT
    2023-09-30 来自山西
    老师请教一下,如果不是rr,唯一索引依然能用呢,有什么问题吗?

    作者回复: 并没啥问题,就是直接用。

    
    
  • Geek_48fcdf
    2023-09-08 来自北京
    布隆+redis+唯一键方案里,布隆过滤器如果使用机器内存则那么无法解决分布式问题,如果使用redis存就得查两次redis,这里的布隆过滤器怎么个部署才有意义?

    作者回复: 一个是结合前面的一致性哈希负载均衡,这样使用本地的布隆过滤器效果还可以。 如果使用 Redis 的话,确实是难以避免两次 Redis 操作。也可以考虑使用 lua 脚本直接封装。

    
    
  • Geek8004
    2023-09-02 来自中国香港
    非本地事务将数据插入到唯一索引的第二步处理业务逻辑,第三步将唯一索引对应的数据标记为完成状态.其中第二部为什么不可能失败呀,为什么只可能是第三步将唯一索引对应的数据标记为完成状态会失败? 假如处理业务逻辑里面 有调接口,或者插入数据到别的库表

    作者回复: 这里有一个区别。你业务上的成功和系统上成功。 举个例子来说,如果插入唯一索引之后,你的业务逻辑执行失败了,但是这是符合你的系统的预期的,这在这里也叫做业务成功=。=。 也就是说,只要你的业务执行了,根据输入是成功与失败,这里不关心的。 在异步检测系统里面,它只检测初始状态,然后去对比你的业务实际执行情况,执行更新。

    
    
  • tyro
    2023-08-28 来自广东
    老师关于思考题1 我在除串行外的三种隔离级别测试,重复请求都会阻塞。没有区别啊 求解惑🙏

    作者回复: 看上去就都是阻塞啊,哈哈哈哈,不过底层细节上有一些不同,主要和锁机制有关。

    
    
  • peter
    2023-08-20 来自北京
    布隆过滤器具体是什么?是个DLL?或者一个jar包?另外,bit array具体是什么?是个数据类型吗?

    作者回复: 是一种数据结构,有多种实现,可以本地实现,也可以借助 Redis 来实现。

    
    
  • TimJuly
    2023-08-19 来自北京
    如果处理逻辑比较复杂时间比较长,那么这个这将是一个长事务 1、长事务对 MySQL 的压力如何解决? 2、第二个并发的消息进来了,此时会进入锁等待,如果超时时间设置的不合理,有可能把应用拖挂,那么超时设置多久比较合理? 3、第二个消息等待锁时会不会触发 MySQL 的死锁检测?会对数据库性能产生多大影响?

    作者回复: 1. 不要用长事务……政治正确但是无用的屁话。你可以考虑切割成几个小事务,然后引入重试机制,寻求最终一致性。你也可以给事务设置超时时间,这样超过时间限制的事务就直接回滚了。 2. 什么锁?是唯一索引那里的锁吗?这里,理论上来说,这个超时时间是你预期别的业务的执行时间。这可以参考后续我分布式锁里讲到的,分布式锁拿锁应该等待多久。 3. 数据库性能这边我没有评估过,但是如果你业务并发很高,重复请求很多的话,确实影响很大。另外一个影响是,第二个消息等待锁的时候,一直拿着这个数据库连接。

    
    
  •  扬帆丶启航 
    2023-08-18 来自福建
    非本地事务唯一索引方案中,异步检测系统检测执行到业务失败后触发重试。这里的重试时直接执行业务方法还是直接再重新发送一条请求到消息队列中。如果是直接发送一条消息到消息队列中,在消费的时候不是还会触发唯一索引冲突吗?

    作者回复: 要求业务方绕开这个唯一索引重试。相当于,除了没有插入唯一索引这个动作,其它都是一样的。

    共 2 条评论
    