起因:2016年3月25日 18:30 左右,突然接到客户投诉,说APP收到大量的任务推送消息,而且点击进去都是一些过期任务,我们将对此展开追踪,查找问题原因。

  过程:

    1、当时的第一反应是先查看redis的消息队列,发现redis队列里还仅存着一条数据

    2、然后马上中断错误文件,当再查看消息队列时,仅剩下的一条消息也没了

    3、之前反馈消息说只有iOS的收到,当时在想,会不会发送至iOS的function有误

    4、为了确定是否iOS的发送function有问题,登录腾讯信鸽进入消息统计那里查看发送记录,然而发现Android端的也有发送,只是没有Android的用户反馈这问题

    5、而且还发现信鸽列表每条消息所发送的用户数量是不一致的,这判断出发送时对用户的条件判断是生效的

    6、然后代码对比,对比自己的代码与自己修改前的那一个版本看是否代码存在问题

    7、对比发现新增加的代码基本不存在对发送主流程有影响的地方

    8、在这时候认真的总结了一下消息发送流程,如下:

      管理后台审核通过任务列表——点击推送按钮——填写要发送的标题与文字——把发送的文字添加到message表,把message的id写入到task表——把task的id存进redis消息队列

      crontab定时器——每隔五分钟运行一遍message文件

      message文件——检测redis消息队列是否有数据——循环发送——删除消息

    9、这时候把自己觉得有出现可能都想了出来

      1)代码是否存在问题

      2)是否redis的key是否在其他地方有用到

      3)redis是否会自动回滚,或者某些操作导致redis回滚

    10、首先把查看代码问题,代码根据流程一步一步往上走:发送后删除消息,没有问题(因为根据过程的第1步redis队列的内容从有到无,证明已经删除,为了安全起见,重新走了一遍发送流程,发现没有问题);获取消息队列,循环没问题;管理后台消息写入,也没有问题

    11、搜索redis队列的key是否在别的地方用到,管理后台搜索后发现只在当前页面用到,没有问题,在前台的接口文件搜索后发现不存在,没有问题,说明没有其他地方调用这个key;然后车看写入消息的function是否在其他页面用到,搜索前后台还是只有当前页面用到,也没有问题

    12、那么最后好像只剩redis的问题了,对于redis这块由于不是很熟悉,只能通过百度来查找,发现还没有什么操作或者自动会让redis的某个可以回滚,然后在这步一直卡住,因为之前的都没有问题,好像就到了这里才有问题

    13、对于这块的不熟悉,百度也没有结构,于是就向熟悉的同事问了一遍,他们根据流程跑了一遍发现也没什么问题,因为他们熟悉redis,觉得redis自动回滚的概率性太小了,觉得会不会是其他的问题导致消息队列存在数据

    14、先是询问了一遍审核任务的同事,看是否有人一直在发送推送消息,然后得到的答复是一般都是审核通过就点击推送的,我们查了其中的任务,三月初的任务都有推送,这又卡住了

    15、然后我们的大神说了一句,会不会因为上一个版本存在问题导致消息一直存在队列中,没有发送出去,之后新版本上线刚好修复了,从而把所有存在队列中的消息一起发送出去了

    16、说到这个然我突然想起我在修改完测试时,程序在以前的代码块出现了错误,导致程序运行错误,当时我还在想为什么代码到我这就不行了

    17、把代码恢复到我修改前的那一个版本,进行测试,发现真的是那个代码有错误

    18、终于找到了原因╮(╯▽╰)╭

  总结:通过这次的问题查找发现了自己存在很多问题:

      1、当时的第一反应应该是马上中断程序,停止发送,而不应该是先去查看消息队列,自己在处理突发事件时缺乏经理,乱了阵脚

      2、在发现出现的问题不属于自己版本时并没有留心或者向修改上一版本的同事求证,只是通过自己的修改完成,导致问题发生

      3、发现自己在寻找问题的时候会陷入牛角尖,并没有及时的跳出来,想想其他的方面,只是在思考自己的开始所觉得的几个问题

      4、自己找问题时不会怀疑他人把东西交到手的是否有问题,没有去质疑别人

    这都是需要我努力改进。

2016-3-25突然推送大量消息的问题及查找 -- Sangit的更多相关文章

  1. C#微信接口之推送模板消息功能示例

    本文实例讲述了C#微信接口之推送模板消息功能.分享给大家供大家参考,具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2 ...

  2. C#微信公众号开发系列教程五(接收事件推送与消息排重)

    微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...

  3. APNS推送通知消息负载内容和本地格式字符串

    来源:http://hi.baidu.com/tangly888/blog/item/62948520121870559358074f.html 翻译苹果文档 地址:  翻译:tangly http: ...

  4. 微信开发之获取openid及推送模板消息

    有很多的朋友再问我怎么获取code,openid之类的问题,在这里我就给大家分享一下. 在做微信支付是需要获取openid的,推送模板消息也是需要openid包括其他一些功能分享等也都是需要的,ope ...

  5. FineReport如何手动推送APP消息

    在报表填报成功后,发送消息至APP会提示数据已更新.再次期间用户需要有查看该模板的权限,如果没有的话,则无法接受到提示信息.那么在FineReport移动端中,如何手动推送APP消息呢? 具体用法 在 ...

  6. .net平台推送ios消息

    1,ios应用程序中允许向客户推送消息 2,需要有苹果的证书以及密码(怎么获取,网上搜一下,需要交费的) 3,iphone手机一部,安装了该ios应用程序 4,.net 项目中引用PushSharp. ...

  7. 转:C#微信公众号开发之接收事件推送与消息排重的方法

    本文实例讲述了C#微信公众号开发之接收事件推送与消息排重的方法.分享给大家供大家参考.具体分析如下: 微信服务器在5秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次.这样的话,问题就来了.有这 ...

  8. 微信公众号实现无限制推送模板消息!可向指定openID群发

    微信认证的服务号才有推送模板消息接口所以本文需要在认证服务号的情况下学习 以上就是模板消息,只有文字和跳转链接,没有封面图.在服务号的后台添加功能插件-模板消息即可. 模板消息,都是在后台选择一个群发 ...

  9. phonegap 使用极光推送实现消息推送

    最近一直在研究各种推送,ios的由于是apns,比较容易实现,但是andriod的就比较麻烦.后来看了很多解决方案,gcm明显是不行的,其他的方案更是一头雾水,而且需要做第二次开发,太麻烦,后来就选择 ...

随机推荐

  1. HotSwap和JRebel原理

    HotSwap和JRebel原理 HotSwap和Instrumentation 在2002年的时候,Sun在Java 1.4的JVM中引入了一种新的被称作HotSwap的实验性技术,这一技术被合成到 ...

  2. word文档标题级别批量更改——批量降级与升级实例

    word文档标题级别批量更改——批量降级与升级实例   word文档标题级别批量更改——批量降级实例 2012年12月21日16:30:44 现有一个3级文档结构的word文档,如下图所示 先需要将上 ...

  3. 在Hadoop伪分布式模式下安装Hive(derby,mysql)

    我的Hadoop版本是1.2.0,mysql版本是5.6.12. 先介绍一下嵌入式derby模式: 1.下载/解压 在hive官网上选择要下载的版本,我选择的版本是hive-0.10.0. 下载好解压 ...

  4. 418. Sentence Screen Fitting

    首先想到的是直接做,然后TLE. public class Solution { public int wordsTyping(String[] sentence, int rows, int col ...

  5. 函数ut_2_log

    计算某个数的对数(最大的) 例如 16 计算后为 4 2的4次方为16 例如15 计算后为3 2的3次方为8 /******************************************** ...

  6. 文件大小转换成可显示的Mb,Gb和kb方法

    public static String unitConversion(float resource) { String[] unit = new String[] { "B", ...

  7. UVa 10562 (特殊的输入处理方式) Undraw the Trees

    题意: 给出一个二维字符数组,它代表了一棵树.然后将这棵树转化为括号表示法(以递归的形式). 分析: 这道题最大的特色就是对数据的处理方式,里面用到了一个 fgets() 函数,这个函数的功能有点像c ...

  8. Java [Leetcode 231]Power of Two

    题目描述: Given an integer, write a function to determine if it is a power of two. 解题思路: 判断方法主要依据2的N次幂的特 ...

  9. 《C++ Primer 4th》读书笔记 第10章-关联容器

    原创文章,转载请注明出处:http://www.cnblogs.com/DayByDay/p/3936464.html

  10. [转]Android调用so文件(C代码库)方法详解

    一.为什么调用c的dll要用源码编译成so库 Android系统是基于linux内核的移动终端系统,而dll是在windows环境下生成和调用的c库,所以不可以直接为android系统调用. 二.安装 ...