kafka怎么保证分区有序?

732 阅读1分钟

这个需要看业务的需求:

  1. 如果没有业务要求可以直接把topic设置一个分区再把生产者发送到服务端数据的请求数设置为1,这样就可以保证有序但是性能会下降
  2. 通过生产者幂等性幕等的保证给每条消息加一个seqnum每条消息有自己序列之后,服务端对于当前最新的seqnum大于1的消息给拒绝这样也可以保证消息的有序
  3. 如果数据从头到尾都是键值结构且键值都可以为null可以根据自定义设定key来保证消息有序,我以前就遇到过一个订单有两条消息一个支付消息一个是发货消息,因为但是这个两个消息的key都是用的订单ID这样我们就可以把这个两个消息放到同一个分区这个就保证了每个消费的的顺序
  4. 还有以前在做canal集成到kafka时候发现有些数据有先后顺序当时设置的分区也多导致了跨分区消费是无序的导致了更新日志在插入日志之前了导致异常,后面我就把同一个表同一个主键的数据发到同一个分区如果多库还可以加上库名在之后把库名+表名+主键做为参数传入到分区这样就可以做到消费有序了