rocketmq

RocketMQ 源码学习笔记————Producer 是怎么将消息发送至 Broker 的?

天涯浪子 提交于 2019-12-01 02:31:40
目录 RocketMQ 源码学习笔记————Producer 是怎么将消息发送至 Broker 的? 前言 项目结构 rocketmq-client 模块 DefaultMQProducerTest RocketMQ 源码学习笔记————Producer 是怎么将消息发送至 Broker 的? 前言 本次分析基于 RocketMQ release-4.5.2 版本。 分析的目标是: RocketMQ 中 Producer 是怎么将消息发送至 Broker 的? 说到学习源码,首先当然是要把源代码下载下来, 官方地址 。使用 git clone https://github.com/apache/rocketmq.git 将源代码 clone 至本地。 项目结构 用 IDEA 打开该项目 rocketmq-client 模块 可以看到有很多子模块,这次学习的是 Producer 故打开 rocketmq-client 模块,可以在单元测试用找到测试 Producer 功能的类。 DefaultMQProducerTest 打开该类,观察其方法 可以看出以 test 开头的方法都是单元测试方法,可以直接运行。 init 方法和 terminate 分别是单元测试的初始化方法和销毁方法。 init 和 terminate // 创建一个默认的客户端实例 @Spy private

RocketMQ环境搭建

[亡魂溺海] 提交于 2019-11-30 23:06:11
目录 RocketMQ 环境搭建 下载 快速入门 启动 nameserver 和 broker 测试生成消费 关闭 nameserver 和 broker RocketMQ 可视化工具 Docker 使用方式 参考 RocketMQ 环境搭建 下载 Release Notes - Apache RocketMQ - Version 4.5.2 快速入门 Quick Start 启动 nameserver 和 broker unzip rocketmq.zip cd rocketmq/ nohup sh bin/mqnamesrv & nohup sh bin/mqbroker -n localhost:9876 & 配置外网访问 在 conf 文件夹下修改 broker.conf 添加 namesrvAddr = xx.xx.xx.xx:9876;xx.xx.xx.xx:9876 # (多个地址以;分隔) brokerIP1 = xx.xx.xx.xx enablePropertyFilter = true 启动 namesrv nohup mqnamesrv & 启动 broker nohup mqbroker -n xx.xx.xx.xx:9876 autoCreateTopicEnable=true -c /usr/local/rocketmq/conf/broker

RocketMq学习笔记001---Kafka,ActiveMQ、RabbitMQ、RocketMQ消息中间件的对比

瘦欲@ 提交于 2019-11-30 22:42:46
分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦。现在开源的消息中间件有很多,前段时间我们自家的产品 RocketMQ (MetaQ的内核) 也顺利开源,得到大家的关注。 那么,消息中间件性能究竟哪家强? 带着这个疑问,我们中间件测试组对常见的三类消息产品(Kafka、RabbitMQ、RocketMQ)做了性能比较。 Kafka是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache定级项目。Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输。0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业务。 RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。 RocketMQ是阿里开源的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。RocketMQ思路起源于Kafka,但并不是Kafka的一个Copy,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值

RocketMQ快速入门

百般思念 提交于 2019-11-30 20:10:24
如何使用 1、引入 rocketmq-client <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-client</artifactId> <version>4.1.0-incubating</version> </dependency> 2、编写Producer DefaultMQProducer producer = new DefaultMQProducer("producer_demo"); //指定NameServer地址 producer.setNamesrvAddr("192.168.116.115:9876;192.168.116.116:9876"); //修改为自己的 /** * Producer对象在使用之前必须要调用start初始化,初始化一次即可 * 注意:切记不可以在每次发送消息时,都调用start方法 */ producer.start(); for (int i = 0; i < 997892; i++) { try { //构建消息 Message msg = new Message("TopicTest" /* Topic */, "TagA" /* Tag */, ("测试RocketMQ" + i).getBytes(RemotingHelper

docker (save、push、load、)保存镜像拷贝镜像,以及镜像应用,复制镜像中的文件到服务器

对着背影说爱祢 提交于 2019-11-30 19:02:06
系统版本:Centos7 1、将mysql的tar文件保存在/tmp目录下 docker save 66bc0f66b7af >/tmp/mysql.tar docker save REPOSITORY:TAG>/tmp/mysql.tar #66bc0f66b7af 为mysql的id 另一种保存方法 [root@bjs1 mysql]# docker save -o rocketmq.tar rocketmq ##-o:指定保存的镜像的名字;rocketmq.tar:保存到本地的镜像名称;rocketmq:镜像名字,通过"docker images"查看 2、粘贴所需的镜像到需要的位置 scp mysql.tar 192.168.31.9:/root/cs/configurationtest/docker-env/mysql 从本地复制文件夹到服务器: scp -r /home/myfile/ root@192.168.1.100:/data/ 3、导入tar包到本地docker镜像 docker load < /tmp/new-image.tar 另一种方法: 我们有了本地的镜像文件,在需要的时候可以使用docker load将本地保存的镜像再次导入docker中。 docker load --input rocketmq.tar 或 docker load <

rocketMQ入门

浪尽此生 提交于 2019-11-30 16:28:53
一:什么是MQ MQ 就是 消息中间件。 二:为什么使用MQ 场景:电商双十一 零点的秒杀。在那一瞬间,来自用户的请求将会激增,如果不做任何措施,那服务很可能会被压垮。但是我们又不能直接把这些请求丢弃,而为了这个很小的时间段去扩容机器又显得大题小做。于是我们自然而言的想到,能不能把这些请求先放到一个消息队列里面,然后系统从消息队列里面拿出来请求做逻辑的处理和响应。通过拉长时间维度来保证服务的稳定性。这就是MQ。 使用MQ只要解决的就是 在生产者消费者模式中,生产者生产的数据可能会突然激增,消费者来不及消费的问题。 三:rocketMQ rocketMQ是一个MQ的实现。我们在开发中一直在强调,不要重复造轮子。既然我们需要一个MQ,那就找个别人实现过的MQ来用就行了。rocketMQ就是其中的一种。当然,还有其他的MQ组件,比如的 ActiveMQ、RabbitMQ,Kafka。 四:rocketMQ下载 http://rocketmq.apache.org/release_notes 下载bin的包,比如 rocketmq-all-4.3.2-bin-release.zip 五:安装 将下载的文件解压到对应目录。比如我解压到 C:\rocketmq-all-4.3.2 六:启动NAMESERVER 去 C:\rocketmq-all-4.3.2\bin目录下找到 mqnamesrv

Rocketmq原理&最佳实践

时光总嘲笑我的痴心妄想 提交于 2019-11-30 16:17:48
MQ背景&选型 消息队列作为高并发系统的核心组件之一,能够帮助业务系统解构提升开发效率和系统稳定性。主要具有以下优势: 削峰填谷(主要解决瞬时写压力大于应用服务能力导致消息丢失、系统奔溃等问题) 系统解耦(解决不同重要程度、不同能力级别系统之间依赖导致一死全死) 提升性能(当存在一对多调用时,可以发一条消息给消息系统,让消息系统通知相关系统) 蓄流压测(线上有些链路不好压测,可以通过堆积一定量消息再放开来压测) 目前主流的MQ主要是Rocketmq、kafka、Rabbitmq,Rocketmq相比于Rabbitmq、kafka具有主要优势特性有: • 支持事务型消息(消息发送和DB操作保持两方的最终一致性,rabbitmq和kafka不支持) • 支持结合rocketmq的多个系统之间数据最终一致性(多方事务,二方事务是前提) • 支持18个级别的延迟消息(rabbitmq和kafka不支持) • 支持指定次数和时间间隔的失败消息重发(kafka不支持,rabbitmq需要手动确认) • 支持consumer端tag过滤,减少不必要的网络传输(rabbitmq和kafka不支持) • 支持重复消费(rabbitmq不支持,kafka支持) Rocketmq、kafka、Rabbitmq的详细对比,请参照下表格: RocketMQ集群概述 RocketMQ集群部署结构 image

RocketMQ消息队列

岁酱吖の 提交于 2019-11-30 13:32:26
RocketMQ 功能 灵活可扩展性 RocketMQ 天然支持集群,其核心四组件(Name Server、Broker、Producer、Consumer)每一个都可以在没有单点故障的情况下进行水平扩展。 海量消息堆积能力 RocketMQ 采用零拷贝原理实现超大的消息的堆积能力,据说单机已可以支持亿级消息堆积,而且在堆积了这么多消息后依然保持写入低延迟。 支持顺序消息 可以保证消息消费者按照消息发送的顺序对消息进行消费。顺序消息分为全局有序和局部有序,一般推荐使用局部有序,即生产者通过将某一类消息按顺序发送至同一个队列来实现。 多种消息过滤方式 消息过滤分为在服务器端过滤和在消费端过滤。服务器端过滤时可以按照消息消费者的要求做过滤,优点是减少不必要消息传输,缺点是增加了消息服务器的负担,实现相对复杂。消费端过滤则完全由具体应用自定义实现,这种方式更加灵活,缺点是很多无用的消息会传输给消息消费者。 支持事务消息 RocketMQ 除了支持普通消息,顺序消息之外还支持事务消息,这个特性对于分布式事务来说提供了又一种解决思路。 回溯消费 回溯消费是指消费者已经消费成功的消息,由于业务上需求需要重新消费,RocketMQ 支持按照时间回溯消费,时间维度精确到毫秒,可以向前回溯,也可以向后回溯。 基本概念 下面是一张 RocketMQ 的部署结构图,里面涉及了 RocketMQ

Spring Cloud异步场景分布式事务怎样做?试试RocketMQ

你离开我真会死。 提交于 2019-11-30 07:09:30
一、背景 在微服务架构中,我们常常使用异步化的手段来提升系统的 吞吐量 和 解耦 上下游,而构建异步架构最常用的手段就是使用 消息队列(MQ) ,那异步架构怎样才能实现数据一致性呢?本文主要介绍如何使用 RocketMQ 的 事务消息 来解决一致性问题。 RocketMQ 是阿里巴巴开源的分布式消息中间件,目前已成为 Apache 的顶级项目。历经多次天猫双十一海量消息考验,具有高性能、低延时和高可靠等特性 PS :同步场景怎样保证一致性?请看文章《 Spring Cloud同步场景分布式事务怎样做?试试Seata 》 二、MQ选型 可以看到在 业务处理 方面来说 RocketMQ 优于其他对手,而且原生支持 事务消息 PS :业务系统用的是其他 MQ 产品但是又需要 事务消息 怎么办?学习原理自己开发实现! 三、什么是事务消息 例如下图的场景:生成订单记录 -> MQ -> 增加积分 我们是应该先 创建订单记录 ,还是先 发送MQ消息 呢? 先发送MQ消息 :这个明显是不行的,因为如果消息发送成功,而订单创建失败的话是没办法把消息收回来的 先创建订单记录 :如果订单创建成功后MQ消息发送失败 抛出异常 ,因为两个操作都在本地事务中所以订单数据是可以 回滚 的 上面的 方式二 看似没问题,但是 网络是不可靠的 !如果 MQ 的响应因为网络原因没有收到

RocketMQ的顺序消费和事务消费

六月ゝ 毕业季﹏ 提交于 2019-11-30 03:01:40
一、三种消费 :1.普通消费 2. 顺序消费 3.事务消费 1.1 顺序消费:在网购的时候,我们需要下单,那么下单需要假如有三个顺序,第一、创建订单 ,第二:订单付款,第三:订单完成。也就是这个三个环节要有顺序,这个订单才有意义。RocketMQ可以保证顺序消费,他的实现是生产者(一个生产者可以对多个主题去发送消息)将这个三个消息放在topic(一个topic默认有4个队列)的一个队列里面,单机支持上万个持久化队列,消费端去消费的时候也是只能有一个Consumer去取得这个队列里面的数据,然后顺序消费。 单个节点(Producer端1个、Consumer端1个) Producer端 package order; import java.util.List; import com.alibaba.rocketmq.client.exception.MQBrokerException; import com.alibaba.rocketmq.client.exception.MQClientException; import com.alibaba.rocketmq.client.producer.DefaultMQProducer; import com.alibaba.rocketmq.client.producer.MessageQueueSelector; import com