您的位置:首页 > 产品设计 > UI/UE

一个关于发送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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: