先回答第一个问题:
尽管kafka服务器保证了消息的顺序,消息还是异步的发送给各个消费者,消费者收到消息的先后顺序不能保证了。这也意味着并行消费将不能保证消息的先后顺序。
来自:kafka入门介绍
核心意思是:虽然服务端保障了消息的顺序,但是多个消费者程序的能力参差不齐,也会而导致顺序的错乱。
所以只能1个分区对应1个消费者,并且只有这种可能。
1个分区注定只能有1个消费者(多个消费者就是上面说的,还是会导致错乱)。
我们来想象一下需要强一致性的业务,AB、AB顺序不能乱,举个话费充值的场景,先扣款再充值,如果顺序乱了,充值后再扣款,如果扣款不成功就会导致资损。
那么,我们来尝试一下,只有一个消费者的情况下如何来提高性能,顺序拿到消息后,多线程? 很遗憾不行,多线程大家都明白是无序的(其实和多消费者一个道理)。
答案只有一个:顺序消费,一笔一笔的来。
不成立,那就是2个业务了,之间注定是没有耦合的,顺序根本谈不上了,所以也排除了。
也不行,因为你看不到整个消息的全貌,你怎么知道这条消息是最新的,也无法排序。
将同一种业务,归类细分,比如手机号同一个地区的放到同一个分区里处理,这也是唯一能想到的基于业务拆分的性能提升方式了,kafka是做不到的。
总接下来,通过kafka自身是无法做到的,只能在业务上动手脚(业务再细分),鱼和熊掌不可兼得。
我这边把6443改成8443确实好用了,感谢这位老哥!
老哥,我找到问题了,haproxy.cfg里的6443端口要全部修改为8443,写这篇教程的人可太粗心了,搞死人了。
bin/kafka-consumer-groups.sh --bootstrap-server server:9092 --describe --all-groups