RabbitMQ -- unacked
RabbitMQ解决大量unacked问题
为了快速响应用户请求,我们需要消息异步处理机制,比较简单的做法是用redis的List结构,我们项目使用更专业的RabbitMQ。关于redis和RabbitMQ队列处理的性能比较可以查看这篇文章http://blog.csdn.net/educast/article/details/34521603
这里不扯RabbitMQ的一些定义了,我们遇到的问题是,入队并发和速度速度很快,但是消费端的处理速度慢得惊人。为了数据安全我们做了持久化而且消费端需要ack或者unack响应。从其提供的web控制台可以看到量大的时候产生大量的unacked消息,也就是说MQ把数据放到channel里,很长时间过去了channel没有给任何响应。我们创建了600个channel问题也依旧。查看了硬件没有瓶颈,网上有文章说是channel连接断了mq无法及时识别,还会往这些失效的channel里传递数据,误认子弟啊,拉出去枪毙了。Netstat一下,发现一共MQ服务器一共有4个外部连接连入了5672端口,两个productor两个consumer跟预想的一样。Jstack一下,发现pool-xxx线程远远没有预想的多,才50个,我们创建了600个channel啊。恍然大悟,尼玛的channel中文意思虽然是通道,但是MQ使用了线程池技术,它们是共享线程的,而不是一个通道一个线程,这个有点类似http请求和http服务器的关系。
把结构图给画出来先:
Java代码
- Properties prop = new Properties();
- InputStream inStream = this.getClass().getResourceAsStream("/config.properties");
- prop.load(inStream);
- ConnectionFactory factory = new ConnectionFactory();
- factory.setHost(prop.getProperty("RabbitMQHost"));
- factory.setUsername(prop.getProperty("RabbitMQUserName"));
- factory.setPassword(prop.getProperty("RabbitMQPassword"));
- // 关键所在,指定线程池
- ExecutorService service = Executors.newFixedThreadPool(500);
- factory.setSharedExecutor(service);
- factory.setAutomaticRecoveryEnabled(true);
- factory.setConnectionTimeout(15000);// 15秒
- factory.setRequestedHeartbeat(60);
- Connection connection = factory.newConnection();
线程方面已经没有问题了,不存在什么失效连接无法及时识别这一说法,如果还慢,则jstack去跟踪这些线程池的线程,看看都在干啥,关于jstack抽空再写了,很强大的jdk工具。
---------------------
本文来自 weinianjie1 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/weinianjie1/article/details/50611379?utm_source=copy
RabbitMQ -- unacked的更多相关文章
- python开发笔记-连接rabbitmq异常问题unacked处理
待补充 思路:捕获程序处理异常,异常情况下,也给队列生产者返回“确认”消息
- 消息队列——RabbitMQ学习笔记
消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...
- 消费RabbitMQ时的注意事项,如何禁止大量的消息涌到Consumer
按照官网提供的订阅型写法( Retrieving Messages By Subscription ("push API")) 我发现,RabbitMQ服务器会在短时间内发送大量的 ...
- RabbitMQ的几种典型使用场景
RabbitMQ主页:https://www.rabbitmq.com/ AMQP AMQP协议是一个高级抽象层消息通信协议,RabbitMQ是AMQP协议的实现.它主要包括以下组件: 1.Serve ...
- 【RabbitMQ】 WorkQueues
消息分发 在[RabbitMQ] HelloWorld中我们写了发送/接收消息的程序.这次我们将创建一个Work Queue用来在多个消费者之间分配耗时任务. Work Queues(又称为:Task ...
- RabbitMQ消息队列:ACK机制
每个Consumer可能需要一段时间才能处理完收到的数据.如果在这个过程中,Consumer出错了,异常退出了,而数据还没有处理完成,那么 非常不幸,这段数据就丢失了. 因为我们采用no-ack的方式 ...
- (转)RabbitMQ消息队列(三):任务分发机制
在上篇文章中,我们解决了从发送端(Producer)向接收端(Consumer)发送“Hello World”的问题.在实际的应用场景中,这是远远不够的.从本篇文章开始,我们将结合更加实际的应用场景来 ...
- RabbitMQ基础总结
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.消 息传递指的是程序之 ...
- RabbitMQ 原文译02--工作队列
工作队列: 在上一篇文章中我们我们创建程序发送和接受命名队列中的消息,在这篇文章我会创建一个工作队列,用来把耗时的操作分配给多个执行者. 工作队列(任务队列)的主要实现思想是避免马上执行资源密集型的任 ...
随机推荐
- umi怎么去添加配置式路由
今天在学习umi,他的路由机制非常的方便,但是在学到配置式路由的时候,看官方文档里面一笔带过: 对于我这种小萌新来说,有点懵,我需要把配置文件放到哪里呢?经过一番研究,发现它是放在根目录的.umirc ...
- day_6.26 反射
#utf-8 #2018-6-26 17:58:36 #反射,, 应用:从类里面获取字符串 #在python中万物皆对象 class Teacher: dic = {"查看学生信息" ...
- linux 常用 掌握要点 详细终结
linux 命令大全 每个开发者应该了解的 10 个 Linux 命令 1.查看正在执行的进程(Process) ps命令 Process Status 进程状态 语法: ps [option] ...
- 比例尺与DEM空间分辨率
我国 4 种比例尺 DEM 及其空间分辨率的对应关系: 1:100 万 DEM -- 1000m 空间分辨率: 1:25 万 DEM -- 100m 空间分辨率: 1:5 万 DEM ...
- css3---2D效果 ---3D效果
CSS3边框: CSS3圆角:border-radius(**px 或 **%) 属性——创建边框线的圆角 CSS3盒子阴影:box-shadow属性——创建阴影 box-shadow:30px 0p ...
- Asp.NET调用有道翻译API
调用有道API进行翻译,如图: HTML: <%@ Page Language="C#" AutoEventWireup="true" CodeFile= ...
- easyui---修改删除查询
修改:在toolsbar 修改工具中 { text:"编辑用户", iconCls:"icon-edit", handler:function(){ var s ...
- Python2.7编译失败 Failed to build these modules:_curses_panel _hashlib _ssl
1:*** WARNING: renaming "_ssl" since importing it failed: libssl.so.1.0.0: cannot open sha ...
- jpa持久化对象四种状态
自己理解,不完全正确,大致如下: 例:某实体类 Person(int id,string name,int age); id 为主键. 新建:new Person(), 并且未给 id 赋值 ...
- jmeter_用户并发登录
部分摘自:https://blog.csdn.net/weixin_41291554/article/details/80492276 第一种方案:对登录账号和密码进行参数化 1.添加设置线程数: N ...