前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >初识kafka对消息处理与可靠性做出的保证

初识kafka对消息处理与可靠性做出的保证

作者头像
爬蜥
发布2019-07-09 10:22:07
7130
发布2019-07-09 10:22:07
举报

1. 保证分区消息的顺序。同一个生产者给同一个分区写消息一定是有序的

2. 所有的同步副本写入了消息时,才会被认为已经提交 3. 只要有一个副本是活跃的消息就不会丢失 4. 消费者只能提取已经提交的消息

broker对消息可靠性的处理

1. 复制系数。即一个消息应该有多少个副本(一般3个),这些副本在机架上如何分布,保证不会应为1个broker挂掉或者一个机架路由有问题而导致不可用。 2. 不完全首领选举。允许不同步的副本作为首领。坏处是对于同一个偏移量,不同步的副本作为首领之后,获取的是新数据,而原来的副本存储的是旧数据。

出现场景可能是

1. 假设3个副本,2个副本挂了,首领副本正常运行,这时候首领副本也挂了,随后启动了新的副本,数据不同步;

2. 3个副本中,首领副本正常,但是由于网络延迟跟随副本复制存在一定的延迟,如果首领副本挂了,其它副本都是不同步的

3. 最少同步副本。当分区同步副本数少于最少同步副本的时候,就停止接受生产者的消息,抛出异常。以避免不完全选举所产生的数据写入与读出预期不一致的情况

生产者对消息可靠性的处理

生产者对消息可靠性可以从两个方面引入。

  • 首先是假设acks=1,但是一共有3个副本,假如首领副本这时候恰巧崩溃,而其他的副本会被认为是同步的,对生产者而言,这里丢失了一个消息;
  • 其次是假设acks=all,即3个副本都是同步的才确认,如果恰好首领副本崩溃,在选举期间来的消息,生产者只会收到首领不可用的响应,需要生产者自己去处理消息。

因而需要考虑两个方面:

1. 是acks的设置,不过需要处理吞吐量和消息丢失的关系

ack越多丢失概率越小,但是吞吐量少,得等待收到所有的

2. 是生产者的重试机制,对于可重试的采用kafka内部的重试机制,不可重试的错误考虑保存到其它地方,后续进入.

重试带来的风险是消息重复

消费者对消息可靠性的处理

消费者的最大毛病在于万一提交了消息偏移量,但是却没有处理完,导致这段消息将永远不会被处理。所以最关键的地方在于如何处理消息偏移量。

  • 自动偏移提交:保证只提交已经处理过的偏移量
  • 手动偏移提交的策略:确保总是在处理往后再提交,确保提交不过于频繁不过与少,做适当的重试,确保需要一次性语义的场景能够满足

kafka的零拷贝是什么意思?

零拷贝依赖于操作系统。kafka中存在大量数据持久化道磁盘和磁盘文件通过网络发送。传统的方式来说,经历4次拷贝。首先系统将调用文件数据读到内存态Buffer,然后应用程序将内核态读入到用户态buffer,接着用户通过socket发送数据将用户态拷贝到内核态buffer,最后通过DMA拷贝将数据拷贝到NIC 【4次上下文切换】,在linux2.4+操作系统,sendfile系统调用通过零拷贝,数据从DMA拷贝到NIC Buffer,无需CPU拷贝

零拷贝来源,只有两次上下文切换

数据保留时长是多少?

每个主题可以配置保留时长或者大小。每个分区会有若干个片段,当前写入数据的片段(活跃片段),永远不会被删除,假如配置了保留5天的数据,那么会保留5天

默认1G或者一周,以小的为准,一个片段数据满了则关闭当前文件,打开新的,方便查找和删除

数据存储的文件格式?

储存格式与生产者发送,发送给消费者的格式一致。消息里不仅包含建和值,同时有大小,检验和,版本,压缩算法,时间戳

如何直接删除某个键?

应用程序发送一个相同的键,但是值为null的消息【称为墓碑消息】,进行常规清理时,只保留null消息,一段时间后,消费者消费时发现null的记录,知晓应该从数据库中删除,这段时间后,清理线程便清理掉墓碑消息

消费者如果离线了就干不掉了

kafka的compact策略?

适用场景:消息中存在一样的key,但是只需要保留最新的key的value。执行compact的时候,会早内存中构建一个map,key是消息键的hash,值是消息键的偏移量,读取一定量的污浊消息每个片段后,如果当前的消息key存在且偏移量小,值过期,或者是null,就抛弃,否则保存

向kafka塞入(读取)数据的方式?

1. 通过构建kafka客户端,进行读取或者写入。这种方式代码一般会被嵌入到应用程序

2. 使用Connect Api,面对的是市面上的存储系统,

Connect Api怎么处理与其它系统交互的?

connect api包含3个基本概念:worker进程,连接器,转换器

1. 连接器:她负责决定需要运行多少的任务,按照任务来拆分数据复制,从worker获取对应任务的配置并传递下去。而任务就负责将数据搬进和移出kafka,任务在初始化的时候会得到woker进程分配的源文件上下文,里面提供一些方法可以对数据进行清理,重试偏移量保存等等操作

2. worker进程:处理HTTP请求【定义连接器和连接器配置】、保存连接器的配置、启动连接器和连接器任务、将配置信息传递给任务、提交偏移量。总的来说,它负责配置管理、可靠性、高可用性、伸缩性和负载均衡

3. 数据转换:对于每种数据有自己的schema,源链接器通过转换器将数据保存到kafka,而目标连接器则使用worker指定的转换器转换成对应的格式

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年04月30日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • broker对消息可靠性的处理
  • 生产者对消息可靠性的处理
  • 消费者对消息可靠性的处理
  • kafka的零拷贝是什么意思?
  • 数据保留时长是多少?
  • 数据存储的文件格式?
  • 如何直接删除某个键?
  • kafka的compact策略?
  • 向kafka塞入(读取)数据的方式?
    • Connect Api怎么处理与其它系统交互的?
    相关产品与服务
    负载均衡
    负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档