上周产品给了一个动态生成证书的需求,当时最开始让前端来生成,后端返回数据,后前端说使用的框架太重,所以换成后端通过Freemaker来生成证书,后面发现直接使用html转为图片,图片失真严重,所以先转成pdf再转为图片,设置图片dpi在300左右。开发环境没问题,上了测试环境之后,发现报OOM,同一时间请求超过3个程序会一直FullGC导致假死(该服务测试服务器配置为1核2G)。当时堆内存大小设置为800M,后面将堆内存设置为1200M 发送5个请求,只有1-2个能正常响应(只生成一次的话FullGC也会执行3次左右,YGC5次左右)。后更换为前端生成,后端返数据的方式解决。
主要当时考虑不周全,没考虑到内存,其实这种需求最好是前端去生成,后端只管数据。后端资源比前端更宝贵,前端生成把压力分摊到每一个用户身上,而后端的服务器是有限的。