放肆

0 声望

这家伙太懒,什么都没留下

个人动态
  • 贬了 放肆kafka怎么保证消息的顺序消费,并且要保证性能高? 的评论!

    kafka的顺序保证

    先回答第一个问题:

    尽管kafka服务器保证了消息的顺序,消息还是异步的发送给各个消费者,消费者收到消息的先后顺序不能保证了。这也意味着并行消费将不能保证消息的先后顺序。
    来自:kafka入门介绍

    核心意思是:虽然服务端保障了消息的顺序,但是多个消费者程序的能力参差不齐,也会而导致顺序的错乱。

    所以只能1个分区对应1个消费者,并且只有这种可能。

    再来,性能问题

    1个分区注定只能有1个消费者(多个消费者就是上面说的,还是会导致错乱)。

    我们来想象一下需要强一致性的业务,AB、AB顺序不能乱,举个话费充值的场景,先扣款再充值,如果顺序乱了,充值后再扣款,如果扣款不成功就会导致资损。

    一个消费者

    那么,我们来尝试一下,只有一个消费者的情况下如何来提高性能,顺序拿到消息后,多线程? 很遗憾不行,多线程大家都明白是无序的(其实和多消费者一个道理)。

    答案只有一个:顺序消费,一笔一笔的来。

    将不同的业务发送到partition中?

    不成立,那就是2个业务了,之间注定是没有耦合的,顺序根本谈不上了,所以也排除了。

    根据业务时间戳?

    也不行,因为你看不到整个消息的全貌,你怎么知道这条消息是最新的,也无法排序。

    同一种业务再细分

    将同一种业务,归类细分,比如手机号同一个地区的放到同一个分区里处理,这也是唯一能想到的基于业务拆分的性能提升方式了,kafka是做不到的。

    最后

    总接下来,通过kafka自身是无法做到的,只能在业务上动手脚(业务再细分),鱼和熊掌不可兼得。

    2年前