【面试系列】接口幂等本质就是去重吗?

小茵:聊聊你对【去重】和【幂等】的理解吧

小奥:我认为【幂等】和【去重】他们很像,我也说不出他们的严格区别

小奥:我说下我个人的理解,我也不知道对不对

小奥:【去重】是对请求或者消息在【一定时间内】进行去重【N次】

小奥:【幂等】则是保证请求或消息在【任意时间内】进行处理,都需要保证他的结果是一致的

小奥:不论是【去重】还是【幂等】,都需要对一个有【唯一Key】,并且有地方对唯一Key进行【存储】

image.png

小奥:以项目举例,我维护的「消息管理平台」是有「去重」的功能的:「5分钟相同内容消息去重」「1小时内模板去重」「一天内渠道达到N次阈值去重」…

小奥:再次强调下「幂等」和「去重」的本质:「唯一Key」+「存储」

小茵:那你是怎么做的呢

小奥:不同的业务场景,唯一Key是不一样的,由业务决定

小奥:存储选择挺多的,比如「本地缓存」/「Redis」/「MySQL」/「HBase」等等,具体选取什么,也跟业务有关

小奥:比如说,在「消息管理平台」这个场景下,我存储选择的「Redis」(读写性能优越),Redis也有「过期时间」方便解决「一定时间内」的问题

小奥:而唯一Key,自然就是根据不同的业务构建不同的。

小奥:比如说「5分钟相同内容消息去重」,我直接MD5请求参数作为唯一Key。「1小时模板去重」则是「模板ID+userId」作为唯一Key,「一天内渠道去重」则是「渠道ID+userId」作为唯一Key…

image.png

小茵:既然提到了「去重」了,你听过布隆过滤器吗?

小奥:自然是知道的啦

小茵:来讲讲布隆过滤器吧,你为什么不用呢?

小奥:布隆过滤器的底层数据结构可以理解为bitmap,bitmap也可以简单理解为是一个数组,元素只存储0和1,所以它占用的空间相对较小

小奥:当一个元素要存入bitmap时,其实是要去看存储到bitmap的哪个位置,这时一般用的就是哈希算法,存进去的位置标记为1

小奥:标记为1的位置表示存在,标记为0的位置标示不存在

image.png

小奥:布隆过滤器是可以以较低的空间占用来判断元素是否存在进而用于去重,但是它也有对应的缺点

小奥:只要使用哈希算法离不开「哈希冲突」,导致有存在「误判」的情况

小奥:在布隆过滤器中,如果元素判定为存在,那该元素「未必」真实存在。如果元素判定为不存在,那就肯定是不存在

小奥:这应该不用我多解释了吧?(结合「哈希算法」和「标记为1的位置表示存在,标记为0的位置标示不存在」这两者就能得出上面结论)

小奥:布隆过滤器也不能「删除」元素(也是哈希算法的局限性,在布隆过滤器中是不能准确定位一个元素的)

image.png

小奥:如果要用的话,布隆过滤器的实现可以直接上Guava已经实现好的,不过这个是单机的

小奥:而分布式下的布隆过滤器,一般现在会用Redis,但也不是没个公司都会部署布隆过滤器的Redis版(还是有局限)

image.png

小奥:如果「去重」开销比较大,可以考虑建立「多层过滤」的逻辑

小奥:比如,先看看『本地缓存』能不能过滤一部分,剩下「强校验」交由『远程存储』(常见的Redis或者DB)进行二次过滤

小茵:嗯,那我就想起你上一次回答Kafka的时候了

小茵:当时你说在处理订单时实现了at least one + 幂等

小茵:幂等处理时:前置过滤使用的是Redis,强一致校验时使用的是DB唯一索引,也是为了提高性能,对吧?

小茵:唯一Key 好像就是 「订单编号 + 订单状态」

小奥:一般我们需要对数据强一致性校验,就直接上MySQL(DB),毕竟有事务的支持

小奥:「本地缓存」如果业务适合,那可以作为一个「前置」判断

小奥:Redis高性能读写,前置判断和后置均可(:

小奥:而HBase则一般用于庞大数据量的场景下(Redis内存太贵,DB不够灵活也不适合单表存大量数据)

image.png

小奥:至于幂等,一般的存储还是「Redis」和「数据库」

小奥:最最最最常见的就是数据库「唯一索引」来实现幂等(我所负责的好几个项目都是用这个)

小奥:构建「唯一Key」是业务相关的事了(:一般是用自己的业务ID进行拼接,生成一个”有意义”的唯一Key

小奥:当然,也有用「Redis」和「MySQL」实现分布式锁来实现幂等的(:

小奥:但Redis分布式锁是不能完全保证安全的,而MySQL实现分布式锁(乐观锁和悲观锁还是看业务吧,我是没用到过的)

小奥:网上有很多实现「幂等」的方案,本质上都是围绕着「存储」和「唯一Key」做了些变种,然后取了个名字…

小奥:总的来说,换汤不换药(:

小茵:恩...了解了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容