问题:
  kafka如何发送顺序消息
  方案:kafka可以通过partitionKey,将某类消息写入同一个partition,一个partition只能对应一个消费线程,以保证数据有序。
  也就是说生产者在写消息的时候,可以指定一个 key,比如说我们指定了某个订单 id 作为 key,那么这个订单相关的数据,一定会被分发到同一个 partition 中去,而且这个 partition 中的数据一定是有顺序的。
  

  Kafka如何保证单partition有序

  方案:消费者端创建多个内存队列,具有相同 key 的数据都路由到同一个内存 队列;然后每个线程分别消费一个内存队列即可,这样就能保证顺序性

总结:若要解决kafka消息顺序性问题有以下方案
 
方案一,kafka topic 只设置一个partition分区(失去kafka分布式功能)
 
方案二,producer将消息发送到指定partition分区
 
解析:
方案一:kafka默认保证同一个partition分区内的消息是有序的,则可以设置topic只使用一个分区,这样消息就是全局有序,缺点是只能被consumer group里的一个消费者消费,降低了性能,不适用高并发的情况
 
方案二:既然kafka默认保证同一个partition分区内的消息是有序的,则producer可以在发送消息时可以指定需要保证顺序的几条消息发送到同一个分区,这样消费者消费时,消息就是有序。
 
producer发送消息时具体到topic的哪一个partition分区,提供了三种方式
 
1)指定分区
 
2)不指定分区,有指定key 则根据key的hash值与分区数进行运算后确定发送到哪个partition分区
 
3)不指定分区,不指定key,则轮询各分区发送(若出现网络问题依然还是会出现顺序错误)
 
注:
可以通过message key来定义,因为同一个key的message可以保证只发送到同一个partition,比如说key是user id,table row id等等,所以同一个user或者同一个record的消息永远只会发送到同一个partition上,保证了同一个user或record的顺序。如果你有key skewness 就有些麻烦,需要特殊处理

最新文章

  1. C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 远程同步服务器大量基础数据到客户端
  2. 1.表单中 get与post提交方法的区别?
  3. rpm 更新/升级 软件包(libGL-devel手动安装过程)
  4. angularJs中上传图片/文件功能:ng-file-upload
  5. C++ char和string的区别
  6. android怎样查看当前project哪些profile是打开的
  7. Python NLP入门教程
  8. [福大软工] W班 软工实践原型设计—成绩公布
  9. BZOJ1187 [HNOI2007]神奇游乐园(插头dp)
  10. Jmeter5.1.1构造https请求
  11. Symbol Vs String
  12. Linux下路由配置梳理
  13. NCBI之gene系列
  14. js 判断字符串是否包含某字符串,String对象中查找子字符,indexOf
  15. Gym 101201F Illumination (Two-Sat)
  16. UOJ#316. 【NOI2017】泳池
  17. NPOI导出Excel时出现错误“Maximum column number is 255”
  18. 从FastDFS官网下载我们需要的安装包
  19. Coherence 简介
  20. [原]Linux 命令行浏览器

热门文章

  1. 华为云发布冷启动加速解决方案:助力Serverless计算速度提升90%+
  2. CSS中的各种格式化上下文-FC(BFC)、IFC、GFC、FFC)
  3. freeswitch号码黑名单
  4. Swagger2多包扫描
  5. vue3 ts遇到的问题
  6. .Net Core中使用NEST简单操作Elasticsearch
  7. flutter系列之:在flutter中使用导航Navigator
  8. JZOJ 3527.迷宫花坛(garden)
  9. js获取时间戳的方法
  10. Sublime Text 3怎么配置本地服务器?