# 中煤项目 ## 传输模块 要点:生产者端使用单topic单partition,保证顺序消费,重试次数设置为0,ACK设置为1。消费端设置线程池去多线程消费,使用redis记录偏移量,手动提交ACK 使用list记录数据量 项目演化过程: 直接看监控,JVM监控,grafana * kafka挂了:主要原因是kafka线程连接数量过多,kafka报错,直接增大网络线程数和I/O线程数,优化监控模块连接复用 * kafka挂了:CPU压力过大,集群压力过大,增大与ZK的默认响应事件zookeeper.connection.timeout.ms=60000 * 消费乱序:消费者因为触发reblance导致消费乱序,原本的partition-2分区给了消费者-02,因为存储到一个list里面导致乱序 * 消息堆积:消费者传输的消息体过大,导致传输延迟过大,直接减少传输的消息,改为多批次发送。问题得到缓解 * 消费者挂:各个节点流量不一样,(如果进行hash分区)导致该节点压力过大。解决直接进行单topic单partition * 消息挤压:单topic单partition导致消费能力不足,使用线程池进行消费 * 重复消费:因为消费者重启导致的,使用redis可以解决 * CPU暴涨:使用线程池导致消费问题,具体解决方法。优化线程池参数减小= * 项目无法启动,报错:error,**文件描述符**,默认是1024,改到最大值65535,用户过多,调整一下 * redis挂了怎么办:直接重试,三次就跳过 * kafka消费者挂了怎么办:使用定时任务直接重启 * websocket:因为nginx的原因,定时ping/pong * 内存过大:TOP命令,主要是kafka和hbase的配置问题 BUG: * JMX监控问题:使用JMX导致无法连接,开放端口 * JVM堆内存已满:**VisualVM**分析,因为hbase配置文件创建不当,改为单例模式 * beanutils问题:由于名称原因,导致无法注入 ```java public static String decapitalize(String name) { if (name == null || name.length() == 0) { return name; } if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) && Character.isUpperCase(name.charAt(0))){ return name; } char chars[] = name.toCharArray(); chars[0] = Character.toLowerCase(chars[0]); return new String(chars); } ``` * 线程池无法调用问题:自定义策略问题 CPU标高:TOP命令 # 实习项目 要点:使用责任链模式进行判断,shortcut的功能,区分TCP和UDP,使用策略模式进行选择。选择合适的进行解析。使用bytebuffer进行解析。封装工具类, 分库分表,16个表4*4,大概就是每个设备1秒10条消息。一共一天80万条数据。 使用 哈希散列算法 分治路由 * batch insert * 导致事务注解失效 * SPI