雨翔河
首页
列表
关于
记一次字符类型转换发生的生产事故
2019-11-06 12:43
我们有很多套kafka集群,其中大致可以划分为一级队列kafka集群和二级队列kafka集群,消息发送到一级队列kafka集群,消费一级队列进行逻辑处理后入库再加入一些包装的字段统一扔到二级队列供其他消费者进行消费,我们在消费一级队列的过程中包装过程有如下伪代码: ``` messageInfo.setPropertyCompanyId(String.valueOf(company.getPropertyCompanyId())) kafka.produce(messageInfo); ``` 上面是一级队列消费者消费消息进行处理,然后扔到了二级队列。 接下来是二级队列消费者进行消费的代码: ``` messageInfo = kafka.getMessageInfo(); msg.setPropertyCompanyId(Integer.parseInt(messageInfo.getgetPropertyCompanyId())); ``` 很简单的可以看出来,一级队列的消费者定义的 `propertyCompanyId` 字段是String类型,但是在二级队列这个字段是int类型,在不为null的时候是没有问题的,但是如果有特殊情况, `company.getPropertyCompanyId()` 的值是null,`String.valueOf(company.getPropertyCompanyId())` 就会变成 `null`以字符形式存在。 在二级队列进行消费处理的时候由于它定义的是int类型,`Integer.parseInt` 必然会发生转换失败的情况。 这就导致了二级队列的消费者报错,巧合的是,那里没有捕获异常进行处理,直接导致了消息丢弃,在代码的上层又对异常进行了捕获且没有打印错误日志,这就导致了问题出现的时候没有异常日志。 字段不对应这种问题隐藏起来的坑有点可怕(就像弱类型语言返回值不确定性一样),其次就是接收和处理转换逻辑的时候开发人员一定要考虑到特殊情况,只要是有可能发生的事情就一定会发生。
类型:工作
标签:kafka,java
Copyright © 雨翔河
我与我周旋久
独孤影
开源实验室