芋道 RocketMQ 安装部署

Windows下安装部署rocketmq win+R快捷键,键入 services.msc找到自己取名的服务名称启动,也可设置启动类型,之后本地电脑就可以不用每次打那边的命令或单独再启动工具项目了。 阅读详情

点击上方“芋道源码”,选择“设为星标”

做积极的人,而不是积极废人!

源码精品专栏

 

摘要: 原创出处 http://www.iocoder.cn/RocketMQ/install/ 「芋道源码」欢迎转载,保留摘要,谢谢!

  • 1. 概述

    • 1.1 基本概念

    • 1.2 整体架构

    • 1.3 整体流程

    • 1.4 更多文档

  • 2. 单机部署

  • 3. 集群部署

  • 4. Web Console 控制台

  • 5. 简单示例

  • 6. Spring Boot 使用示例

  • 7. Spring Cloud 使用示例

  • 666. 彩蛋


推荐阅读如下 RocketMQ 文章:

  • 《芋道 Spring Boot 分布式消息队列 RocketMQ 入门》

  • 《芋道 Spring Cloud Alibaba 消息队列 RocketMQ 入门》

  • 《芋道 Spring Cloud Alibaba 事件总线 Bus RocketMQ 入门》

  • 《性能测试 —— RocketMQ 基准测试》

1. 概述

在开始搭建 RocketMQ 服务之前,我们先来对它做下简单的了解。

RocketMQ 是阿里巴巴在 2012 年开源的分布式消息中间件,目前已经捐赠给 Apache 软件基金会,并于 2017 年 9 月 25 日成为 Apache 的顶级项目。作为经历过多次阿里巴巴双十一这种“超级工程”的洗礼并有稳定出色表现的国产中间件,以其高性能、低延时和高可靠等特性近年来已经也被越来越多的国内企业使用。

如下是 RocketMQ 产生的原因:

淘宝内部的交易系统使用了淘宝自主研发的 Notify 消息中间件,使用 MySQL 作为消息存储媒介,可完全水平扩容。

为了进一步降低成本,我们认为存储部分可以进一步优化。2011 年初,Linkin 开源了 Kafka 这个优秀的消息中间件,淘宝中间件团队在对 Kafka 做过充分 Review 之后, Kafka 无限消息堆积,高效的持久化速度吸引了我们。

但是,同时发现这个消息系统主要定位于日志传输,对于使用在淘宝交易、订单、充值等场景下还有诸多特性不满足,为此我们重新用 Java 语言编写了 RocketMQ ,定位于非日志的可靠消息传输(日志场景也 OK)。

目前 RocketMQ 在阿里集团被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理, binglog 分发等场景。

1.1 基本概念

在开始之前,胖友先认真阅读如下两个文档:

  • 概念(Concept):介绍 RocketMQ 的基本概念模型。

  • 特性(Features):介绍 RocketMQ 实现的功能特性。

1.2 整体架构

如下图所示:

  • 生产者(Producer):负责产生消息,生产者向消息服务器发送由业务应用程序系统生成的消息。

  • 消费者(Consumer):负责消费消息,消费者从消息服务器拉取信息并将其输入用户应用程序。

  • 消息服务器(Broker):是消息存储中心,主要作用是接收来自 Producer 的消息并存储, Consumer 从这里取得消息。

  • 名称服务器(NameServer):用来保存 Broker 相关 Topic 等元信息并给 Producer ,提供 Consumer 查找 Broker 信息。

1.3 整体流程

整体流程
  • 1、启动 Namesrv,Namesrv起 来后监听端口,等待 Broker、Producer、Consumer 连上来,相当于一个路由控制中心。

  • 2、Broker 启动,跟所有的 Namesrv 保持长连接,定时发送心跳包。

    心跳包中,包含当前 Broker 信息(IP+端口等)以及存储所有 Topic 信息。注册成功后,Namesrv 集群中就有 Topic 跟 Broker 的映射关系。

    • 3、收发消息前,先创建 Topic 。创建 Topic 时,需要指定该 Topic 要存储在哪些 Broker上。也可以在发送消息时自动创建Topic。

  • 4、Producer 发送消息。

    启动时,先跟 Namesrv 集群中的其中一台建立长连接,并从Namesrv 中获取当前发送的 Topic 存在哪些 Broker 上,然后跟对应的 Broker 建立长连接,直接向 Broker 发消息。

  • 5、Consumer 消费消息。

    Consumer 跟 Producer 类似。跟其中一台 Namesrv 建立长连接,获取当前订阅 Topic 存在哪些 Broker 上,然后直接跟 Broker 建立连接通道,开始消费消息。

1.4 更多文档

目前 RocketMQ 4 的中文文档很少,所以英文不太好的胖友,后续推荐看看如下资料:

  • 《RocketMQ 用户指南》 基于 RocketMQ 3 的版本。

  • 《RocketMQ 原理简介》 基于 RocketMQ 3 的版本。

  • 《RocketMQ 最佳实践》 基于 RocketMQ 3 的版本。

  • 《RocketMQ 开发者指南》 基于 RocketMQ 4 的版本。

  • 《阿里云 —— 消息队列 MQ》 阿里云的消息队列,就是 RocketMQ 的云服务。

2. 单机部署

可以参考 《Apache RocketMQ —— Quick Start》 文章。

本小节,我们会部署一套 RocketMQ 最小化的单机环境,包括一个 RocketMQ Namesrv 和 Broker 服务。部署完成之后,我们会测试消息的发送与消费。下面,让我们逐步开始。

2.1 前置条件

需要安装如下软件:

  • JDK 8+

  • Maven 3.2.X+

因为我们准备直接编译 RocketMQ 源码,构建出 RocketMQ 软件包。

2.2 下载源码

打开 RocketMQ release_notes 页面,我们可以看到 RocketMQ 所有的发布版本。这里,我们选择最新的 RocketMQ 4.6.0 版本。点击进入该版本的发布页面后,我们可以看到两种发布版本:

  • Source: rocketmq-all-4.6.0-source-release.zip

  • Binary: rocketmq-all-4.6.0-bin-release.zip

一般情况下,我们可以直接使用 Binary 版本,它是 RocketMQ 已经编译好,可以直接使用的 RocketMQ 软件包。

这里,我们想带着胖友们编译一次 RocketMQ 源码,所以使用 Source 版本。下面,我们开始下载 RocketMQ 4.6.0 Source 源码。命令行操作如下:

# 下载
$ wget wget http://mirror.bit.edu.cn/apache/rocketmq/4.6.0/rocketmq-all-4.6.0-source-release.zip

# 解压
$ unzip rocketmq-all-4.6.0-source-release.zip

2.2 编译源码

使用 Maven 编译 RocketMQ 源码。命令行操作如下:

# 进入 RocketMQ 源码目录
$ cd rocketmq-all-4.6.0-source-release

# Maven 编译 RocketMQ ,并跳过测试。耐心等待...
$ mvn -Prelease-all -DskipTests clean install -U

编译完成,在我们进入 distribution 目录下,就可以看到 RocketMQ 的发布包了。命令行操作如下:

# 进入 distribution 目录下
$ cd distribution/target/rocketmq-4.6.0/rocketmq-4.6.0

# 打印目录
$ ls
40 -rwxr-xr-x   1 yunai  staff  17336 Nov 19 20:59 LICENSE
 8 -rwxr-xr-x   1 yunai  staff   1338 Nov 19 20:59 NOTICE
16 -rwxr-xr-x   1 yunai  staff   4225 Nov 19 20:59 README.md
 0 drwxr-xr-x   6 yunai  staff    192 Dec  3 12:48 benchmark # 性能基准测试
 0 drwxr-xr-x  30 yunai  staff    960 Nov 19 20:59 bin # 执行脚本
 0 drwxr-xr-x  12 yunai  staff    384 Nov 19 20:59 conf # 配置文件
 0 drwxr-xr-x  36 yunai  staff   1152 Dec  3 12:48 lib # RocketMQ jar 包

2.3 启动 Namesrv

启动一个 RocketMQ Namesrv 服务。命令行操作如下:

nohup sh bin/mqnamesrv &

启动完成后,查看日志。

# 查看 Namesrv 日志。
$ tail -f ~/logs/rocketmqlogs/namesrv.log

2019-12-03 12:58:04 INFO main - The Name Server boot success. serializeType=JSON
  • 默认情况下,Namesrv 日志文件所在地址为 ~/logs/rocketmqlogs/namesrv.log 。如果想要自定义,可以通过 conf/logback_namesrv.xml 配置文件来进行修改。

2.4 启动 Broker

在 conf 目录下,RocketMQ 提供了多种 Broker 的配置文件:

  • broker.conf :单主,异步刷盘。

  • 2m/ :双主,异步刷盘。

  • 2m-2s-async/ :两主两从,异步复制,异步刷盘。

  • 2m-2s-sync/ :两主两从,同步复制,异步刷盘。

  • dledger/ :Dledger 集群,至少三节点。

这里,我们只启动一个 RocketMQ Broker 服务,所以使用 broker.conf 配置文件。命令行操作如下:

nohup sh bin/mqbroker -c conf/broker.conf  -n 127.0.0.1:9876 &
  • 通过 -c 参数,配置读取的主 Broker 配置。

  • 通过 -n 参数,设置 RocketMQ Namesrv 地址。

  • 如果胖友的服务器的存相对小,可以修改下 bin/runbroker.sh 脚本,将 Broker JVM 内存调小。如下:

    JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g"
    

启动完成后,查看日志。

tail -f ~/logs/rocketmqlogs/broker.log

2019-12-03 14:27:07 INFO main - The broker[broker-a, 192.168.3.44:10911] boot success. serializeType=JSON and name server is 127.0.0.1:9876
  • 默认情况下,Broker 日志文件所在地址为 ~/logs/rocketmqlogs/broker.log 。如果想要自定义,可以通过 conf/logback_broker.xml 配置文件来进行修改。

???? 至此,我们已经完成了 RocketMQ 单机部署。下面,我们开始进行下消息的发送和消费的测试。

2.5 测试发送消息

通过使用 bin/tools.sh 工具类,实现测试发送消息。命令行操作如下:

# 设置 Namesrv 服务器的地址
export NAMESRV_ADDR=127.0.0.1:9876

# 执行生产者 Producer 发送测试消息
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer

如果发送成功,我们会看到大量成功的发送日志。

SendResult [sendStatus=SEND_OK, msgId=FE800000000000004F2B5386138462F500000D7163610D67E7F100F4, offsetMsgId=C0A8032C00002A9F000000000000D7EE, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-a, queueId=0], queueOffset=61]
SendResult [sendStatus=SEND_OK, msgId=FE800000000000004F2B5386138462F500000D7163610D67E7F200F5, offsetMsgId=C0A8032C00002A9F000000000000D8D1, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-a, queueId=1], queueOffset=61]
  • 通过发送结果为 sendStatus=SEND_OK 状态,说明消息都发送成功了。

2.6 测试消费消息

通过使用 bin/tools.sh 工具类,实现测试消费消息。命令行操作如下:

# 设置 Namesrv 服务器的地址
export NAMESRV_ADDR=127.0.0.1:9876

# 执行消费者 Consumer 消费测试消息
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer

如果消费成功,我们会看到大量成功的消费日志。

ConsumeMessageThread_4 Receive New Messages: [MessageExt [queueId=2, storeSize=227, queueOffset=131, sysFlag=0, bornTimestamp=1575354513732, bornHost=/192.168.3.44:55510, storeTimestamp=1575354513733, storeHost=/192.168.3.44:10911, msgId=C0A8032C00002A9F000000000001D1FC, commitLogOffset=119292, bodyCRC=1549304357, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=145, CONSUME_START_TIME=1575354867104, UNIQ_KEY=FE800000000000004F2B5386138462F500000D7163610D67E944020E, CLUSTER=DefaultCluster, WAIT=true, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 53, 50, 54], transactionId='null'}]]
ConsumeMessageThread_3 Receive New Messages: [MessageExt [queueId=2, storeSize=227, queueOffset=130, sysFlag=0, bornTimestamp=1575354513729, bornHost=/192.168.3.44:55510, storeTimestamp=1575354513729, storeHost=/192.168.3.44:10911, msgId=C0A8032C00002A9F000000000001CE70, commitLogOffset=118384, bodyCRC=1530218044, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=145, CONSUME_START_TIME=1575354867103, UNIQ_KEY=FE800000000000004F2B5386138462F500000D7163610D67E941020A, CLUSTER=DefaultCluster, WAIT=true, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 53, 50, 50], transactionId='null'}]]
  • 通过 ConsumeMessageThread_4 和 ConsumeMessageThread_3 线程名,我们可以看出,目前是进行并发消费消息。

3. 集群部署

在生产环境下,必须搭建 RocketMQ 高可用集群,不然简直是找死。艿艿有个项目抠门了下,只搭建了一主一从,在一次主挂掉之后,因为 RocketMQ 不支持主从切换,就发生了线上事故。一般 RocketMQ 的集群部署方案推荐如下:

  • 如果对高性能有比较强的诉求,使用两主两从,异步复制,异步刷盘。

  • 如果对可靠性有比较强的诉求,建议使用 Dledger 集群,至少三节点。

因为在 《性能测试 —— RocketMQ 基准测试》 的 「5. 搭建集群」 小节中,我们已经详细描述了如何搭建一个一主一从的 RocketMQ 单集群。胖友可以参考该文,搭建一个二主两从的 RocketMQ 双集群。????

下面,艿艿额外放送下 RocketMQ 实现高可用的原理。感兴趣的胖友,可以瞅一瞅。

RocketMQ 集群

???? 1. Producer

  • 1、Producer 自身在应用中,所以无需考虑高可用。

  • 2、Producer 配置多个 Namesrv 列表,从而保证 Producer 和 Namesrv 的连接高可用。并且,会从 Namesrv 定时拉取最新的 Topic 信息。

  • 3、Producer 会和所有 Consumer 直连,在发送消息时,会选择一个 Broker 进行发送。如果发送失败,则会使用另外一个 Broker 。

  • 4、Producer 会定时向 Broker 心跳,证明其存活。而 Broker 会定时检测,判断是否有 Producer 异常下线。

???? 2. Consumer

  • 1、Consumer 需要部署多个节点,以保证 Consumer 自身的高可用。当相同消费者分组中有新的 Consumer 上线,或者老的 Consumer 下线,会重新分配 Topic 的 Queue 到目前消费分组的 Consumer 们。

  • 2、Consumer 配置多个 Namesrv 列表,从而保证 Consumer 和 Namesrv 的连接高可用。并且,会从 Consumer 定时拉取最新的 Topic 信息。

  • 3、Consumer 会和所有 Broker 直连,消费相应分配到的 Queue 的消息。如果消费失败,则会发回消息到 Broker 中。

  • 4、Consumer 会定时向 Broker 心跳,证明其存活。而 Broker 会定时检测,判断是否有 Consumer 异常下线。

???? 3. Namesrv

  • 1、Namesrv 需要部署多个节点,以保证 Namesrv 的高可用。

  • 2、Namesrv 本身是无状态,不产生数据的存储,是通过 Broker 心跳将 Topic 信息同步到 Namesrv 中。

  • 3、多个 Namesrv 之间不会有数据的同步,是通过 Broker 向多个 Namesrv 多写。

???? 4. Broker

  • 1、多个 Broker 可以形成一个 Broker 分组。每个 Broker 分组存在一个 Master 和多个 Slave 节点。

    • Master 节点,可提供读和写功能。Slave 节点,可提供读功能。

    • Master 节点会不断发送新的 CommitLog 给 Slave节点。Slave 节点不断上报本地的 CommitLog 已经同步到的位置给 Master 节点。

    • Slave 节点会从 Master 节点拉取消费进度、Topic 配置等等。

  • 2、多个 Broker 分组,形成 Broker 集群。

    • Broker 集群和集群之间,不存在通信与数据同步。

  • 3、Broker 可以配置同步刷盘或异步刷盘,根据消息的持久化的可靠性来配置。

4. Web Console 控制台

在 RocketMQ 拓展项目(rocketmq-externals) 中,包含了 RocketMQ Console 项目,是 RocketMQ 的图形化管理控制台,提供 Broker 集群信息查看,Topic 管理,Producer、Consumer 信息展示,消息查询等等常用功能。

虽然说,我们也可以使用 RocketMQ 提供的 CLI Admin Tool 工具,实现上述的查询与管理的功能,但是命令行的方式对操作人员的要求稍高一些。当然,在 RocketMQ Console 无法满足我们更精细化的管理的需求的时候,我们还是会使用 CLI Admin Tool 工具。

下面,让我们来搭建一个 RocketMQ Console 控制台。

4.1 克隆代码

将 rocketmq-externals 仓库的代码,克隆到本地。操作流程如下:

# 克隆代码
$ git clone https://github.com/apache/rocketmq-externals.git

# 进入 Console 目录
$ cd rocketmq-console

4.2 配置文件

如果胖友需要自定义 RocketMQ Console 的配置,可以进入该项目下的 src/main/resources/ 目录下,进行相应的配置文件修改。例如说,设置 RocketMQ Namesrv 地址,开启 RocketMQ Console 的登陆访问。

这里,我们修改 src/main/resources/application.properties 配置文件,通过设置 rocketmq.config.namesrvAddr=127.0.0.1:9876 配置项,设置 RocketMQ Namesrv 的地址。

4.3 编译源码

使用 Maven 编译 RocketMQ Console 源码。命令行操作如下:

# 编译
$ mvn clean package -Dmaven.test.skip=true

4.4 启动控制台

直接以 jar 的方式,启动控制台。注意,控制台使用 8080 端口。命令行操作如下:

nohup java -jar target/rocketmq-console-ng-1.0.1.jar &

启动完成后,查看日志。

$ tail -f nohup.out

[2019-12-03 16:05:19.349]  INFO Tomcat started on port(s): 8080 (http)
[2019-12-03 16:05:19.354]  INFO Started App in 5.341 seconds (JVM running for 6.104)
  • 当看到如上日志,说明 Console 控制台启动完成。

4.5 简单使用

使用浏览器,访问 http://127.0.0.1:8080/ 地址,我们就可以看到 RocketMQ Console 的界面。如下图:

更多的使用指南,胖友可以后续看看 《RocketMQ Console —— 使用文档》 。

5. 简单示例

本小节,我们来看看如何使用生产者 Producer 发送消息,和消费者 Consumer 消费消息。

在 Rocketmq 仓库的 example 目录下,提供了 RocketMQ 示例。本小节,我们主要来看看 qucikstart 这个最简示例。

5.1 Producer

Producer 类,提供生产者 Producer 发送消息的最简示例。代码如下:

// Producer.java

public class Producer {

    public static void main(String[] args) throws MQClientException, InterruptedException {

        /*
         * Instantiate with a producer group name.
         */
        // <1.1> 创建 DefaultMQProducer 对象
        DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name");
        // <1.2> 设置 RocketMQ Namesrv 地址
        producer.setNamesrvAddr("127.0.0.1:9876");

        /*
         * Specify name server addresses.
         * <p/>
         *
         * Alternatively, you may specify name server addresses via exporting environmental variable: NAMESRV_ADDR
         * <pre>
         * {@code
         * producer.setNamesrvAddr("name-server1-ip:9876;name-server2-ip:9876");
         * }
         * </pre>
         */

        /*
         * Launch the instance.
         */
        // <1.3> 启动 producer 生产者
        producer.start();

        for (int i = 0; i < 1000; i++) {
            try {

                /*
                 * Create a message instance, specifying topic, tag and message body.
                 */
                // <2.1> 创建 Message 消息
                Message msg = new Message("TopicTest" /* Topic */,
                    "TagA" /* Tag */,
                    ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
                );

                /*
                 * Call send message to deliver message to one of brokers.
                 */
                // <2.2> 同步发送消息
                SendResult sendResult = producer.send(msg);

                // <2.3> 打印发送结果
                System.out.printf("%s%n", sendResult);
            } catch (Exception e) {
                e.printStackTrace();
                Thread.sleep(1000);
            }
        }

        /*
         * Shut down once the producer instance is not longer in use.
         */
        // <3> 关闭 producer 生产者
        producer.shutdown();
    }

}
  • <1> 处,初始化一个 Producer 生产者。

    • <1.1> 处,创建 DefaultMQProducer 对象,这里设置的生产者分组是 "please_rename_unique_group_name" 。

    • <1.2> 处,设置 设置 producer 的 RocketMQ Namesrv 地址。这里,是艿艿额外添加的代码。

    • <1.3> 处,启动 producer 生产者。

  • <2> 处,使用 Producer 发送 1000 条消息。

    • <2.1> 处,创建 Message 消息。这里设置了其 Topic 为 "TopicTest",Tag 为 TagA、消息体 Body 为 "Hello RocketMQ" 的二进制数组。

    • <2.2> 处,调用生产者的  #send(Message msg) 方法,同步发送消息,等待发送结果。RocketMQ Producer 一共有三种发送消息的方式,除了我们这里看到的同步发送消息之外,还有异步发送消息(可见 AsyncProducer 示例),和 Oneway 发送消息。

    • <2.3> 处,打印发送结果。

  • <3> 处,关闭 producer 生产者。

执行 #main(args) 方法,开始发送消息。在控制台上,可以看到如下内容:

# 发送日志,省略另外 999 条日志
SendResult [sendStatus=SEND_OK, msgId=240E00E0F0931BB3FCEC071C1CDE61A8000018B4AAC20E79E06A03E7, offsetMsgId=C0A82BF000002A9F000000000008EE72, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-a, queueId=0], queueOffset=645]

# 关闭 Producer 日志
19:27:48.339 [NettyClientSelector_1] INFO  RocketmqRemoting - closeChannel: close the connection to remote address[127.0.0.1:9876] result: true
19:27:48.340 [NettyClientSelector_1] INFO  RocketmqRemoting - closeChannel: close the connection to remote address[192.168.43.240:10911] result: true

5.2 Consumer

Consumer 类,提供消费者 Consumer 消费消息的最简示例。代码如下:

// Consumer.java

public class Consumer {

    public static void main(String[] args) throws InterruptedException, MQClientException {

        /*
         * Instantiate with specified consumer group name.
         */
        // <1> 创建 DefaultMQPushConsumer 对象
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name_4");
        // <2> 设置 RocketMQ Namesrv 地址
        consumer.setNamesrvAddr("127.0.0.1:9876");

        /*
         * Specify name server addresses.
         * <p/>
         *
         * Alternatively, you may specify name server addresses via exporting environmental variable: NAMESRV_ADDR
         * <pre>
         * {@code
         * consumer.setNamesrvAddr("name-server1-ip:9876;name-server2-ip:9876");
         * }
         * </pre>
         */

        /*
         * Specify where to start in case the specified consumer group is a brand new one.
         */
        // <3> 设置消费进度,从 Topic 最初位置开始
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);

        /*
         * Subscribe one more more topics to consume.
         */
        // <4> 订阅 TopicTest 主题
        consumer.subscribe("TopicTest", "*");

        /*
         *  Register callback to execute on arrival of messages fetched from brokers.
         */
        // <5> 添加消息监听器
        consumer.registerMessageListener(new MessageListenerConcurrently() {

            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
                ConsumeConcurrentlyContext context) {
                System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
                // 返回成功
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }

        });

        /*
         *  Launch the consumer instance.
         */
        // <6> 启动 producer 消费者
        consumer.start();

        // 打印 Consumer 启动完成
        System.out.printf("Consumer Started.%n");
    }

}
  • <1> 处,创建 DefaultMQPushConsumer 对象,这里设置的消费者分组是 "please_rename_unique_group_name" 。注意,消费者分组的概念:

    FROM 概念(Concept)

    同一类 Consumer 的集合,这类 Consumer 通常消费同一类消息且消费逻辑一致。消费者组使得在消息消费方面,实现负载均衡和容错的目标变得非常容易。

    要注意的是,消费者组的消费者实例必须订阅完全相同的 Topic 。

    RocketMQ 支持两种消息模式:集群消费(Clustering)和广播消费(Broadcasting)。

    • 在集群消费下,同一条消息只会被相同消费者分组的一个消费者所消费。

    • 在广播消费下,同一条消息会被相同消费者分组的所有消费者所消费。

    • 在当前示例里,我们采用的是 DefaultMQPushConsumer 的默认消费方式,集群消费。

  • <2> 处,设置 consumer 的 RocketMQ Namesrv 地址。这里,是艿艿额外添加的代码。

  • <3> 处,设置一个新的消费集群,初始的消费进度。目前有三个选项:

    • CONSUME_FROM_FIRST_OFFSET :每个 Topic 队列的第一条消息。

    • CONSUME_FROM_LAST_OFFSET :每个 Topic 队列的最后一条消息。

    • CONSUME_FROM_TIMESTAMP :每个 Topic 队列的指定时间开始的消息。

    • ???? 注意,只针对新的消费集群。如果一个集群每个 Topic 已经有消费进度,则继续使用该消费进度。仔细理解一下哈~

  • <4> 处,设置订阅 "TopicTest" 主题的消息。有一定一定要注意!!!消费者组的消费者实例必须订阅完全相同的 Topic + Tag 。

  • <5> 处,添加消息监听器。这里我们采用的是 MessageListenerConcurrently 并发消费消息的监听器。如果胖友需要实现顺序消费消息,需要使用 MessageListenerOrderly 顺序消费的监听器。

  • <6> 处,启动 consumer 消费者。此时,Consumer 就开始正式的消费消息啦。。

执行 #main(args) 方法,开始消费消息。在控制台上,可以看到如下内容:

# 消费者启动成功
Consumer Started.

# 消费内容
ConsumeMessageThread_1 Receive New Messages: [MessageExt [queueId=2, storeSize=225, queueOffset=645, sysFlag=0, bornTimestamp=1575373846053, bornHost=/192.168.43.240:52717, storeTimestamp=1575373846058, storeHost=/192.168.43.240:10911, msgId=C0A82BF000002A9F000000000008EF55, commitLogOffset=585557, bodyCRC=613185359, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=646, CONSUME_START_TIME=1575373846067, UNIQ_KEY=240E00E0F0931BB3FCEC071C1CDE61A8000018B4AAC20E8EE6250000, CLUSTER=DefaultCluster, WAIT=true, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 48], transactionId='null'}]]
ConsumeMessageThread_2 Receive New Messages: [MessageExt [queueId=3, storeSize=225, queueOffset=645, sysFlag=0, bornTimestamp=1575373846060, bornHost=/192.168.43.240:52717, storeTimestamp=1575373846061, storeHost=/192.168.43.240:10911, msgId=C0A82BF000002A9F000000000008F036, commitLogOffset=585782, bodyCRC=1401636825, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=646, CONSUME_START_TIME=1575373846067, UNIQ_KEY=240E00E0F0931BB3FCEC071C1CDE61A8000018B4AAC20E8EE62C0001, CLUSTER=DefaultCluster, WAIT=true, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 49], transactionId='null'}]]
  • 通过 ConsumeMessageThread_1 和 ConsumeMessageThread_2 线程名,我们可以看出,目前是进行并发消费消息。

6. Spring Boot 使用示例

在 《芋道 Spring Boot 分布式消息队列 RocketMQ 入门》 中,我们来详细学习如何在 Spring Boot 中,整合并使用 RocketMQ 。???? 会方便很多。

7. Spring Cloud 使用示例

在如下的文章中,我们来详细学习如何在 Spring Cloud 中,整合并使用 RocketMQ 。???? 更加方便。

  • 《芋道 Spring Cloud Alibaba 消息队列 RocketMQ 入门》

  • 《芋道 Spring Cloud Alibaba 事件总线 Bus RocketMQ 入门》

666. 彩蛋

至此,我们已经完成了 RocketMQ 的入门。个人建议的话,对于初学 RocketMQ 的胖友,一定要认真仔细去读读 「1.4 更多文档」 推荐的内容,艿艿一路踩着“坑”过来,希望胖友能够走的平稳一些。很多时候,我们踩坑的原因,是因为我们没有认真仔细阅读相关的文档,在没有完全入门的情况下,匆匆忙忙将一个中间件就上线了。

这里,在额外推荐一些内容:

  • 《RocketMQ 入门 —— 原理与实践》 ,一文快速了解 RocketMQ 的原理与实践,非常不错,篇幅也在可接受的范围之内。

  • 《性能测试 —— RocketMQ 基准测试》 ,消息消息队列是我们非常重要的性能优化手段,那么到底它的性能有多强,何不上手测试一波~

  • 《RocketMQ 源码解析系列》 ,知其然,知其所以然。RocketMQ 是艿艿第一个特别完全看完的开源中间件,收获颇丰。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

rocketMQ安装部署详细解析 栉风沐雨,砥砺同行!你好,我是关惜寒! 近来研究了Apache开源项目rocketMQ(原为阿里项目),并在两台linux服务器上完成了部署,现在整理下,供大家参考学习。 一、简介rocketMQ RocektMQ是阿里巴巴在2012年开源的一个纯java、分布式、队列模型的第三代消息中间件,不仅在传统高频交易链路有着低延迟的出色表现,在实时计算等大数据领域也有着不错的吞吐。 20... 阅读详情

相关推荐

RocketMQ 5.0安装部署

在微服务架构逐渐成为主流的今天,消息队列如同数字世界的快递员,承担着系统间高效通信的重要使命。

G_whang的博客 2016

芋道Docker部署

docker部署芋道

m0_54013833的博客 8239

Linux安装部署RocketMQ

Linux安装部署RocketMQ引言安装步骤1. 安装JAVA2. 安装RocketMQ3. 安装Maven4. 编译RocketMQ5. 启动RocketMQ6. 测试RocketMQ7. 关闭 RocketMQ自启动 RocketMQ 引言 阿里巴巴其中一个核心分布式技术是RocketMq ,作为一款分布式的消息中间件,经过了淘宝双十一的洗礼,在功能和性能上远超过activeMq 1.要知道RocketMQ原生就是支持分布式的,而ActiveMQ原生存在单点性。 2.RocketMQ可以保证严格的

SToNE的博客 1797

芋道微服务代码部署

本文介绍了芋道微服务的前后端项目部署,主要是根据开源者提供的文档手动部署了一遍。

小何的博客 2435

【RocketMQ】安装与部署(Windows)

windows环境下尝试部署RocketMQ,以及处理一些可能出现的问题,包含一些处理思路等。

m0_52777015的博客 1万+

基于芋道源码的rocketmq源码版本再次对核心功能实现进行详细的注解标识,一款低延迟、可靠、可扩展、易用的面向消息的中间件

Apache RocketMQ 是阿里巴巴海量消息业务诞生的一款低延迟、可靠、可扩展、易用的面向消息的中间件。Pub/Sub 和 P2P 消息传递模型,在同一队列中实现可靠的 FIFO 和严格的顺序消息传递,长拉队列模型,也支持推流消费风格,单队列百万消息累积能力,通过各种消息传递协议,如JMS,MQTT等。,分布式高可用部署架构,满足至少一次消息投递语义,用于隔离测试和云隔离群集的 Docker 映像,功能丰富的管理仪表板,用于配置、指标和监控

芋道 Spring Cloud Alibaba 消息队列 RocketMQ 入门

RocketMQ是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。同时,广泛应用于多个领域,包括异步通信解耦、企业解决方案、金融支付、电信、电子商务、快递物流、广告营销、社交、即时通信、移动应用、手游、视频、物联网、车联网等。能够保证严格的消息顺序提供丰富的消息拉取模式高效的订阅者水平扩展能力实时的消息订阅机制亿级消息堆积能力。

shaozheng0503的博客 1448

【Lua面试】2021年Lua面试题分享(4.25更新)

lua深拷贝和浅拷贝的区别?如何实现深拷贝? lua中ipairs和pairs的区别? 链接: link.

qq_21407523的博客 2万+

【SpringCloud-Alibaba系列教程】14.一文教你入门RocketMQ

<本文已参与 RocketMQ Summit 优秀案例征文活动,点此了解详情> MQ简介 MQ(Message Queue)是一种跨进程的通信机制,用于消息传递。通俗点说,就是一个先进先出的数据结构。 MQ应用场景 异步解耦 很多场景不使用MQ会产生各个应用见紧密耦合在在一起,其实我们要遵循的原则就是高内聚低耦合,通过上图我们就可以看到,消息生产者,不管消息消费者状态如何,生产好的消息就直接投递到MQ中,消息消费者也是同样,不管消息生产者如何,只取MQ中的消息进行处理。这是解耦..

优快云云计算 711

保姆级教程:从零到飞,用QGC地面站搞定PX4无人机全流程配置(含避坑指南)

本文提供了一份详细的QGC地面站使用教程,指导用户从零开始配置PX4无人机,涵盖固件烧录、传感器校准、遥控器设置及航点规划等关键步骤,并包含实用的避坑指南,帮助新手顺利完成首飞。

weixin_30329623的博客 220

汽车电子电气架构演进:从分布式ECU到域集中与中央计算

汽车电子电气架构(EEA)是整车电子系统的顶层设计框架,定义了计算、通信、供电等核心要素的组织方式。其演进遵循从分布式到集中式的技术路径,旨在解决传统架构下ECU数量膨胀带来的成本、复杂度和协同难题。通过域控制器(DCU)整合功能域,以及向中央计算+区域控制架构发展,实现了硬件资源池化、软硬件解耦与高速通信。这一变革的核心技术价值在于提升算力利用率、简化线束布局、支持软件定义汽车(SDV)与持续OTA升级。在智能电动汽车时代,新架构为智能座舱、自动驾驶等复杂应用提供了可扩展的平台基础,推动了汽车产业从硬件导

weixin_30326741的博客 385

RocketMQ安装部署

nameserver是⼀个轻量级的注册中心,broker把自己的信息注册到nameserver上。JAXB,Java Architechture for Xml Binding,用于XML绑定的Java技术,是一个业界标准,是一 项可以根据XML Schema生成Java类的技术。刷盘策略指的是broker中消息的落盘方式,即消息发送到broker内存后消息持久化到磁盘的方式。执行启动命令,并且常驻内存,注意ip地址要配置成为服务的ip地址,保证地址以及端口能够访问。需要修改每台broker的配置文件。..

用生命研发技术 1万+

Verilog的综合指令

Synopsys综合指令

烟花一时的博客 5445

Windows下安装部署RocketMQ

Windows下安装部署RocketMQ超完整指南

write less , do more 7780

PD虚拟机安装CentOS7后必做的Parallels Tools配置指南(附常见错误解决)

本文详细指导在Mac的Parallels Desktop虚拟机中安装CentOS 7后如何高效配置Parallels Tools,包括环境准备、镜像挂载、依赖问题解决及性能优化。特别针对常见错误如挂载失败、依赖缺失等提供实用解决方案,帮助用户实现主机与虚拟机间的无缝交互和显示优化。

weixin_29288313的博客 301

Jetson工业级应用指南:用Orin NX 16GB打造多摄像头AI质检系统

本文详细介绍了如何利用NVIDIA Jetson Orin NX 16GB构建高效的多摄像头AI质检系统,涵盖硬件选型、软件优化及产线部署全流程。通过100 TOPS的AI算力和多路视频处理能力,Orin NX在工业4.0时代展现出卓越的实时缺陷检测性能,特别适合嵌入式AI应用场景。

Pepper的专栏 307

芋道框架在电商系统中的应用实践

框架选型体会芋道框架的微服务治理能力确实强大,特别是其内置的Sentinel流控规则配置界面,让我们可以实时调整限流策略应对突发流量。踩坑经验分享特别注意芋道版本与SpringCloud Alibaba组件的兼容性,我们曾因版本不匹配导致Nacos服务发现失效,建议严格按照官方文档的版本矩阵选择依赖。扩展性思考下一步计划利用芋道的插件机制开发智能推荐模块,将用户行为数据通过框架的审计日志功能自动采集到数据仓库。整个项目在InsCode(快马)平台。

IndigoNight21的博客 717

NXP(imx8qxp)系列DDR校准以及android镜像烧录

文章目录一、 不得不吐槽以下nxp的这个代码镜像烧写的过程,做得太开源了,导致镜像根本烧录不进去,实属令人头痛。 一、

永不秃头的程序员的博客 5991

RocketMQ安装部署详解

文章目录一、RocketMQ简介二、消息队列优点三、安装步骤1、环境要求2、下载3、Linux环境安装4、Windows环境安装5、程序访问 一、RocketMQ简介 RocektMQ是阿里巴巴在2012年开源的一个纯java、分布式消息中间件。RocektMQ具有低延迟、高性能、可靠性、万亿级别的容量和灵活的可伸缩性。2016年阿里巴巴将RocketMQ捐赠给Apache,2017年9月RocketMQ正式从Apache社区正式毕业,成为Apache顶级项目。 二、消息队列优点 消息队列的有应用解耦、流量

龚厂长的博客 8599

使用 Python 爬取网易云音乐歌单数据(完整教程)

随着在线音乐平台的普及,网易云音乐(NetEase Cloud Music)凭借其个性化的推荐算法和丰富的用户互动,吸引了大量用户。网易云音乐的歌单中包含了丰富的音乐数据,包括歌曲名、歌手、专辑、播放量、评论数等信息。通过爬取这些数据,可以对音乐流行趋势进行分析,挖掘音乐推荐策略,甚至训练个性化推荐模型。网易云音乐的 API 并未官方开放,但开发者通过抓包和逆向分析,找到了若干可用接口。✅ 数据清洗与存储(CSV/数据库)✅ 网易云音乐 API 接口分析。✅ 网易云音乐接口解析。✅ 同步与异步爬取实现。

2201_76125261的博客 1372

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

芋道 Spring Boot 消息队列 RocketMQ 入门

点击上方“芋道源码”,选择“设为星标”做积极的人,而不是积极废人!源码精品专栏原创 | Java 2020 超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络...

芋艿V 911

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

RocketMQ5 安装部署(单体)

rockert的单体部署,主要用于开发测试环境的学习;

JavaOpsPro的博客 2750

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【MacOS】RocketMQ安装及部署 RocketMQ Dashboard 可视化

本文详细介绍了如何安装和配置 Apache RocketMQ,以及如何使用 RocketMQ Dashboard 进行可视化管理。

Week_2019的博客 2478

Windows下安装RocketMQ

这里并不打算深入讲解RocketMQ的架构和特性,因为我觉得,针对于初学者,太早地深入知识细节,会让人感到迷惘,学习起来吃力。namesrvAddrs地址就是服务的地址,192.168.10.100是我虚拟主机的ip,如果是window环境下,改成localhost。两个部分,因此,用作本机开发调试用的最小应用,应该分别启动一个NameServer和一个Broker节点。以上的知识都来源于RocketMQ官网的参考文档,需要更多细节的同学, 可以打开。为文件名后缀,linux环境的脚本以。

GSON的博客 1680
上一篇: Apollo 源码解析 —— Portal 创建 Namespace
下一篇: 如何设计大数据架构?
公众号-芋道源码
博客等级 码龄10年 1629粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值