场景:
某服务记录日志会较多,但写日志就不能是同步IO写磁盘了
为什么不同步写呢,是因为同步写日志边际成本很高
一般的解决方案是,同步写到内存某个位置,然后不管,由专门的逻辑处理日志。
处理流程:
日志处理方案:
1. 按时间维度存储:10s 写一次
2. 按日志大小维度处理:1m 写一次
技术方案:
import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Service; import java.util.concurrent.LinkedBlockingQueue; @Slf4j @Service public class TestServiceQueue implements InitializingBean { private static final LinkedBlockingQueue<Object> QUEUE = new LinkedBlockingQueue(100); private Thread loggerProducerThread; @Override public void afterPropertiesSet() throws Exception { // 注册消费者 loggerProducerThread = new Thread(new Runnable() { @Override public void run() { try { Object logger = QUEUE.take(); if (logger != null) { // 处理日志 } } catch (InterruptedException e) { log.error("process data error", e); } } }, "logger-record-thread"); loggerProducerThread.start(); } // 生产者 public void produce() { try { // 构建日志对象 QUEUE.put("logger 111 333 222"); } catch (InterruptedException e) { log.error("produce data error", e); } } }