消息中间件的作用

消息中间件比如 RabbitMQ是有什么用呢?

譬如系统A,B,A系统调用B系统提供的服务,通常的方案是http调用或者webservice,rpc等等。在高并发的环节下,如果B系统故障,就会导致A系统功能不可用。

如果A把请求发送给消息中间件,消息中间件会对请求进行排队,把并发请求转换为顺序请求,这样B系统就不会轻易崩溃,提高了系统的性能。另一方面通过消息中间件调用方式,在请求和等待回应都为异步请求,A系统不需要等待B系统返回,就可以继续后面的业务,不至于系统卡死。

总之,消息中间件有两方面优势:

a.变并发请求为顺序请求

b.同步调用转为异步调用

这是我这两天学习消息中间件的一点体会,颇有感触,原来系统可以这么耍。

bug处理小结

昨天处理了一个比较棘手的bug,先把处理过程和方法记录一下,希望对他人有帮助。

这个bug把了一个arrayIndexOut exception,按说很好解决,但是遍历整个报错轨迹,都是不是自己写的代码,都是系统类的代码,直接看不出自己的代码所在的错误。这是一个统计查询的报表功能。所以首先怀疑sql有问题,但是从后台把sql查出来,执行也无问题。功能部署到正式,没有问题。

首先我拿这个问题,我怀疑是class与源码不一致,那么我clean了一下项目,重新编译,然后,又重新部署了一下项目,问题依旧。

然后我又设置了几个断点,简单跟踪了一下,问题依旧。

那么我想,那肯定是报表的问题,于是打开报表设计器,把报表设计里的内容全部清除,问题没了,但是报表也不显示数据了。然后一个一个向里加,加一个测试一个。反正也没多少。最后发现是报表里最后一行的求和公式哪里出现了问题。

好了定位到问题了,那就分析产生问题的原因,原来求和公式是把所有行的记录加起来,但是其中有一行没有数据,导致出问题,所以把所有行用nvl判断,如果为null,就返回0,问题解决。

从这个bug的处理过程,我们看,如果出现了无法定位源码的错误,不要着急,可以用排除法,逐个排查出问题的代码或者sql语句。