RocketMQ中单机搭建踩过的坑(含保姆级教程)

前言

我是自己买的百元一年的服务器,按照RocketMQ官方给的快速开始,于是想着自己搭建一个,于是踩了很多坑,接下来一一列举

1.内存不足

按照官网编译之后,我把它放入到了opt路径下,根据你的安装路径进行变更,你应该进入到以下路径
/opt/rocketmq-all-4.9.5-source-release/distribution/target/rocketmq-4.9.5/rocketmq-4.9.5,首先确保路径正确

1.1 runserver.sh

默认安装的启动内存参数是非常大的,我当时安装的是JDK8,所以我就改的这个位置,如果你不放心的话,建议把所有地方的的-Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m
在这里插入图片描述

###1.2 runbroker.sh
在这里插入图片描述
官网对于broker 和namesrv的启动教本参数是一点没提,真的很坑,
如果你按照nohup sh bin/mqnamesrv & 启动namerserver的话,你会在当前的文件中看到一个nohup.out的输出文件,由于我这里已经调好了,没办法给大家截图了,只记得以下一句
insufficient memory for Java runtime 这个时候就需要进行上面的改动了
你以为调整以上两个文件就可以了吗?大错特错
如果你要按照官网往下走,用tools.sh来测一下自己搭建的有没有问题
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
你会发现启动不起来,因为这个tools.sh启动的时候也有自己相应的参数设置,同理你要进行以下调整,才可以进行测试
在这里插入图片描述

2.本地连不上Broker

2.1 RocketMQ默认端口

10909 10911 9876 这三个端口是要在防火墙打开的,我的是云服务上面的
在这里插入图片描述
打开之后,再把服务器上的防火墙关闭
systemctl status firewalld 先查看下状态 再进行关闭,否则本地如果用代码中的客户端连接时会报错,连接失败

2.2 broker配置文件相关

broker的配置文件是最搞人心态的,我在这个上面花了好几个小时,如果你尝试上面的方法都没生效的话,可以研究下这个.
官网给出的例子,nohup sh bin/mqbroker -n localhost:9876 --enable-proxy & proxy的用法还没深入研究,不过对于我们只是搭建起来,可以不用启动proxy,我们可以使用下面的命令进行启动nohup sh bin/mqbroker -n localhost:9876 -c ./conf/xxx.conf & RocketMQ其实给我们在conf目录下配置了一个默认的broker.conf,这个配置文件里面有很多无用的配置,特别容易造成疑惑,而且很多东西我们都是用不到的
在这里插入图片描述

如果你使用了它的默认配置文件那么,tools工具类是可以跑通的,但是之后你会遇到其他的问题时,又会产生疑惑,所以我建议我们新建个配置文件,自己定义配置项.
我这里贴出我的例子

terName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
brokerIP1=101.43.232.248
brokerIP2=101.43.232.248
namesrvAddr=101.43.232.248:9876
autoCreateTopicEnable=true

其中brokerIP需要改成自己服务器的公网IP, namesrvAddr也需要指定下,autoCreateTopicEnable=true,如果不配置这个的话,RocketMQ是不会帮我们自动创建topic的,当你在本地进行调试的时候会报错,一个No route info of this topic(请留意下这个问题,网上很多人都遇到了这个问题,下面我还会再说一个操作跟这个问题相关)

3.代码调试

3.1 Producer类

public class Producer {

    public static void main(String[] args) throws MQClientException, UnsupportedEncodingException, RemotingException,
            InterruptedException, MQBrokerException {
        // 创建一个消息生产者, 并设置一个消息生产者组
        DefaultMQProducer producer = new DefaultMQProducer("producer_group");

        // 指定NameServer地址

        producer.setNamesrvAddr("101.43.232.248:9876");

        producer.start();

        // 初始化Producer 在整个应用生命周期中只需要初始化一次
        for (int i = 0; i < 100; i++) {

            // 创建一个消息对象,指定其主题、标签和消息内容
            Message msg =
                    new Message("topic_example_java",
                            "TagA",
                            ("Hello Java demo RocketMQ" + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
            // 发送消息并返回结果
            SendResult send = producer.send(msg, 100000);
            System.out.println("send = " + send);
        }

        // 一旦生产者实例不再被使用,则将其关闭,包括清理资源 关闭网络连接等
        producer.shutdown();


    }
}

3.2 Consumer类

public class Consumer {

    public static void main(String[] args) throws MQClientException {
        // 创建一个消息消费者,并设置一个消息消费者组
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer_group");

        // 指定NameServer地址
        consumer.setNamesrvAddr("101.43.232.248:9876");
        // 设置consumer 第一次启动时是从队列头部还是队列尾部开始消费
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);

        // 订阅指定Topic下的所有消息
        consumer.subscribe("topic_example_java", "*");
        // 注册消息监听器
        consumer.registerMessageListener((List<MessageExt> list, ConsumeConcurrentlyContext context) -> {
            // 默认list 里只有一条消息,可以通过设置参数来批量接收消息
            if (list != null) {
                for (MessageExt ext : list) {
                    try {
                        System.out.println(new Date() + new String(ext.getBody(), "UTF-8"));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                }
            }

            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        });

        consumer.start();
        System.out.println("消息消费者已启动");

    }
}

先启动Consumer,防止消息出现丢失
在这里插入图片描述
再启动Producer
在这里插入图片描述
在这里插入图片描述

3.3 maven 依赖

        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-client</artifactId>
            <version>4.9.5</version>
        </dependency>

这里一定使用的Client一定要和我们部署的Server版本号要一致,否则会出现各种问题
connect xxxx:10911/10909 端口号失败,大多和客户端的版本号,broker的配置文件有关系,
如果你按照上面的教程还是搭建不起来,可以在下方评论留言

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coffee_babe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值