一个关于发送topic引发的production issue问题的思考
2016-10-23 11:33
543 查看
一、介绍
异构项目之间的通信,一般有EMS发送topic或者Queue等方式,今天我阐述一个关于我们项目中通过发送topic引发的一个production issue的问题。
首先我们的webservice api提供了一个bulk操作,意思就是说外部的系统可以通过这个bulk api来批量操作,例如可以批量update contact,我们的上限是一次可以批量操作1000个contact。当执行完毕后,我们需要发送topic,这样其他的CRM系统可以监听topic,来做相应的更新操作。
二、发生production issue的源代码分析
基本的思路就是,比如我们的bulk操作有1000个contact,我们更新完这1000个contact结束后,会继续循环这1000个contact,并发送topic,也就是说发送topic的操作是在循环里面的。后来我们就猜想是不是我们一次发送大量的topic到EMS Server端导致topic队列阻塞,server那边还来不及消费,因为发送topic的send方法是阻塞的,这就会造成当前线程等待,因为我们的request的timeout时间是30s,所以我们出现了类似下面的异常信息:
InterruptedException has occurred while wait for server.
三、解决思路
后来我们找到Ems server support,让他们帮助查看一下配置,后来他们说topic的队列无上限,那就是说我们的猜想错误,应该不是队列的阻塞。后来通过测试,我们知道可能是走网络带宽引起的不稳定,因为EMS通信本来就不是可靠通信。并且我们发现代码的一些问题,因为我们不需要发送那么多的topic,因为我们的contact所属的CRM大致只有4个CRM,那么我们可以将contact按照CRM进行分类,也就是说我们只需要发送4个topic就可以了,为了避免阻塞,我们采用了异步的方式发送这些topic,在不影响主线程继续跑的情况下,异步发送topic,我们是使用Executor线程池解决这个问题的。这样主线程不会引起当前request
timeout。
相关文章推荐
- 由一个问题引发的思考——关于数据库的外键约束
- 关于中国产品的质量问题-一个暖水袋引发的思考
- 关于下载xbmc后打开Android 源码时的一个思考问题?兼各平台安装xbmc 的中文显示
- 一个问题引发的思考
- 一个JavaScript问题引发的思考
- 一个豌豆荚引发的血案——关于ADB server didn't ACK的问题
- 【杂症】一个豌豆荚引发的血案——关于ADB server didn't ACK的问题
- 一个粗心的问题引发的思考
- 一段旧代码,引起的关于OO中一个问题的思考
- 一个问题引发的一点思考
- 关于一个S5pv210 HDMI调试帖子引发对方案以及开发板公司技术支持的思考
- 一个Tahoma字体bug引发的思考—关于样式bug的分析流程
- 一个“粘贴”问题引发的思考
- 一个小问题引发的论证思考
- 关于char字符引发的一个问题
- 一个游戏引发的思考(概率问题)
- 关于SQL组合查询问题的一个思考
- 一个iphone的设置问题引发的思考!
- 思考问题的本质--关于vim Ctrl-]的一个小问题的思考
- 一个需求引发的关于平板电脑的思考