背景
- MQTT客户端每秒接收大量设备数据,单条消息约1m
cpu负载优化
- 移除额外的json序列化操作 mq客户端接收到的消息是json格式,需要进行第一次反序列化操作(假设反序列化为Device数组),用于后续业务操作, Device数组中的wave/args需要合并后 json string格式存储, 此处可以使用自定义的 Collectors, 降低字符串拼接带来的额外新生代内存消耗以及 json序列化带来的cpu消耗
List<Device> list = .... String wave = list.stream().filter(a -> StringUtils.isNotEmpty(a.getWave())) .map(a -> String.format("\"%s\":%s", a.getType(), a.getWave())) .collect(toJsonFormat());
private Collector<String, StringBuilder, String> toJsonFormat() { return Collector.of( () -> new StringBuilder("{"), (sb, s) -> { if (sb.length() > 1) { sb.append(","); } sb.append(s); }, (sb1, sb2) -> { if (sb1.length() > 1 && sb2.length() > 1) { sb1.append(","); } sb1.append(sb2, 1, sb2.length() - 1); return sb1; }, sb -> sb.append("}").toString() ); }
内存优化
- 增加新生代内存大小,减少full gc发生的频率 -XX:NewSize -XX:MaxNewSize