首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

go使用kafka对网页浏览数据进行统计

概述

•kafka 库•producer config 配置•sync vs async•压缩方式

背景:博客文章想统计访问数据,每日pv/uv/ip数据

分析:

•网页浏览数据,主要以写为主•时效性、事务持久要求不高•数据量大

kafka特别适合这种场景,高吞吐量,较低的端到端延迟,强大的持久性。

go kafka 库

•github.com/Shopify/sarama[1]使用人数较多,我公司也是用的这个库•github.com/confluentinc/confluent-kafka-go[2]我没有做过实验,有兴趣的朋友自己尝试一下

sync vs async

同步异步的区别, 如果因为实时性要求没那么高的话,推荐使用async,总结一下原因:kafka面临的2大难题之一,持久化要面临磁盘大量的I/O操作,如此频繁的写,即便是顺序写、有pagecache可以缓冲、有mmap减少一次内核态的复制,磁盘也是难以承受。

kafka的处理也是很简单,加缓存,本来1毫秒100次写,broker缓存10次一写(数据块),这样可以减轻10倍的I/O压力。

所以这里也是同样的思想,kafka加了一层缓存,我们producer也可以在加一层缓存,又可以减轻n倍的I/O压力。所以在实时性要求不高的前提下,推荐使用async

async有4个配套参数

完整的prodcuer用法

: 这里是go语言的专属用法,有2个channel,重点:如果  设置为了true,就必须有相应读取channel,否则会阻塞producer写消息,success channel/error channel默认capacity只有256字节

•: 写消息成功channel•: 错误channel•

对应java producer的

• - : producer不等待来自broker同步完成的确认继续发送下一条(批)消息。延迟最低/消息持久化保证性最低(当服务器发生故障时某些数据会丢失,如leader已死,但producer并不知情,发出去的信息broker就收不到)。• - : producer在leader已成功收到的数据并得到确认后发送下一条message,没有确认其他副本是否收到。持久化保证较好(被写入死亡leader但尚未复制将失去了唯一的消息)• - (默认): producer在leader以及follower副本确认接收到数据后才算一次发送完成。•

: kafka 消息压缩了,综合考量来说,如果kafka版本大于2.1可以使用zstd,小于2.1版本可以使用lz4, 无论是cpu占用还是压缩比例的角度上看

issue

1.go kafka producer在写消息时,写了1,2条就阻塞了?

答:conf.Producer.Return配置姿势不对?[3]

: 这里是go语言的专属用法,有2个channel,重点:如果  设置为了true,就必须有相应读取channel,否则会阻塞producer写消息,success channel/error channel默认capacity只有256字节

•: 写消息成功channel•: 错误channelReferences

github.com/Shopify/sarama:https://pkg.go.dev/github.com/Shopify/sarama

github.com/confluentinc/confluent-kafka-go:https://github.com/confluentinc/confluent-kafka-go

conf.Producer.Return配置姿势不对?:#producer_return

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20210210A04ODS00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券