kafka的故事

1、kafka的应用场景(一般不需要强耦合的系统间会采用这种方式)

(1)当业务中的某一个非重要功能点需要暂时从其他业务方调用的时候,可以用kafka消息队列去订阅业务方产生的消息 。好处:当不需要调用其业务方的时候,不去订阅就OK了(可以去掉与其相关的注解或者配置就ok 不用大量取改动代码)

 

 

2、kafka的作用:

(1)可以进行异步处理

(2)利于用于系统间的解耦(例如:有些业务间的关联性不是很大,这个时候就可以利用kafka去调用业务方的相关信息,当不想消费这些信息了 就可以不去订阅了 这样就实现了解耦)

(3)底层可以进行分布式处理(消除流量高峰)

 

3、Kafka的生成者、消费者、broker的基本概念

broker就是kafka集群中的一个个节点,实际数据的存储就是放在这里面的

 

(1)kafka是一款基于发布与订阅的消息系统。它一般被称为“分布式提交日志”或者“分布式流平台”。文件系统或者数据库提交日志用来提供所有事物的持久化记录,通过重建这些日志可以重建系统的状态。同样地,kafka的数据是按照一定顺序持久化保存的,可以按需读取。

利用zk来管理这个集群里面的机器,保证数据的一致性或者其它的性质

ZooKeeper是一种用于管理分布式系统的集中式服务。它为其管理的分布式系统提供分层键值存储,配置,同步和名称注册服务。ZooKeeper充当集合层(将事物联系在一起)并确保Kafka集群的高可用性。Kafka节点也称为代理。重要的是要理解Kafka在没有ZooKeeper的情况下无法工作。

从ZooKeeper节点列表中,其中一个节点被选为领导者,其余节点跟随领导者。在ZooKeeper节点发生故障的情况下,其中一个关注者被选为领导者。强烈建议使用多个节点以实现高可用性,不建议使用超过7个节点。

ZooKeeper存储元数据和Kafka集群的当前状态。例如,主题名称,分区数量,复制,请愿的领导者详细信息以及消费者组详细信息等详细信息存储在ZooKeeper中。您可以将ZooKeeper视为项目经理,他负责管理项目中的资源并记住项目的状态。

(2)kafka的特点

(i)同时为发布和订阅提供高吞吐量

(ii)可以进行持久化操作,将信息持久化在磁盘中,以日志的形式存储,因此可用于批量消费,防止数据丢失

(iii)分布式系统,易于向外拓展。所有的Producer、broker和consumer都会有多个,均为分布式。无需停机即可拓展机器。

(iiii)消息被处理的状态是在consumer端维护,而不是由server端维护,当失败时能自动平衡。

去哪网公司应用的技术qmq(一种消息队列)

(3) Producers的概念

消息和数据生成者,向Kafka的一个topic发布消息的过程叫做producers

Producer将消息发布到指定的Topic中,同时Producer也能决定将此消息归属于哪个partition;比如基于round-robin方式 或者通过其他的一些算法等;

异步发送批量发送可以很有效的提高发送效率。kafka producer的异步发送模式允许进行批量发送,先将消息缓存到内存中,然后一次请求批量发送出去。

(4) broker的概念:

Broker没有副本机制,一旦broker宕机,该broker的消息将都不可用。

Broker不保存订阅者的状态,由订阅者自己保存。

无状态导致消息的删除成为难题(可能删除的消息正在被订阅),Kafka采用基于时间的SLA(服务保证),消息保存一定时间(通常7天)后会删除。

消费订阅者可以rewind back到任意位置重新进行消费,当订阅者故障时,可以选择最小的offset(id)进行重新读取消费消息

(5) Message组成

Message消息:是通信的基本单位,每个producer可以向一个topic发布消息。

Kafka中的Message是以topic为基本单位组织的,不同的topic之间是相互独立的,每个topic又可以分成不同的partition每个partition储存一部分

partion中的每条Message包含以下三个属性:

(6)Consumers的概念

消息和数据消费者,订阅topic并处理其发布的消息的过程叫做consumers.

在kafka中,我们可以认为一个group是一个“订阅者”,一个topic中的每个partions只会被一个“订阅者”中的一个consumer消费,不过一个consumer可以消费多个partitions中的消息

注: Kafka的设计原理决定,对于一个topic,同一个group不能有多于partition个数的consumer同时消费,否则将意味着某些consumer无法得到消息

 

Q:这些消息系统最关键的是保证生产的消息一定被保存了;在某些情况下(比如:比如扣款),如何保证一个消息只能别消费一次呢?

A:通过ack机制(确认机制)

Q:关于重复消费的可能(比如一个人可以领取多张券)这种情况怎么处理呢?

A:这种情况可以通过消息队列处理,但是这样一般会降低系统性能,一般要采用锁机制,也可以通过业务上保证,通过幂等(重复提交)来实现

 

Q:如何去订阅or取消这些消息呢

A:一般通过代码中增加注解或者通过配置文件的形式;取消消息的话 可以同取消这些注解/删除相关的配置文件就ok

 

Q: 如果提供方的服务挂了会对我们消费方产生什么影响呢?

A:一般来说暂时拿不到消息去消费不会对消费方产生重大影响。一般情况下,业务方都会提供多台服务,只要不是提供这个服务的所有机器都挂了,可以将流量打到其他机器上维持一段时间(一般从流量的入口,会通过nginx等进行流量的分配;流量到了后端 可以通过将服务注册到多台机器上,通过zk来管理;为了避免会产生影响,可以做服务降级处理)

Q:kafka如果读写数据?

A:下图就展示了Kafka是如何写入数据的, 每一个Partition其实都是一个文件 ,收到消息后Kafka会把数据插入到文件末尾

这种方法有一个缺陷——没有办法删除数据 ,所以Kafka是不会删除数据的,它会把所有的数据都保留下来,每个消费者(Consumer)对每个Topic都有一个offset用来表示读取到了第几条数据 。

Q: Kafka为什么速度那么快?

A:Kafka的消息是保存或缓存在磁盘上的,一般认为在磁盘上读写数据是会降低性能的,因为寻址会比较消耗时间,但是实际上,Kafka的特性之一就是高吞吐率。

即使是普通的服务器,Kafka也可以轻松支持每秒百万级的写入请求,超过了大部分的消息中间件,这种特性也使得Kafka在日志处理等海量数据场景广泛应用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值