rocketmq

消息队列选型

我与影子孤独终老i 提交于 2020-01-16 10:41:58
消息队列(Message Queue),简称MQ,本质是一个队列,用于存放数据(message),先入先出(FIFO)。主要用于系统解耦、消息缓存。 目前市面上消息队列的实现有很多种,下面调研了kafka/rabbitMQ/rocketMQ,这三种应用都非常广泛,期望从中选出最合适我们的。 简介 Kafka是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache定级项目。Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输。0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业务。 RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。 RocketMQ是阿里开源的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。RocketMQ思路起源于Kafka,但并不是Kafka的一个Copy,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理

Kafka、RabbitMQ、RocketMQ消息中间件的对比

扶醉桌前 提交于 2020-01-16 10:40:48
引言 分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦。现在开源的消息中间件有很多,目前对Kafka、RabbitMQ、RocketMQ这三个消息中间件做下对比分析。 - - kafka RocketMQ RabbitMQ 数据来源 相关文章 定位 设计定位 系统间的数据流管道,实时数据处理。 例如:常规的消息系统、网站活性跟踪,监控数据,日志收集、处理等 非日志的可靠消息传输。 例如:订单,交易,充值,流计算,消息推送,日志流式处理,binglog分发等 可靠消息传输。和RocketMQ类似。 基础对比 成熟度 日志领域成熟 成熟 成熟 所属社区/公司 Apache Alibaba开发,已加入到Apache下 Mozilla Public License 社区活跃度 高 中 高 来源于网络 API完备性 高 高 高 文档完备性 高 高 高 来源于网络 开发语言 Scala Java Erlang 支持协议 一套自行设计的基于TCP的二进制协议 自己定义的一套 (社区提供JMS--不成熟) AMQP 客户端语言 C/C++、Python、Go、Erlang、.NET、Ruby、Node.js、PHP等 Java Java、C、 C++、 Python、 PHP、Perl 等 持久化方式 磁盘文件 磁盘文件 内存、文件 可用性、可靠性比较 部署方式 单机/集群

MQ消息队列

可紊 提交于 2020-01-16 10:40:28
一、为什么使用消息队列? 大多数情况下,使用消息队列目的是:: 解耦、异步、削峰 。 通过一个 MQ,Pub/Sub 发布订阅消息这么一个模型,彻底解耦了 通过MQ,使得同步的操作变为异步操作,提高效率。 通过MQ,控制服务可以接收到的请求数量 二、消息队列有什么优缺点 优点就是在特殊场景下有其对应的好处, 解耦、异步、削峰 缺点有以下几个: 系统可用性降低 系统引入的外部依赖越多,越容易挂掉。需要保证消息队列的高可用 系统复杂度提高,保证消息没有重复消费,怎么处理消息丢失的情况,怎么保证消息传递的顺序性?头大头大,问题一大堆,痛苦不已。 一致性问题 A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,咋整?你这数据就不一致了。 三、如何解决消息丢失? ack(消费者确认)( 消费者手动ack ) 持久化 (交换机、队列、消息) 不推荐使用消息事务,会验证降低性能 生产者确认(publisher confirm):生产者发送消息后,等待mq的ACK,如果没有收到或者收到失败信息,则重试。如果收到成功消息则业务结束。 channel.waitForConfirmsOrDie(10000); 可靠消息服务(可选,自己编写逻辑):对于部分不支持生产者确认的消息队列,可以发送消息前

RocketMq发送消息出现com.alibaba.rocketmq.client.exception.MQBrokerException: CODE: 2 DESC: [TIMEOUT_CLEAN_QUEUE]broker busy, start flow control for a while, period in queue: 201ms, size of queue: 1

谁都会走 提交于 2020-01-16 10:39:35
最近对系统进行压测,发现发送消息到消息队列的时候出现如下错误: /*--> */ /*--> */ com.alibaba.rocketmq.client.exception.MQBrokerException: CODE: 2 DESC: [TIMEOUT_CLEAN_QUEUE]broker busy, start flow control for a while, period in queue: 201ms, size of queue: 1 经查询发现RocketMq在4.1版本以后为producer增加了2个配置, 默认配置这两个参数分别是1和false,将他们配置成 64 和true,就能解决问题 #发送消息的最大线程数 sendMessageThreadPoolNums: 64 #large thread numbers #发送消息是否使用可重入锁 useReentrantLockWhenPutMessage: true 该配置可以在spring配置中设置,也可以在RocketMq集群机器上配置 如果还是会出现此问题,就需要调整RocketMq集群机器配置: waitTimeMillsInSendQueue = 300 #或者更大 然后重启集群 来源: https://www.cnblogs.com/cs99lzzs/p/9181555.html

RocketMQ与Kafka对比(18项差异)

帅比萌擦擦* 提交于 2020-01-16 10:39:17
RocketMQ与Kafka对比(18项差异) 原文链接: https://github.com/alibaba/RocketMQ/blob/master/wiki/kafka_partitions_problem.md 淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件,使用Mysql作为消息存储媒介,可完全水平扩容,为了进一步降低成本,我们认为存储部分可以进一步优化,2011年初,Linkin开源了Kafka这个优秀的消息中间件,淘宝中间件团队在对Kafka做过充分Review之后,Kafka无限消息堆积,高效的持久化速度吸引了我们,但是同时发现这个消息系统主要定位于日志传输,对于使用在淘宝交易、订单、充值等场景下还有诸多特性不满足,为此我们重新用Java语言编写了RocketMQ,定位于非日志的可靠消息传输(日志场景也OK),目前RocketMQ在阿里集团被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,binglog分发等场景。 数据可靠性 RocketMQ支持异步实时刷盘,同步刷盘,同步Replication,异步Replication Kafka使用异步刷盘方式,异步Replication/同步Replication 总结:RocketMQ的同步刷盘在单机可靠性上比Kafka更高,不会因为操作系统Crash,导致数据丢失。

Kafka使用总结与生产消费Demo实现

℡╲_俬逩灬. 提交于 2020-01-15 19:01:34
什么是kafka Kafka官网自己的介绍是:一个可支持分布式的流平台。 kafka官网介绍 kafka三个关键能力: 1.发布订阅记录流,类似于消息队列与企业信息系统 2.以容错的持久方式存储记录流 3.对流进行处理 kafka通常应用再两大类应用中: 1.构建实时流数据管道,在系统或应用程序之间可靠地获取数据 2.构建转换或响应数据流的实时流应用程序 kafka的一些基本概念: 1.Kafka作为一个集群运行在一个或多个服务器上,这些服务器可以跨越多个数据中心。 2.Kafka集群将记录流存储在称为topic的类别中。 3.每个记录由一个键、一个值和一个时间戳组成。 kafka核心API: 1.Producer API:允许应用程序将记录流发布到一个或多个topic。 2.Consumer API:允许应用程序订阅一个或多个topic并处理生成给它们的记录流。 3.Streams API:允许应用程序充当流处理器,使用来自一个或多个topic的输入流, 并生成一个或多个输出topic的输出流,从而有效地将输入流转换为输出流。 4.Connector API:允许构建和运行可重用的生产者或消费者,将topic连接到现有的应用程序或数据系统。 例如,到关系数据库的连接器可能捕获对表的每个更改。 作为消息系统 传统消息传递有两类模型:消息队列、发布订阅。在消息队列中

rocketMQ之十 事务

倾然丶 夕夏残阳落幕 提交于 2020-01-14 08:07:23
事务 事务消息的发送和提交 发送消息(half消息) 服务端响应消息写入结果 根据发送结果执行本地事务(如果写入失败,辞职half消息对业务不可见,本地逻辑不执行) 根据本地事务状态进行Commit或Rollbace(commit之后对消费者可见) 事务补偿 对没有commit/rollback的事务消息(pending状态的消息),从服务端发起一次回查 producer收到回查消息,检查回查消息对应的本地事务的状态 根据本地事务状态,重新commit或者rollback 补偿阶段是用来解决消息commit或rollback发生超时或失败的情况 事务消息状态 TransactionStatus.CommitTransaction:提交事务,允许消费者消费此消息 TransactionStatus.RollbackTransaction:回滚事务,该消息将被删除,不允许被消费 TransactionStatus.Unknown:中间状态,需要检查消息队列来确定状态 生产者 public class DefaultProducer { public static void main(String[] args) throws Exception { TransactionListrnerImpl listrner = new TransactionListrnerImpl(); /

RocketMQ

◇◆丶佛笑我妖孽 提交于 2020-01-14 03:38:38
http://rocketmq.apache.org/docs/quick-start/ 解压后添加启动脚本 nohup sh bin/mqnamesrv >> logs/namesrv.log 2>&1 & nohup sh bin/mqbroker -n localhost:9876 >> logs/broker.log 2>&1 & 启动broker的时候可能会报错 修改bin/runbroker.sh里面的JVM配置 JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g" 监控界面: https://github.com/apache/rocketmq-externals/tree/master/rocketmq-console 参考文章: https://www.cnblogs.com/cac2020/p/9447938.html 按文中部署后运行程序还报错: 直接在/etc/hosts中添加 127.0.0.1 dev-server02 再次运行即可 集群部署 使用2台机器,用2m-noslave 模式 2台机器IP为: 172.20.102.194 mq2 172.20.102.150 mq1 在两台机器的/etc/hosts中添加上面的配置 在mq1机器上配置 conf/2m-noslave/broker-a

RocketMQ 可视化环境搭建和基础代码使用

爱⌒轻易说出口 提交于 2020-01-14 01:47:06
RocketMQ 是一款分布式消息中间件,最初是由阿里巴巴消息中间件团队研发并大规模应用于生产系统,满足线上海量消息堆积的需求, 在 2016 年底捐赠给 Apache 开源基金会成为孵化项目,经过不到一年时间正式成为了 Apache 顶级项目。 早期阿里曾经基于 ActiveMQ 研发消息系统, 随着业务消息的规模增大,瓶颈逐渐显现,后来也考虑过Kafka,但因为在低延迟和高可靠性方面没有选择,最后才自主研发了 RocketMQ, 各方面的性能都比目前已有的消息队列要好,RocketMQ 和 Kafka 在概念和原理上都非常相似,所以也经常被拿来对比;RocketMQ 默认采用长轮询的拉模式, 单机支持千万级别的消息堆积,可以非常好的应用在海量消息系统中。 本文分为三部分,如下图所示: 1 安装 RocketMQ—Windows 版本 (1)下载 Windows 安装包 Windows 版本下载地址: http://rocketmq.apache.org/release_notes/ 下载并解压 rocketmq 安装包。 (2)配置系统环境变量 配置系统变量 ROCKETMQ_HOME=“D:\soft\rocketmq-all-4.5.1-bin-release”,如下图所示: 注意:每个人 rocketmq 存放目录不一样,我的在 D:\soft 下

(二)RocketMQ控制台搭建

混江龙づ霸主 提交于 2020-01-13 17:01:20
1、下载开源的rocketmq-externals项目 https://github.com/apache/rocketmq-externals 2、进入到rocketmq-console目录,编译jar包 mvn clean package -Dmaven.test.skip=true 3、jar包编译好后,在target目录下,执行如下命令启动 java -jar rocketmq-console-ng-1.0.1.jar --server.port=9877 --rocketmq.config.namesrvAddr=localhost:9876 4、页面访问:ip:端口 端口为步骤3的server.port=9877 来源: CSDN 作者: wang小猴 链接: https://blog.csdn.net/wangqian19920214/article/details/103957646