日志客户端设计问题
前段时间在做应用db访问日志客户端的开发,这里记录下日志客户端设计相关问题:
1. 如何拦截请求?
a. 公司的db访问都是统一经过dal框架,所以动态给dal框架底层执行方法增加拦截代码即可。主要思路是在注册tomcat启动监听,在监听代码中,注册jvm修改类定义的tranform(参考jvm的instrument功能),最后使用asm修改dal代码,增加拦截记录日志代码。这样客户端无需做改动。
b. 使用jvm-sandbox框架,jvm-sandbox底层也是使用方法a的原理。
差别:
方法a需要在应用代码里加入记录日志代码依赖。具体是在pom增加dependency,方法b不需要在应用代码里加,但是需要在应用的应用服务器上启动jvm-sandbox进程。
最终选型:
日志记录端使用方法a,原因是使用方法b对开发者透明,不容易管理。我们还有给记录的日志进行流量回放的功能,在流量回放的时候使用了方法b,因为流量回放只会在测试环境做,所以管理问题没有那么严重,而且回放使用方法b还有个好处就是动态插拔,jvm-sandbox可以只在测试环境部署。
下面从方法a来讲解客户端设计需要注意的地方:
1. 如何控制IO?
日志记录是IO密集型,我们公司目前是会通过消息记录到clickhouse,如果日志量比较大,实时同步记录肯定不行。有如下几种解决方法:
a. 加内存缓存,日志先堆到内存中,然后开启多线程(目前我们实现为单线程)异步同步。
b. 加内存缓存会带来内存管理问题,1. 可能导致内存暴涨。 2. 可能导致频繁GC。 3. 日志丢失风险较大。 一种解决方案是设置内存缓存上限,并使用压缩等方法降低日志大小,但是该方法不能彻底解决问题。还有一种方法类似kafka和rocketmq采用的,使用mmp给日志记录到文件。由于mmap性能接近内存,所以性能问题可以解决,而且如果机器重启,操作系统会保证mmap里的数据刷新到磁盘,最后由于mmap不是使用jvm的堆内存,所以不会有GC问题。
c. 压缩存储,采用压缩算法对日志压缩,降低日志大小。
d. 合并日志,这是在日志同步时候要做的,合并日志可以提高吞吐量。但是要注意合并日志要注意分片的大小设置。
目前我们采用的是简单的控制内存缓存大小,因为目前我们的日志量不大,后续在根据情况进行优化。
原文地址:https://www.cnblogs.com/caiyao/p/15005278.html
- 比特币退伍后,币圈新宠以特币,踏上了高端市场的远征之路
- 性能测试之gatling详解
- PHP中用PDO查询Mysql来避免SQL注入风险的方法
- 如果你再单身100年,你可能就会有一位机器人女友与你结婚生子
- 域名peza.com结拍 持有者身份未明
- 不用@微信官方,教你写头像戴圣诞帽的程序
- 云数据-欲练神功必先写文档
- ALM损坏后的恢复步骤
- 2020年180万人将被人工智能取代 制造业首当其冲
- SEO之404页面应该怎么做?
- AI到底是个什么鬼?
- Python数据挖掘学习路线是什么?学习Python学什么?
- 人脸智慧时尚店落地广深,微信支付赋能智慧零售
- 基层医疗破局关键:从医疗SaaS三大未来趋势说起
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- webdriver使用已打开过的chrome
- Shortcodes
- Unexpected EOF 远程主机强迫关闭了一个现有的连接 如何处理
- npm 使用问题
- 接口自动化测试框架-AIM
- hexo 图片显示问题及使用typora设置图片路径
- 接口自动化项目实践
- 结对测试算法性能优化(代码层面)
- 结对测试算法性能优化(用例设计层面)
- 使用travisCI自动部署hexo博客并使用国内外不同dns
- 寻找cookie之旅
- send_keys报错element not interactable
- 博客园上传markdown文件
- Git比较分支差异的3个命令
- IntelliJ IDEA添加Class自动生成@author@date模板代码