初识kafka
kafka(分布式提交日志、分布式流平台)是一个分布式发布-订阅消息系统;强大的队列。
可以处理大量数据,并能够使消息从一个断点传递另一个断点。
适合离线和在线消息消费。
kafka消息保留在磁盘上,并在群集内复制,以防止数据丢失。
kafka构建在zk同服务之上。与Apache Storm和spark非常好的集成,用于实时流式数据分析。
kafka的优点:
性能(对于发布和订阅消息具有高吞吐量,即使TB消息,也能保证稳定的)、可靠性、耐用性(分布式提交日志,这保证了消息尽可能快保留在磁盘上,因此是持久的)、可扩展性(Kafka消息传递系统轻松缩放,无需停机)。
kafka数据处理步骤:
1、Producer产生消息,发送到Broker中
2、Leader状态的Broker接收消息,写入到相应topic中
3、Leader状态的Broker接收完毕以后,传给Follow状态的Broker作为副本备份
4、Consumer消费Broker中的消息
发布-订阅
数据(消息)的发送者(发布者)不会直接把消息发送给接收者,这是发布与订阅消息系统的一个特点。发布者以某种方式对消息进行分类,接收者(订阅者)订阅它们。以便接收特定类型的消息。发布与订阅系统一般会有一个broker,也就是发布消息的中心点。
- 消息和批次
kafka的数据单元:消息
可以将消息看成数据库里的一个“数据行“或者一条“记录“。消息由字节数据组成。
对于Kafka,消息里的数据没有特别的格式或含义。 消息可以有一个可选的元数据(键)。 键也是一个字节数组,与消息一样,对Kafka来说也没有特殊含义。 当消息以一种可控的方式写入不同的分区时,会用到键。
最简单的例子:为键生成一个一致性散列值,然后使用散列值对主题分区数进行取模,为消息选取分区。 这样可以保证具有相同键的消息总是被写到相同的分区上。
为了提高效率,消息被分批次写入Kafka。批次(一组消息),这些消息属于同一个主题和分区。如果每一个消息都单独穿行于网络,会导致大量的网络开销,把消息分成批次传输可以减少网络开销。不过,,这要在时间延迟和吞吐量之间作出权衡:批次越大,单位时间内处理的消息就越多,单个消息的传输时间就越长。 批次数据会被压缩,这样可以提升数据的传输和存储能力,但要做更多的计算处理。
- 消息和分区
Kafka的消息通过主题进行分区。主题就好比数据库的表,或者文件系统的文件夹。主题可以被分为若干个分区,一个分区就是一个提交日志。消息以追加的方式写入分区,然后先入先出的顺序读取。 要注意,由于一个主题一般包含几个分区,因此无法在整个主题范围内保证消息的顺序,但可以保证消息在单个分区内的顺序。
主题有4个分区,消息被追加写入每个分区的尾部。Kafka通过分区来实现数据冗余和伸缩性。分区可以分布在不同的服务器上。一个主题可以横跨多个服务器,以此来提供比单个服务器更强大的性能。
公司分布式项目用到了kafka消息中间件,因此对kafka有一个初步的认识,后续逐渐深入探索kafka的神奇之处。
项目中怎么运用:
某一个业务操作触发EventBus事件,通过异步的方法监听此事件,发布kafka消息,处理复杂的业务逻辑。我在做项目时,比如直播开播消息提醒,病例解答完后,发各种消息(系统消息、短信消息、弹窗推送、微信消息),
-
考虑消息的同步和异步:做视频直播打点记录用户的观看记录时,通过发异步消息时,进程外事件监听,处理复杂业务逻辑(因为视频打点太频繁,如果直接马上处理,有异常的话,需要前端感知,其实前端不care这种异常;例如:类似定火车票一样,,用户不关注后续抢票流程,用户感知不到。)需要保证消息幂等,不可重发。
-
考虑消息幂等的实现: 数据库可以加字段squence;存储redis中,然后查询该消息是否已经发过。
感谢 资料