Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1857242
  • 博文数量: 211
  • 博客积分: 464
  • 博客等级: 下士
  • 技术积分: 3794
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-24 18:25
个人简介

阿弥陀佛

文章分类

全部博文(211)

文章存档

2020年(2)

2019年(3)

2018年(5)

2017年(6)

2016年(10)

2015年(9)

2014年(73)

2013年(90)

2012年(13)

分类: 服务器与存储

2017-01-24 10:54:28

消息分发系统需要在初始化时推送全量,全量数据比较大,这个量可能会重复计算。kafka是如何将数据直接推送过去的呢?
有一些是有依赖关系的数据。不同topic的数据是没有关系的,但是我们的系统,不同的topic的数据是有耦合关系的。

增加一种角色,该角色在内部保存一份全量,当用户请求时,直接将序列化好的数据直接发送给下一级用户。
如果我重启之后,下一级都记录了自己的数据消费位置,此时不需要再下发全量了,避免了下发全量的开销。

kafka对外提供producer的API,kafka不担心producer挂了,kafka只需要保证broker没有问题即可,这样kafka做的就是薄薄的一层broker的设计就可以了,使整个系统非常的简洁,扁平化,没有多个树形broker的支持。
在分布式系统中,不要设计出没有超时的永久阻塞调用,在线上遇到了这样一个问题:下级在等待阻塞在recv接收消息,结果上一级向下级发送数据时,网络连接异常,标记该连接为CLOSE。这样下一级无感该网络异常的变化,还在阻塞在recv处,导致该节点无法接受到配置。最好的做法是下一级定期向上一级发送心跳信息。
producer会向leader发送消息,leader broker接收到消息后,有3种选择:1,不确认继续想下发,2等待local log写入,3 等待所有的replication都写完再向下发下一条。
consumer会定期向上一级发送心跳信息,如果下一级不发送心跳信息,kafka的broker就会将节点剔除。
阅读(1024) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~