美文网首页
记一次面试

记一次面试

作者: 陈宏斌9527 | 来源:发表于2019-04-27 21:21 被阅读0次

面试官:使用Kafka,如何保证消息的顺序性?
我:设置partition为1,同一个partition肯定是能保证顺序的,多个partition就保证不了了。
面试官: .........
我察言观色后,觉得,这肯定不是他想要的答案。线上谁会把partiton设置为1啊。
我:可以让需要排序的消息保证的数据,用同一个key,然后消费的时候,让同一个key的数据都走同一个partition,partition的数量=consumer的数量,让一个consumer消费一个partition。
面试官:你的回答说明你知道kafka的一些原理,但是这不是我想要的答案。我说一个实际的场景,你结合这个场景来回答。比如直播场景,用户给主播点赞,连点的话,屏幕会依次出现,1,2,3,4........显示用户最高连点赞的数。服务端接受手机客户端(android或者ios)发来的消息,有可能因为网络原因,5比4先到。我们每收到一个消息,就扔到kafka里,在consumer里调用第三方的api,让客户在屏幕上看到动效。如果手机屏幕显示完5以后,再显示4就是bug。你想想看,你的partition的方案,能解决我这个问题吗?
我想:好像真的不能,如果5先到,然后先发给消费者了,即使是同一个partiton,kafka按照offset先后排序,还是5先显示,4后显示,显然解决不了。
我:那就需要consumer消费的时候,key能让consumer感知到需要排序,消费到一个就往共享内存如redis里放,利用redis的有序集合,放的时候就排好序。然后启动一个线程,该线程的逻辑就是不断的从该有序集合里取,并调用第三方api让用户看到动效。
面试官:但是consumer有多个啊?
我:可以在启动线程之前,上一个分布式锁,如果每抢到锁,就不启动线程,只是往共享内存里放。
面试官:这个方案,可以解决我的问题,但过于复杂,还要用到redis,还要上分布式锁,能否设计的再简单点?
我:......
我:让同一个key都走同一个partition,正如我最开始说的那样,然后利用PriorityQueue,放进去再取就是有序的。再启动一个线程,一个个取出来,调用第三方api,直到取完。

相关文章

  • 记一次 Google 面试经历

    记一次 Google 面试经历 记一次 Google 面试经历

  • 2018-08-05

    记第一次面试家教,失败。

  • NLP 面试题(二)和答案,附有参考URL

    面试题目:记第一次NLP面试 链接:https://zhuanlan.zhihu.com/p/83080115 注...

  • 面试题

    Java面试题集 - 简书 Java内部类详解 - 海 子 - 博客园 记一次 Android 面试 - 简书 A...

  • 记一次面试

    今天的考试也许就真的是厉害了,理论+英语+操作+计算机,本来上午都没期待自己笔试能过的,没想到阴差阳错竟然进了前3...

  • 记一次面试

    内存泄漏和内存溢出 概念 内存泄漏:垃圾回收器无法回收原本应该被回收的对象,这个对象就引发了内存泄露。 内存溢出:...

  • 记一次面试

    谢谢同学费尽心思帮我找熟人帮忙,也谢谢在百度工作的姐姐不厌其烦的帮助我,今天下午二点我接到了内容生态质量部php实...

  • 记一次面试

    两周前的一次面试,出师不利,对方很是在意我的互联网认知和产品方法论,我一时说出来的全都对不上对方的胃口。回头细想原...

  • 记一次面试

    今天,面试一位大四的小伙子,心中有点感慨。 由于公司需要,最近一直在面试,全职的有,实习的也有;本科还未毕业的95...

  • 记一次面试

    目前我已经工作两年了,想专门从事前端开发工作,结果离职出来,前端已经发生翻天覆地的变化了,不知自己从何选择,早上面...

网友评论

      本文标题:记一次面试

      本文链接:https://www.haomeiwen.com/subject/gdllnqtx.html