Go日志转发服务设计
服务描述
日志转发服务主要是通过读取filebeat发送到redis的数据内容进行加工处理后,写入数据库的服务。
服务需求
(1) 能够快速读取redis数据,快速写入指定数据库。
(2) 空闲时,不能够长时间占用cpu资源。
(3) 保证数据完整性。
服务设计
数据库
由于这个服务处理的只要是日志数据,写多读少,所以需要寻找一个写性能优秀的数据,本服务使用的是cassandra数据库,单机写入性能能达到3w TPS, redis操作list的单机速度也差不多是5w TPS, 刚好适合,生产速度和消费速度接近。
逻辑设计
由于redis读取的速度大于cs数据库写入速度,如果是边读编写,容易导致cs数据库处理不过来,所以我们可使用channel,将读取出来的数据放入channel,如果channel满了,生产者就阻塞住了,这样就可以控制生产速度,接下来需要开启多个work读取channel将数据写入cs数据库。
注意点:
(1) 读取redis采用批量读取,当数据为空的时候,需要改成阻塞获取。
(2) 写入cs采用批量写入。
开发过程遇到的坑
(1) 由于go的协程非常优秀,于是做了一件蠢事,在读取channel一定数据后,开启一个协程进行写入,但是数据量实在太多了,导致产生了很多协程,内存占用很高,为了解决这个问题,又采用了go的协程池防止无限增长的协程数,但是当协程池满后,出现了阻塞,由于没有新的协程使用,导致channel数据消费不过来,之后选择启用多个work,每个work都轮询读取channel解决了以上问题。
服务性能
2w TPS写入能力,cpu 内存使用情况正常。
赏
请到客户端“主题--自定义配置--配置”中填入leancloud_appID和key