今天早上没有收到测试的推送消息,到了办公室,查看了环境,发现MobilePush已经dump了,用gdb查看dump的core文件,发现是因为assert导致(测试期都使用的是debug版本),在到代码里看,是在发送了一个异步消息,收到对应异步ACK消息时出现问题,按照常理不应该出现这个问题。
在MobilePush中,每个链接都有一个独立的会话负责,所以发送的异步消息和对应的异步Ack消息都应该在同一个会话中出现,除非中间链接重置。但如果是链接重置,从手机到服务器,这个链接以及对应的会话都会重置,所以就不会在收到对应异步ACK消息,除非——手机到运营商的链接没变,而运营商交换设备到服务器的链接重置,好像以前听说过运营商的交换设备会进行链接重置,难道就是这个原因?接下来就去看了日志:
[2013-01-02 09:46:53,773]: Sent 20 bytes data to 58.214.31.186:32193
[2013-01-02 09:46:53,774]: CTimerManager::setTimer - Timer Id: 0x00000001112df0, Period: 10Sec, Transaction: 0x0000000112cd20, Times: 1
[2013-01-02 09:46:53,774]: Sent 20 bytes data to 58.214.31.186:32193
[2013-01-02 09:46:53,803]: Got 12 bytes data from 58.214.31.186:32193.
[2013-01-02 09:46:53,803]: CTimerManager::killTimer - Timer Id: 0x000000011133f0.
[2013-01-02 09:46:57,154]: Connection broke from 58.214.31.186:32193.
[2013-01-02 09:46:57,154]: Release connection from 58.214.31.186:32193.
[2013-01-02 09:46:57,192]: CTransactionManager::unregisterTransaction - User Id: 1ld, Total Registered Transations: 2
[2013-01-02 09:46:57,192]: Worker(0x007fc2961bc700) ended, totally 4 workers
[2013-01-02 09:46:57,192]: CTimerManager::killTimer - Timer Id: 0x00000001112f30.
[2013-01-02 09:46:57,192]: CTimerManager::setTimer - Timer Id: 0x00000001113430, Period: 10Sec, Transaction: 0x0000000112e180, Times: 1
[2013-01-02 09:46:57,199]: Worker(0x007fc2957bb700) started, totally 5 workers
[2013-01-02 09:46:57,199]: Accepted connection from 58.214.31.186:32225.
[2013-01-02 09:46:57,199]: Got 66 bytes data from 58.214.31.186:32225.
[2013-01-02 09:46:57,200]: (0x0000000112e180)CTransaction::onReady: Client Code - 1.
[2013-01-02 09:46:57,200]: CTimerManager::killTimer - Timer Id: 0x00000001113430.
[2013-01-02 09:46:57,200]: Sent 8 bytes data to 58.214.31.186:32225
[2013-01-02 09:46:57,200]: CTimerManager::setTimer - Timer Id: 0x00000001112cf0, Period: 300Sec, Transaction: 0x0000000112e180, Times: 0
[2013-01-02 09:46:57,200]: CTransactionManager::registerTransaction - User Id: 1ld, Transaction: 0x0000000112e180, Total Registered Transations: 3
[2013-01-02 09:46:57,339]: Got 12 bytes data from 58.214.31.186:32225.
[2013-01-02 09:46:57,339]: CTimerManager::killTimer - Timer Id: 0x00000001112df0.
分析日志得出,用户ID为1的用户收到了两条消息,但是在链接中断之后,只收到一条异步的ACK;而且链接的中断和重连,在2G的网络上,竟然只花了不到50ms(2013-01-02 09:46:57,154~2013-01-02 09:46:57,199),如果是手机端到服务器的整个链接重置,这个绝对不可能这么短,所以只有一个可能,就是运营商的交换设备到服务器端的链接短时间重置,而手机端没有影响,当手机端发送第二条消息ACK时,服务器端已经在一个新的链接和会话中接受,就有了上面的问题。
定位问题后,很快,就解决了这个bug。而且,以后所有向下发送的消息并且要求相应ACK的,都要做对应的调整。