kafka同步怎么解决乱序问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kafka同步怎么解决乱序问题相关的知识,希望对你有一定的参考价值。
参考技术A 我不确定是否百分之百地理解了您的问题,针对您所说的“消息顺序完全是乱的”,我个人认为可能有三个方面的含义,不确定您指的是哪个方面。索性就一并说下:1. 消息全局顺序是乱的:这个应该是正常的。目前Kafka并不保证全局的消息顺序,只是提供分区级别的顺序性。如果您指这个,貌似无解。
2. 消息在单个分区内是乱序的:如果是这种情况,建议调整max.in.flight.requests.per.connection = 1(若没有启用retries,则不必调整该参数)如果您没有启动retries亦或是调整之后还发现乱序,可以结合日志进一步研究发生乱序的原因。
3. 某条消息在源集群中属于分区A,在目标集群中属于分区B:这种情况是非常有可能的,因为Kafka本身就允许source和target集群中同一个topic可以有不同的分区数,所以这种乱序极其常见。即使source和target指定了相同的分区数,也是可能发生这种情况的。要避免这种乱序有一点麻烦,需要满足以下几个条件:
消息必须有key,无key消息的分区我们不太好控制
单独创建一个自定义的分区策略,并打成jar包(比如custom-partitioner.jar)供source和target使用
把该jar包加到source集群producer程序的classpath中
在target集群启动之前把该jar包加入到broker的classpath中
在MirrorMaker的producer.config中指定partitioner.class为上面jar中的Partitioner实现类
希望以上内容对您有所帮助~本回答被提问者采纳
15 同步于互斥 并发竞态和编译乱序执行乱序
1 并发和竞态
1.1 简介
设备在运行的过程中存在多个进程对资源的并发访问
多个执行单元同时,并行的执行。并发事件对共享资源的访问(硬件资源,全局变量,静态变量等),很容易导致设备出现竞态。
竞态的出现会导致设备出现异常
1.2 单核和多核(SMP)并发下的竞态
1.3 总结
关于共享资源的这部分临界区我们需要保护起来防止多个进程同时操作;可以采用的途径为:中断屏蔽、原子操作、自旋锁、信号量、互斥体等
2 编译乱序和执行乱序
2.1 编译乱序
在使用gcc编译是使用-O0 -O1 -O2 -O3参数时编译器并不会严格按照代码逻辑去编译生成目标文件。可能导致某些未知错误。
需要注意的是此时使用volatile并能从实际上解决这个问题,因为volatile在这里的作用太弱。
volatile的作用:简而言之就是避免内存访问行为的合并。怎么理解呢?
valatile修饰的内存将会标记为易变的。如果一个值被连续访问两次,两次都是同一个值。没有volatile的修饰,编译器便会将两次读取合并为一次,显然这是不能够接受的。
2.2 执行乱序
执行乱序即在CPU中执行一个代码段时,并不一定是按照我们的理解一个一步去执行的。
如下面代码段
a = 1;
b = 2;
c = 3;
CPU可能先执行c = 3在执行a = 1;当然这个过程对单核程序是不可见的,对我们来说更是不可能感知到的。因为正过程对外不可见,那么对于SMP系统中,如果存在部分执的修改在CPU0上执行在CPU1上read那么久可能出现异常。
2.3 总结
当然内核中SMP系统中的这些问题有他自己的解决方法,这里便不展开去分析。
以上是关于kafka同步怎么解决乱序问题的主要内容,如果未能解决你的问题,请参考以下文章
Kafka:如果保留每个分区的顺序,在啥情况下主题的消息会乱序