RocketMQ踩坑记

一、前言

现在的主流消息队列基本都是kafka、RabbitMQ和RocketMQ,只有了解各自的优缺点才能在不同的场景选择合适的MQ,对比图如下:

MQ对比图

本篇文章主要介绍我自己在跑官方demo时遇到的一些坑(基于4.3版本),建议先看看RocketMQ的理论知识。

Apache 上开源官方地址:https://rocketmq.apache.org/

GitHub 托管地址:https://github.com/apache/rocketmq

阿里官方的介绍文档:http://jm.taobao.org/2017/01/12/rocketmq-quick-start-in-10-minutes/

Apache 官方提供的 4.3.0 版本的 “快速入门” 文档:https://rocketmq.apache.org/docs/quick-start/

二、安装

安装过程可以参考官方的快速入门文档,这时可能会遇见第一个坑。

坑一:启动broker失败,查看日志nohup.out 显示内存不足

Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000005c0000000, 8589934592, 0) failed; error=‘Cannot allocate memory‘ (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 8589934592 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /usr/local/rocketmq-all-4.3.0/distribution/target/apache-rocketmq/hs_err_pid7209.lo

这是因为 apache-rocketmq/bin 目录下启动 nameserv 与 broker 的 runbroker.shrunserver.sh 文件中默认分配的内存太大,而系统实际内存却太小导致启动失败。解决办法就是修改runbroker.shrunserver.sh里的内存配置,调小一些即可。

runserver.sh

runbroker.sh

三、运行官方示例

这时候在服务器启动好namesrv和broker,你以为建个项目复制好代码就万事大吉了?

项目截图

坑二:No route info of this topic

运行OnewayProducer的main方法控制台可能报如下错误:

org.apache.rocketmq.client.exception.MQClientException: No route info of this topic

网上的解决方案有好几种,主要如下:

1.没有创建topic

原因归于我们没有创建topic,要把启动broker的命令改为nohup sh bin/mqbroker -n localhost:9876 autoCreateTopicEnable=true &

默认情况下 broker会自动创建话题,所以这个完全是没用的。

2.防火墙问题

如果真是防火墙问题,那报错信息一定连接失败什么的,当时我也以为是这个问题但是发现防火墙已经关闭了。

3.pom文件的jar问题

pom文件上rocketmq-client的版本要与 /usr/local/rocketmq-all-4.3.2/distribution/target/apache-rocketmq/lib目录下的jar包版本一致。当时项目pom.xml上的版本是4.3,RocketMQ上的是rocketmq-client-4.3.2.jar,后来将依赖改为4.3.2就好。

4.broker未启动完毕

这是我发现的一种情况,broker启动是需要时间的,日志显示启动成功后再运行代码。

坑三:org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to <172.19.0.1:10909> failed

再次运行OnewayProducer会发现错误又变了!

Exception in thread "main" org.apache.rocketmq.client.exception.MQClientException: Send [1] times, still failed, cost [4190]ms, Topic: TopicTest, BrokersSent: [bogon]
See http://rocketmq.apache.org/docs/faq/ for further details.
    at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:610)
    at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendOneway(DefaultMQProducerImpl.java:905)
    at org.apache.rocketmq.client.producer.DefaultMQProducer.sendOneway(DefaultMQProducer.java:285)
    at cn.sp.simple.OnewayProducer.main(OnewayProducer.java:21)
Caused by: org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to <172.19.0.1:10909> failed
    at org.apache.rocketmq.remoting.netty.NettyRemotingClient.invokeOneway(NettyRemotingClient.java:561)
    at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessage(MQClientAPIImpl.java:324)
    at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessage(MQClientAPIImpl.java:294)
    at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendKernelImpl(DefaultMQProducerImpl.java:785)
    at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:529)
    ... 3 more

重点在于connect to <172.19.0.1:10909> failed这里的ip地址并不是我本地虚拟机的ip地址,我们需要手动设置broker的ip地址。

#进入rocketmq根目录
cd /usr/local/rocketmq-all-4.3.2/distribution/target/apache-rocketmq
#编写配置文件,并写好配置
echo "brokerIP1=10.2.x.x" > broker.properties
#启动 mqnamesrv
nohup sh bin/mqnamesrv &

#重点:mrbroker 启动时通过 -c 加载配置文件
nohup sh bin/mqbroker -n localhost:9876 -c /usr/local/rocketmq-all-4.3.2/distribution/target/apache-rocketmq/broker.properties &

这时可以正常的生产消息和消费了,但是当我运行异步生产消息的AsyncProducer时又开始报错了!

坑四:官方示例AsyncProducer代码错误

错误信息截图

问题的原因是主线程提前关闭,导致异步线程受到影响,所以可以用CountDownLatch来解决,修改后代码如下:

public class AsyncProducer {

  public static void main(String[] args) throws Exception {
    //Instantiate with a producer group name.
    DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name");
    // Specify name server addresses.
    producer.setNamesrvAddr("192.168.75.132:9876");
    //Launch the instance.
    producer.start();
    producer.setRetryTimesWhenSendAsyncFailed(0);
    int messageCount  = 100;

    final CountDownLatch countDownLatch  = new CountDownLatch(messageCount);
    for (int i = 0; i < messageCount; i++) {
      final int index = i;
      //Create a message instance, specifying topic, tag and message body.
      Message msg = new Message("TopicTest",
          "TagA",
          "OrderID188",
          "Hello world".getBytes(RemotingHelper.DEFAULT_CHARSET));
      producer.send(msg, new SendCallback() {
        @Override
        public void onSuccess(SendResult sendResult) {
          countDownLatch.countDown();
          System.out.printf("%-10d OK %s %n", index,
              sendResult.getMsgId());
        }
        @Override
        public void onException(Throwable e) {
          countDownLatch.countDown();
          System.out.printf("%-10d Exception %s %n", index, e);
          e.printStackTrace();
        }
      });
    }
    countDownLatch.await();
    //Shut down once the producer instance is not longer in use.
    producer.shutdown();
  }
}

重新运行该类,发现问题终于解决了。

enter description here

补充一下RocketMQ可视化控制台的搭建步骤

  1. 下载源代码,github地址为:https://github.com/apache/rocketmq-externals
  2. 进入目录rocketmq-console,运行命令 mvn clean package -DskipTests=true得到jar包文件rocketmq-console-ng-1.0.1.jar
  3. 上传rocketmq-console-ng-1.0.1.jar,使用nohup命令启动即可。
  4. 游览器访问http://ip:8080即可看到web管理界面,如下图。

enter description here

四、总结

原本以为就搭个环境跑个demo很快就能完成,没想到遇到了这么多坑,不过也收获很多。

参考资料:

https://blog.csdn.net/wangmx1993328/article/details/81536168

https://my.oschina.net/u/3476125/blog/897429

https://blog.csdn.net/jessDL/article/details/86646086

原文地址:https://www.cnblogs.com/2YSP/p/11616376.html

时间: 2024-10-12 01:40:53

RocketMQ踩坑记的相关文章

踩坑记:httpComponents 的 EntityUtils

今天写的一个服务程序,有人报告获得的数据中文乱码,而我是用 apache 通过 httpComponents 去取得数据的,于是开启日志的 debug 级别. 在日志里果然发现中文不见了,有乱码出现: 2014-07-02 16:35:01.348 DEBUG [Wire.java:86] http-outgoing-8 << "<?xml version="1.0" encoding="UTF-8"?>... subject=&q

Spark踩坑记——数据库(Hbase+Mysql)转

转自:http://www.cnblogs.com/xlturing/p/spark.html 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值.最近一个实时消费者处理任务,在使用spark streaming进行实时的数据流处理时,我需要将计算好的数据更新到hbase和mysql中,所以本文对spark操作hbase和mysql的内容进行总结,并且对自己踩到的一些坑进行记录. Spark Streaming持久化设计

Spring @Transactional踩坑记

@Transactional踩坑记 总述 ? Spring在1.2引入@Transactional注解, 该注解的引入使得我们可以简单地通过在方法或者类上添加@Transactional注解,实现事务控制. 然而看起来越是简单的东西,背后的实现可能存在很多默认规则和限制.而对于使用者如果只知道使用该注解,而不去考虑背后的限制,就可能事与愿违,到时候线上出了问题可能根本都找不出啥原因. 踩坑记 1. 多数据源 事务不生效 背景介绍 ? 由于数据量比较大,项目的初始设计是分库分表的.于是在配置文件中

[转]Spark 踩坑记:数据库(Hbase+Mysql)

https://cloud.tencent.com/developer/article/1004820 Spark 踩坑记:数据库(Hbase+Mysql) 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值. 最近一个实时消费者处理任务,在使用spark streaming进行实时的数据流处理时,我需要将计算好的数据更新到hbase和mysql中,所以本文对spark操作hbase和mysql的内容进行总结,并且对自己

记一次 Spring 事务配置踩坑记

记一次 Spring 事务配置踩坑记 问题描述:(SpringBoot + MyBatisPlus) 业务逻辑伪代码如下.理论上,插入数据 t1 后,xxService.getXxx() 方法的查询条件会不满足,会查询不到数据.结果事与愿违,后一次的查询,居然查到了数据. void saveXxx(){  xxService.getXxx(); // 查到一条数据 data1  xxService.insert(); // 插入一条数据 t1  xxService.getXxx(); // 查到

阿里云ECS搭建Kubernetes集群踩坑记

阿里云ECS搭建Kubernetes集群踩坑记 [TOC] 1. 现有环境.资源 资源 数量 规格 EIP 1 5M带宽 ECS 3 2 vCPU 16 GB内存 100G硬盘 ECS 3 2 vCPU 16 GB内存 150G硬盘 SLB 2 私网slb.s1.small 2. 规划 坑: 上网问题,因为只有一个EIP,所有其它节点只能通过代理上网; 负载均衡问题,因为阿里不支持LVS,负载均衡TCP方式后端又不支持访问负载均衡,HTTP和HTTPS方式,只支持后端协议为HTTP; 为了避免上

HttpWebRequest 改为 HttpClient 踩坑记-请求头设置

HttpWebRequest 改为 HttpClient 踩坑记-请求头设置 Intro 这两天改了一个项目,原来的项目是.net framework 项目,里面处理 HTTP 请求使用的是 WebReauest,但是 WebRequest 已经不再推荐使用了,你如果在项目中使用的话,编译器会警告, WebRequest已过时,新项目要 .Net standard 重写就直接 HttpClient 来处理 HTTP 请求了,在改的过程中踩了几个坑,记录一下 请求头处理 HttpClient 通常

windows container 踩坑记

windows container 踩坑记 Intro 我们有一些服务是 dotnet framework 的,不能直接跑在 docker linux container 下面,最近一直在折腾把它部署在 windows container 下,折腾的有点恶心,记录一下. Windows Container 介绍 Windows Container 是微软在 Windows 上的虚拟化实践,它可以提供操作系统级别的虚拟化. 通过我们说的容器化大多是指 Linux Container,基于 linu

coding的svn服务踩坑记

https://www.hojun.cn/https://www.hojun.cn/https://www.hojun.cn/https://www.hojun.cn/https://www.hojun.cn/https://www.hojun.cn/https://www.hojun.cn/https://www.hojun.cn/https://www.hojun.cn/https://www.hojun.cn/ 前言 Q:咳咳,为啥会用到Coding的SVN?A:博主电脑上已经配好一个co