rocketmq

系统分析记录-rocketmq导致jvm线程数量大

不羁的心 提交于 2019-12-03 11:29:46
一 . 系统说明: A系统阿里云平台,5台集群,每台:1-2核,内存6G,带宽上限2M,磁盘1G。 基于tomcat容器,主要业务消费rocketmq,再pegion(服务治理工具)调用第三方服务。 同时接入20个左右topic的mq,并每一次mq都会调用一次第三方服务,第三方服务有B,C,D等系统,单台mq的qps 有几个(4个)比较大,一小时几十万。其他的比较小。 二. 问题: 5台集群一台的线程数量达到2500+,触发公司线程报警。其他四台也很高(2000+),但是还没到阀值。 三 .初步分析: 1. 调用链 看到线程数量大的这台a机器,调用B系统有多个请求时间到15S(调用超时时间是5S),并有10个左右调用失败,正常的都是1S以下,但是B系统的日志显示所有请求都是1S以下返回的。目前没有思路。 2. threaddump 2.1 活跃线程: 226个running Threads,194 个 "New I/O worker": running, holding...",活跃线程大部分是在epoolwait,应该是等着接收mq消息。 2.2 全部线程: 1900+个线程都在线程池里空闲着,等待任务来执行。 大致是:ConsumeMessageThread_X 有275个,NettyClientPublicExecutor_X 1024个,600+ 个线程池模样线程(pool

Kafka、RabbitMQ、RocketMQ等消息中间件的介绍和对比(转)

二次信任 提交于 2019-12-03 10:55:51
前言 在分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦。现在开源的消息中间件有很多,前段时间产品 RocketMQ (MetaQ的内核) 也顺利开源,得到大家的关注。 概念 MQ简介 MQ,Message queue,消息队列,就是指保存消息的一个容器。具体的定义这里就不类似于数据库、缓存等,用来保存数据的。当然,与数据库、缓存等产品比较,也有自己一些特点,具体的特点后文会做详细的介绍。 现在常用的MQ组件有ActiveMQ、RabbitMQ、RocketMQ、ZeroMQ、MetaMQ,当然近年来火热的kafka,从某些场景来说,也是MQ,当然kafka的功能更加强大,虽然不同的MQ都有自己的特点和优势,但是,不管是哪种MQ,都有MQ本身自带的一些特点,下面,介绍MQ的特点。 MQ特点 1、先进先出 不能先进先出,都不能说是队列了。消息队列的顺序在入队的时候就基本已经确定了,一般是不需人工干预的。而且,最重要的是,数据是只有一条数据在使用中。 这也是MQ在诸多场景被使用的原因。 2、发布订阅 发布订阅是一种很高效的处理方式,如果不发生阻塞,基本可以当做是同步操作。这种处理方式能非常有效的提升服务器利用率,这样的应用场景非常广泛。 3、持久化 持久化确保MQ的使用不只是一个部分场景的辅助工具,而是让MQ能像数据库一样存储核心的数据。 4、分布式 在现在大流量

【转】分布式之消息队列复习精讲

眉间皱痕 提交于 2019-12-03 09:36:13
转自: https://www.cnblogs.com/rjzheng/p/8994962.html 引言 为什么写这篇文章? 博主有两位朋友分别是小A和小B: 小A,工作于传统软件行业(某社保局的软件外包公司),每天工作内容就是和产品聊聊需求,改改业务逻辑。再不然就是和运营聊聊天,写几个SQL,生成下报表。又或者接到客服的通知,某某功能故障了,改改数据,然后下班部署上线。每天过的都是这种生活,技术零成长。 小B,工作于某国企,虽然能接触到一些中间件技术。然而,他只会订阅/发布消息。通俗点说,就是调调API。对为什么使用这些中间件啊?如何保证高可用啊?没有充分的认识。 庆幸的是两位朋友都很有上进心,于是博主写这篇文章,帮助他们复习一下关于消息队列中间件这块的要点 复习要点 本文大概围绕如下几点进行阐述: 为什么使用消息队列? 使用消息队列有什么缺点? 消息队列如何选型? 如何保证消息队列是高可用的? 如何保证消息不被重复消费? 如何保证消费的可靠性传输? 如何保证消息的顺序性? 我们围绕以上七点进行阐述。需要说明一下,本文不是《消息队列从入门到精通》这种课程,因此只是提供一个复习思路,而不是去教你们怎么调用消息队列的API。建议对消息队列不了解的人,去找点消息队列的博客看看,再看本文,收获更大 正文 1、为什么要使用消息队列? 分析 :一个用消息队列的人,不知道为啥用,这就有点尴尬

RocketMQ笔记4-顺序消费

怎甘沉沦 提交于 2019-12-03 09:16:51
简介 消息有序指的是可以按照消息的发送顺序来消费(FIFO)。RocketMQ可以严格的保证消息有序,可以分为分区有序或者全局有序。 全局有序 :发送和消费参与的queue只有一个,效率低,不推荐 分区有序 :有多个queue,但是每个queue中的消息的发送和消费都是有序的 要点 消息顺序发送 单线程同步发送 消息顺序储存 重写 MessageQueueSelector 接口中的 select() 实现消息路由到一个queue 消息顺序消费 设置该监听器 MessageListenerOrderly 同一时刻一个消费者中的一个线程对一个队列中的消息进行消费 消费者申请队列锁(只要一个消费者能消费该队列) 拉取消息进行消费,此时通过synchronized上锁(只有一个线程能够消费) 推荐参考 RocketMQ中的顺序消费 rocketmq/docs/cn/RocketMQ_Example.md 聊一聊顺序消息 来源: https://www.cnblogs.com/wuba/p/11785191.html

SpringBoot集成RocketMQ报错:Bad annotation definition in @ExtRocketMQTemplateConfiguration...

梦想的初衷 提交于 2019-12-03 08:19:16
1.问题缘由 使用官方提供的 rocketmq-spring-boot-starter 提供的例子写 ExtRocketMQTemplate 时候,修改了配置文件中的 nameServer 配置,改成了和 rocketmq.name-server 一样的值: ## 配置文件 rocketmq: name-server: 192.168.2.182:9876;192.168.2.183:9876 ... demo: rocketmq: ... extNameServer: 192.168.2.182:9876;192.168.2.183:9876 ## Java Code @ExtRocketMQTemplateConfiguration(nameServer = "${demo.rocketmq.extNameServer}") public class ExtRocketMQTemplate extends RocketMQTemplate { } 2.问题描述 贴上了堆栈信息: org.springframework.beans.factory.support.BeanDefinitionValidationException: Bad annotation definition in @ExtRocketMQTemplateConfiguration, nameServer

RocketMq-半消息(十)

坚强是说给别人听的谎言 提交于 2019-12-03 03:17:42
概念: 半消息: 在原有队列消息执行后的逻辑,如果后面的本地逻辑出错,则不发送该消息,如果通过则告知rocketmq发送 操作步骤 : 1.(生产者)发送-【半消息】 2.(生产者)本地监听-【半消息】处理结果 3.(消费者)处理-【半消息】 1.(生产者)发送-【半消息】 // 消息体 @Data @Builder @ToString public class UserMoneyParams { int userId; String act; double money; String info; String infoParams; } // 发送消息 // 发送-队列半消息: rocketMQ @RequestMapping("rocketMQHalf") public ApiResult rocketMQHalf() { int orderId = 2; double money = 10; // 用户余额变更-参数体 UserMoneyParams userMoneyParams = UserMoneyParams.builder() .act("pay-order") .userId(orderId) .money(money) .build(); // 用户数据变更-参数 UserOrder userOrder = this.userOrderMapper

RocketMQ笔记1-简介-单点模式-生产者消费者的使用-工作流程

非 Y 不嫁゛ 提交于 2019-12-03 02:30:55
简介 RocketMQ是一款分布式,队列模型的消息中间件 RocketMQ开发者指南 单机版安装 通过docker安装RocketMQ Server + Broker + Console,至少需要 2G 内存 docker-compose.yml 如下: version: '3.5'services: rmqnamesrv: image: foxiswho/rocketmq:server container_name: rmqnamesrv ports: - 9876:9876 volumes: - ./data/logs:/opt/logs - ./data/store:/opt/store networks: rmq: aliases: - rmqnamesrv rmqbroker: image: foxiswho/rocketmq:broker container_name: rmqbroker ports: - 10909:10909 - 10911:10911 volumes: - ./data/logs:/opt/logs - ./data/store:/opt/store - ./data/brokerconf/broker.conf:/etc/rocketmq/broker.conf environment: NAMESRV_ADDR: "rmqnamesrv

RocketMQ管理命令

匿名 (未验证) 提交于 2019-12-03 00:37:01
RocketMQ提供有控制台及一系列控制台命令,用于管理员对主题,集群,broker等信息的管理; 使用步骤 进入rocketmq目录下的bin目录,可以看到该目录下有个mqadmin脚本 常用命令 查看帮助: sh mqadmin help 命令名称 例如,查看updateTopic的使用 sh mqadmin help updateTopic 创建(修改)topic 指令 updateTopic 类路径 com.alibaba.rocketmq.tools.command.topic.UpdateTopicSubCommand 参数 是否必填 说明 -b 如果 -c为空,则必填 broker地址,表示topic建在该broker -c 如果 -b为空,则必填 cluster名称,表示topic建在该集群(集群可通过clusterList查询) -h 否 打印帮助 -n 是 nameserve服务地址列表,格式ip:port;ip:port;... -p 否 指定新topic的权限限制( W|R|WR ) -r 否 可读队列数(默认为8) -w 否 可写队列数(默认为8) -t 是 topic名称(名称只能使用字符 ^[a-zA-Z0-9_-]+$ ) 举例 在集群DefaultCluster上创建主题ZTEExample,nameserve地址为10.45.47.168

RocketMQ――死信

匿名 (未验证) 提交于 2019-12-03 00:37:01
在上篇博客中我们了解了RocketMQ的ACK机制,其中涉及到了消息消费重试,当重试次数达到默认的16次后(可以通过配置文件修改)如果对应的消息还没被成功消费的话,该消息 就会投递到DLQ死信队列。 不过,在使用控制台查询死信消息队列的时候会报错,具体如下图 org.apache.rocketmq.client.exception.MQClientException: Can not find Message Queue for this topic, %DLQ%consumer1 See http://rocketmq.apache.org/docs/faq/ for further details. 对应服务器进入相关的目录下,/usr/local/rocketmq/store/consumequeue,发现确实是存在%DLQ%consumer1 我们通过进入到,通过rocketmq的管理命令(先进入 /usr/local/rocketmq/bin)查看所有的topic,发现也确实能够找到 sh mqadmin topicList -n 192.168.140.129:9876;192.168.140.128:9876 查看该topic信息,发现perm为2 sh mqadmin topicRoute -n 192.168.140.129:9876 -t %DLQ

详解RocketMQ不同类型的消费者

匿名 (未验证) 提交于 2019-12-03 00:33:02
云栖君导读:本文节选自云栖社区系列丛书《RocketMQ原理与实战解析》,作者:阿里巴巴数据专家杨开元。本节将重点讲解RocketMQ不同类型的消费者。 根据使用者对读取操作的控制情况,分为两种类型。一个是DefaultMQPushConsumer,由系统控制读取操作,收到消息后自动调用传入的处理方法来处理;另一个是DefaultMQPullConsumer,读取操作中的大部分功能由使用者自主控制。 1.1.1 DefaultMQPushConsumer的使用 使用DefaultMQPushConsumer主要是设置好各种参数和传入处理消息的函数。系统收到消息后自动调用处理函数来处理消息,自动保存Offset,而且加入新的DefaultMQPushConsumer后会自动做负载均衡。下面结合org.apache.rocketmq.example.quickstart包中的源码来介绍。 DefaultMQPushConsumer需要设置三个参数:一是这个Consumer的GroupName,二是NameServer的地址和端口号,三是Topic的名称,下面详细介绍。 Consumer的GroupName用于把多个Consumer组织到一起,提高并发处理能力,GroupName需要和消息模式(MessageModel)配合使用。 RocketMQ支持两种消息模式:Clustering