项目.md 2.7 KB

中煤项目

传输模块

要点:生产者端使用单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问题:由于名称原因,导致无法注入
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