离线数据推送问题(消息队列)

  每天晚上9点多我要起身下班的时候,抬眼看到周围还在公司的也就只有几个刚毕业的小鲜肉了,就感觉自己也好年轻啊。虽然不止感觉,其实本来也不老。但是转眼又一想,我晚饭都不吃,每天多比人家工作了好几个小时,但是水平的提高一点也不成正比啊,是不是方法不当啊。唯一成正比的,我确实把身体锻炼好了,骑自行车40公里来上班,中间不停,骑得飞快,整个路程总体还是往高处走的,到公司休息一下正常上班,一点儿感觉都没有。有一种无知叫做不知道什么事情是不可能的,想到就去做了。

  直到中午和我们同事90后MM去吃饭,她最近想在网上做些小生意。我才想到:女孩子最大的劣势在于专注。朋友圈里好多有正式工作的女孩在弄微商,我却没见过一个技术特别好的男同事在弄副业的。我可以同时做很多的事情,确实所有的事情都没有做深入到极致。人所能达到的境界不是和付出的时间成正比,而是和对自己的要求成正比。人的优秀程度是和野心成正比的。我的知足常乐的心,在生活中是件好事,但是工作中却是自己最大的挑战了。和之间同事聊天,他说每天进步一点点就好。我说如果我现在每天只是进步一点点,那么以后的进步就更慢了。这几年中没有一个质的飞越,过几年就更难冲破前进的壁垒,最后是自己以为自己在进步,别人看你只是原地打转。

  今天发生的问题:消息队列报错,实时消息没有发送成功,重启后问题消失。

继续看其他的错误日志:

消息队列采用公司统一的apache qpidd集群。报错的lesocms.video.guoguang.queue这个消费队列。问题很清楚,生产者在我这边,消费者在搜索部门。生产的东西消费者没被消费掉,队列积压了。消费的问题不管是他们消费程序挂了还是消费慢,都已经交给搜索部门去处理了,我这边要解决遇到这种问题怎么处理。

  问题1:队列满了之后尝试了几次后close,只能靠人工重启重置连接的问题

  解决方法: 找到几个关键的异常点

Caused by: org.apache.qpid.transport.SessionException: timed out waiting for sync: complete = -1, point = 0

Exception when sending message:timed out waiting for sync: complete = -1, point = 0

Caused by: org.apache.qpid.transport.SessionClosedException: session closed

Caused by: javax.jms.JMSException: Exception when sending message:session closed

异常刚开始的日志:

定位到刚开始异常的行:

找到异常前后的日志:

发现越往后的日志里,新增大量的 create class:com.letv.mms.transmission.task.sub.SwiftSendMsgTask

我专门查了一下 create class:com.letv.mms.transmission.task.sub.SwiftSendMsgTask的新建数量:

出问题的这天不断的新建,正常稳定的时候是没有新加的。SwiftSendMsgTask是我当初自己设计的一个对象连接池,目的在于如果消息的发送和正常向消息队列里组装消息是同步的,会造成第一实行性不能保证,因为有的专辑下面有几万个视频,必须组装成一个消息发送,这个消息组装就要好几分钟。第二,组装过程中数据库连接池等待时间过长会自动关闭。所以我就直接异步发消息,从对象连接池中取出一个处理发消息的处理对象扔进去,直接处理下一个。如果处理消息的空闲对象不够用我就直接新建一个放到连接池里。一直想好好总结一下离线数据的程序,因为这个程序整个架构基本上很原始,资源的调度分配都是程序自己控制的,基本没用什么现成的技术。细节处处处体现精巧,每个设计都解决了特定的问题,但是总体去说这个程序,我却很难把这个程序的独到之处用语言表达出来。言归正传:

记得有次开会,组里谁说线上出了什么什么问题,不过倒是没有异常。我不负责那个项目具体不知道,我只是笑着说:“那可能不是真的没有异常,而是异常日志没打好哦。”经常发现自己这句话说的很有道理。上面异常日志截图里面都把.cpp文件的异常都打印出来了,完全可以按图索骥。但是自己就是个写代码的自己知道,异常的说明文字未必准确,最好还是要查源码。查BasicMessageProducer的源码发现,首先这个session是AMQSession。那么它close了,为什么使用到的时候没新建?org.springframework.jms.connection.CachingConnectionFactory的源码里看到reconnectOnException默认是true,也就是说抛出了这个Jms异常理论上是会新建的,除非新建不成功,不成功是因为SwiftSendMsgTask的新建数量太多,超过了设定的<property name="sessionCacheSize" value="700"></property>。那么我要解决的就是SwiftSendMsgTask在异常后不要新建那么多的问题了。

  本来cacheSize是700,但是发现正常情况下就算数据量突增,500个都不解决问题的话,媒资程序那边就挂了,异常不会到达这边,折中一下资源,将cacheSize设置为500。程序中创建对象的时候,如果对象池的activeNum个数超过或者等于491个(因为最多会有8个sleeping的),则不会再新建。

  问题2:为什么数据量会突增

  答案:咨询了一下德伟:最近接了一批短视频。实时的量发生了剧增。所以消费的能力突然不够也是正常的。目前消费者有两个:一个专辑的,一个视频的。但是生产者只有一个,如果专辑或者视频一个发生了突增,会影响到另一个。另外,专辑有的消息体特别大,极端情况下,一个队列也就是能放100多个消息。所以决定将专辑和视频分开,已经和搜索部门的同事达成协议。并提醒他们将队列承载量采用最高配(500M)。因为发现他们那边现在不是这么做的[汗]。

  问题3:没有收到消息队列溢出的报警

  答案:咨询了管MQ集群的同事,报警没加上[汗]。
   

  相信问题解决到这个程度,下次再遇到这种问题,搜索的哥哥们下次就不会第一时间来找我了。下次沟通估计就是我出差回来给他们带吃哒[胜利][胜利]

时间: 2024-10-26 13:54:28

离线数据推送问题(消息队列)的相关文章

C# 数据推送 实时数据推送 轻量级消息订阅发布 多级消息推送 分布式推送

前言 本文将使用一个NuGet公开的组件技术来实现数据订阅推送功能,由服务器进行推送数据,客户端订阅指定的数据后,即可以接收服务器推送过来的数据,包含了自动重连功能,使用非常方便 nuget地址:https://www.nuget.org/packages/HslCommunication/            github地址:https://github.com/dathlin/HslCommunication                                 如果喜欢可以s

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

微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C#微信公众号开发系列教程四(接收普通消息) C#微信公众号开发系列教程五(接收事件推送与消息排重) 在上一篇的博文中讲到,微信的消息可以大体分为两种类型,一种是包括:文本,语音,图片等的普通消息,另一种就是本篇要将的事件类型.包括:关注/取消关注事件,扫描带参数二维码事件,上报地理位置事件,自定义菜

微信主动推送文本消息C#

1. 登陆,根据用户名和密码登陆到微信公众平台管理页面,获取token,模拟登陆请求地址:http://mp.weixin.qq.com/cgi-bin/login?lang=zh_CN,2. 登陆后,获取用户所有的信息,地址:https://mp.weixin.qq.com/cgi-bin/contactmanage?t=user/index&token=,根据前面的token.3. 发送消息,地址:https://mp.weixin.qq.com/cgi-bin/singlesend?t=a

HTML5支持服务器发送事件(Server-Sent Events)-单向消息传递数据推送(C#示例)

传统的WEB应用程序通信时的简单时序图: 现在Web App中,大都有Ajax,是这样子: HTML5有一个Server-Sent Events(SSE)功能,允许服务端推送数据到客户端.(通常叫数据推送).基于数据推送是这样的,当数据源有新数据,它马上发送到客户端,不需要等待客户端请求.这些新数据可能是最新闻,最新股票行情,来自朋友的聊天信息,天气预报等. 数据拉与推的功能是一样的,用户拿到新数据.但数据推送有一些优势. 你可能听说过Comet, Ajax推送, 反向Ajax, HTTP流,W

javascript之数据推送

我们使用ajax与后台服务进行交互,常常是通过触发事件来单次交互,但对于有些web应用来说,需要前台与后台保持长连接,前端不定时地接收后台推送的数据信息, 例如:股票行情分析.聊天室和网页在线游戏等. 怎么做到呢? 最笨的方法: 前端需要隔一段时间向服务器发送一次ajax,请求成本太昂贵呀,就好比,你每次约炮,都得开房,还是租一个便宜点儿房子合算. 所以不能这么做. 1.comet 原理:comet是基于HTTP长连接的服务器推送技术,是一种web应用架构,服务器会主动以异步的方式向客户端程序推

.net开发微信公众号(3)-接收微信推送的消息

接收微信推送的消息 一.消息发送发式 用户发送的消息会被微信服务器转发到开发者服务器上(启动开发者模式时填的那个URL),开发者服务器接收到消息并处理完成会把消息再发回给微信服务器,再由微信服务器推送给用户.流程也非常简单. 二.接收消息分类 根据微信官方的文档说明,把接收消息分成两类: 1.普通消息 2.事件消息 事件消息除了这6种以为,还有一种是发送模板消息后返回的结果. 三.消息处理 接下来我们看下这些消息如何处理. 首先,做消息有效性验证.上一篇我们已经写了验证的方法,在这里直接用就行了

[HTML5_Web Workers+Sockets]HTML5 通信API 跨域门槛将不再高、数据推送也不再是梦

前言 HTML5新增通信相关两个API,跨文档消息传输与WEB Sockets API, 跨文档消息传输功能,可以在不同网页文档,不同端口(跨域情况下)进行消息传递. 使用web sockets api 可以让客户端与服务器端通过socket端口传递数据,这样便可以使用数据推送技术. 跨文档消息传输 在之前我们若想跨域获取信息会花很多功夫,现在只要获取网页所在窗口对象实例变可以实现互相通信. 首先要想从其他窗口接受发过来的消息需要对其窗口对象进行监听: window.addevntListene

C# ASP.NET MVC 之 SignalR 学习 实时数据推送显示 配合 Echarts 推送实时图表

本文主要是我在刚开始学习 SignalR 的技术总结,网上找的学习方法和例子大多只是翻译了官方给的一个例子,并没有给出其他一些经典情况的示例,所以才有了本文总结,我在实现推送简单的数据后,就想到了如何去推送复杂的数据,以及推送一个实时的图表数据,文本为我原创,转载请注明出处:Richard.Hu,先上一堆乱七八糟的说明先: SignalR的官方地址是: https://www.asp.net/signalr 网上给出例子是一个聊天的例子,官网地址是:https://docs.microsoft.

SSE:使用 HTTP 做数据推送应用

SSE ( Server-sent Events )是 WebSocket 的一种轻量代替方案,使用 HTTP 协议. 严格地说,HTTP 协议是没有办法做服务器推送的,但是当服务器向客户端声明接下来要发送流信息时,客户端就会保持连接打开,SSE 使用的就是这种原理. SSE 能做什么? 理论上, SSE 和 WebSocket 做的是同一件事情.当你需要用新数据局部更新网络应用时,SSE 可以做到不需要用户执行任何操作,便可以完成. 举例我们要做一个统计系统的管理后台,我们想知道统计数据的实时