Linux rocketMQ 安装和使用

在对比了RabbitMQ,apacheMQ之后,发现还是 rocketMQ 好用。
为什么好用,百度查查就都知道了。
不说废话直接说说 Linux安装:

1、需要软件(免安装版)

  下载地址
  [release  下载地址](https://github.com/apache/incubator-rocketmq/releases)
  https://github.com/apache/incubator-rocketmq/releases
  rocketmq-all-4.0.0-incubating-bin-release.zip

2、安装JDK环境

就不多说了

3、启动namesrv

进入安装文件夹的bin 下面

这里写图片描述
使用命令:nohup sh mqnamesrv &
查看 nohup日志
这里写图片描述
发现报错信息Caused by: java.net.UnknownHostException: smkzfbweb02: 未知的名称或服务
这个时候查看文件/etc/hosts 和 /etc/hostname
发现问题所在了,我的生产服务器的hostname 被管理员改了,但是没有加入到 hosts 对应列表中,所以报错。java.net.UnknownHostException

我们修改 /etc/hosts 文件
这里写图片描述

再次启动
The Name Server boot success. serializeType=JSON

4、启动broker

使用命令 nohup sh mqbroker -n “1273.0.0.1:9876” &
查看日志
这里写图片描述
这里说的是# Native memory allocation (malloc) failed to allocate 8589934592 bytes for committing reserved memory. 内存不足够了。
查看配置文件
这里写图片描述
runbroker.sh文件是 broker 的启动文件
runserver.sh 文件是 namesev 启动文件

查看
这里写图片描述
这里写图片描述

这里发现他们的默认需要的内存 都很大,所以根据自己的服务器配置 减少一些配置

配置好了之后再启动就OK了。

package com.cat.common.rocketmq;

import java.util.Properties;

import org.apache.log4j.Logger;

import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;
import com.alibaba.rocketmq.client.exception.MQClientException;
import com.alibaba.rocketmq.client.producer.DefaultMQProducer;
import com.alibaba.rocketmq.client.producer.SendResult;
import com.alibaba.rocketmq.common.message.Message;
import com.alibaba.rocketmq.common.protocol.heartbeat.MessageModel;
import com.cat.common.lang.RDate;
import com.cat.common.lang.RString;
import com.cat.common.lang.RUuid;
import com.cat.common.properties.PropertiesUtil;

/**
 * RocketMQ不保证消息不重复,如果你的业务需要保证严格的不重复消息,需要你自己在业务端去重。
 * 线上应该关闭autoCreateTopicEnable,即在配置文件中将其设置为false。。后果就是:以后所有该TOPIC的消息,都将发送到这台broker上,达不到负载均衡的目的。
 * API 3.6.2.Final JAR包是有问题,不推荐使用,目前使用,3.5.9JAR 可以
 * 使用3.6.2jar问题是,生产者发送的消息,消费者消费后,不能把消息状态同步给 broken,导致消费者 重启后,还是会再次受到 消息,重复消费。
 * 集群消费者= 多个消费者都是 集群消费者,订阅了同一个消息后,broken会把消息平均分配到 所有集群消费者
 * 不同的集群消费者(指定了不通的组名),订阅同一个TOPIC ,都会收到这个topic消息
 * 广播消费者= 多个广播消费者 订阅了同一个消息后,每个广播消费者都会 接收到消息
 * 同一个JVM里面只能存在唯一的 组名+实例名 的 生产者,或者是消费者,所以以下的生产者和消费者的实例名称都用uuid 指定
 * @author luoyang
 *
 */
public class RocketMqUtils{

   private static Logger _logger = Logger.getLogger(RocketMqUtils.class);

   private static final Logger _socketLog = Logger.getLogger("SocketMQSendMessage");

   private static DefaultMQProducer producer;

   private static DefaultMQPushConsumer consumer;

   private static DefaultMQPushConsumer broadConsumer;

   private static Object obj = null;

   private static Properties properties = null;

   private static void initProperties(){
      if(null == properties){
         properties = new Properties();
//         String path = RSystemConfig.Home_Path + "socketmq.properties";
         String path =  "d://socketmq.properties";
         properties = PropertiesUtil.getInstance().getProperties(path);
         _logger.info(" init socketmq.properties success.");
      }
   }

   public static void sendMessage(String topic,
                                  String messageContent){
      try{
         if(RString.isBlank(topic)){
            return;
         }
         if(null == producer){
            getProducer();
         }
         _logger.info("sendMessage topic=" + topic + " messageContent=" + messageContent);
         _socketLog.info(RString.format("{0}, sendMessage topic={1}, messageContent={2}", RDate.getCurrentTimeStr() + "|", topic, messageContent));
         // topic, body
         Message msg = new Message(topic, messageContent.getBytes());
         SendResult sendResult = producer.send(msg);
         _logger.info("sendMessage  sendResult=  " + sendResult.toString());
      }catch(Exception e){
         _socketLog.error(RDate.getCurrentTimeStr() + "| sendMessage topic=" + topic + " messageContent=" + messageContent, e);
      }

   }

   /**
    * 发送消息,工具类
    * 
    * @param topic 
    * @param messageContent 消息内容
    * @param repeatTime 如果发送失败,允许重复发送的次数,每次失败间隔200ms之后继续发送
    */
   public static void sendMessage(String topic,
                                  String messageContent,
                                  int repeatTime){
      _logger.info("sendMessage  topic=" + topic + " messageContent=" + messageContent);
      _socketLog.info(RString.format("{0}, sendMessage topic={1}, messageContent={2}", RDate.getCurrentTimeStr() + "|", topic, messageContent));
      if(RString.isBlank(topic)){
         return;
      }
      if(null == producer){
         getProducer();
      }
      boolean result = false;
      for(int i = 1; i <= repeatTime; i++){
         try{
            Message msg = new Message(topic, messageContent.getBytes());
            SendResult sendResult = producer.send(msg);
            _logger.info("sendMessage  sendResult= " + sendResult.toString());
            result = true;
         }catch(Exception e){
            e.printStackTrace();
            _logger.error("send message have exception" + e + "topic=" + topic + " messageContent=" + messageContent);
         }
         _logger.info("sendMessage  topic=" + topic + " messageContent=" + messageContent);
         if(!result){
            try{
               Thread.sleep(200);
            }catch(InterruptedException e){
               e.printStackTrace();
               _logger.error("send message have exception" + e + "topic=" + topic + " messageContent=" + messageContent + "repeat time=" + i);
            }
            continue;
         }else{
            break;
         }
      }
   }

   private static synchronized DefaultMQProducer getProducer(){
      if(null != producer){
         return producer;
      }
      initProperties();
      //一个jvm内,具有相同producerGroup名字的生产者实例只有一个。 
      producer = new DefaultMQProducer(RTopicConstants.Product_Group);
      producer.setNamesrvAddr(properties.getProperty("namesrv_addr"));
      producer.setInstanceName(RUuid.makeUuid());
      try{
         // 生产者开启
         producer.start();
         // 关闭容器时,关闭生产者
         Runtime.getRuntime().addShutdownHook(new Thread(new Runnable(){

            public void run(){
               _logger.info("getProducer" + ".............producer.shutdown.....");
               producer.shutdown();
            }
         }));
         _logger.info("getProducer init product success..data[namesrvAddr={0}]" + properties.getProperty("namesrv_addr"));
      }catch(MQClientException e){
         e.printStackTrace();
         _logger.error("getProducer have exception" + e);
      }
      return producer;
   }

   public static DefaultMQPushConsumer getConsumer(){
      if(null != obj){
         return consumer;
      }
      initConsumer();
      return consumer;
   }

   public static DefaultMQPushConsumer getBroadConsumer(){
      if(null != obj){
         return broadConsumer;
      }
      initConsumer();
      return broadConsumer;
   }

   private static synchronized void initConsumer(){
      try{
         if(null == obj){
            initProperties();
            consumer = new DefaultMQPushConsumer(RTopicConstants.Consumer_Group);
            consumer.setNamesrvAddr(properties.getProperty("namesrv_addr"));
            consumer.setInstanceName(RUuid.makeUuid());

            broadConsumer = new DefaultMQPushConsumer(RTopicConstants.Broad_Consumer_Group);
            broadConsumer.setNamesrvAddr(properties.getProperty("namesrv_addr"));
            broadConsumer.setMessageModel(MessageModel.BROADCASTING);
            broadConsumer.setInstanceName(RUuid.makeUuid());

            obj = new Object();
            _logger.info("intConsumer init consumer success..data[namesrvAddr={0}]" + properties.getProperty("namesrv_addr"));
         }

      }catch(Exception e){
         e.printStackTrace();
         _logger.error("initConsumer have exception" + e);
      }
   }

}
package com.cat.common.rocketmq;


public class RTopicConstants{

   /**
    *  默认集群消费者
    */
   public static final String Consumer_Group="ConsumerGroup";

   /**
    * 广播消费者
    */
   public static final String Broad_Consumer_Group="BroadConsumerGroup";

   /**
    * 生产者群
    */
   public static final String Product_Group="ProductGroup";

   /**
    * 默认生产者
    */
   public static final String Instancename_Producer = "Producer";

   /**-------UIC消息TOPIC-------**/
   public static final String luoyang="luoyang";

}

生产者

package com.cat.common.rocketmq;

import java.util.HashMap;
import java.util.Map;

import com.cat.common.json.RJson;
import com.cat.common.lang.RDate;

public class DemoProduct{

   public static void main(String[] args){
      try{
         for(int i = 0; i < 5; i++){
            Map<String, Object> m = new HashMap<String, Object>();
            m.put("name", i+"1");
            m.put("age", 10);
            m.put("address", i+"杭州市晋江市带卡");
            String msg = RJson.getJson(m);
            RocketMqUtils.sendMessage(RTopicConstants.luoyang, msg);
            Thread.sleep(1000);
            System.out.println(RDate.getCurrentTimeStr()+ ",生产发送消息"+i);
         }

      }catch(Exception e){
         // TODO Auto-generated catch block
         e.printStackTrace();
      }

   }
}

消费者

package com.cat.common.rocketmq;

import java.util.List;

import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;
import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import com.alibaba.rocketmq.client.exception.MQClientException;
import com.alibaba.rocketmq.common.message.MessageExt;

public class DemoCustom{

   public static void initConsumer(){
      try{
         System.out.println("开启集群消费者1:");
         DefaultMQPushConsumer consumer = RocketMqUtils.getConsumer();
         consumer.subscribe(RTopicConstants.luoyang, "*");
         consumer.registerMessageListener(new MessageListenerConcurrently(){
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
                                                            ConsumeConcurrentlyContext context){
               try{
                  MessageExt msg = msgs.get(0);
                  String data = new String(msg.getBody());
                  if(msg.getTopic().equals(RTopicConstants.luoyang)){
                     System.out.println("集群消费者接收到消息:" + data);
                  }
               }catch(Exception e){
                  e.printStackTrace();
                  //一会之后重新发送,可自行判断 时候要重试
                  return ConsumeConcurrentlyStatus.RECONSUME_LATER;
               }
               //根据业务逻辑成功处理  返回成功
               return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
         });
         // 开启消费
         consumer.start();
      }catch(Exception e){
         e.printStackTrace();
      }

   }

   /**
    * 注册广播模式消息
    * @throws MQClientException
    */
   public static void initBroadConsumer()
         throws MQClientException{
      System.out.println("开启广播消费者");
      DefaultMQPushConsumer broadConsumer = RocketMqUtils.getBroadConsumer();
      broadConsumer.subscribe(RTopicConstants.luoyang, "*");
      broadConsumer.registerMessageListener(new MessageListenerConcurrently(){

         public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
                                                         ConsumeConcurrentlyContext context){
            try{
               MessageExt msg = msgs.get(0);
               String data = new String(msg.getBody());
               // 数据解析
               // 同步配置中心数据
               if(msg.getTopic().equals(RTopicConstants.luoyang)){
                  System.out.println("广播消费者接收到消息:" + data);
               }
            }catch(Exception e){
               e.printStackTrace();
               return ConsumeConcurrentlyStatus.RECONSUME_LATER;
            }
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
         }
      });
      broadConsumer.start();
   }

   public static void main(String[] args){
      try{
         initConsumer();
         initBroadConsumer();
      }catch(Exception e){
         e.printStackTrace();
      }

   }
}

对于生产者

 //一个jvm内,具有相同producerGroup名字的生产者实例只有一个。 
      producer = new DefaultMQProducer(RTopicConstants.Product_Group);
      producer.setNamesrvAddr(properties.getProperty("namesrv_addr"));
      producer.setInstanceName(RUuid.makeUuid());

同一个JVM 内 组名+InstanceName 必须唯一。
否则会报错。所以我这里设置的instanceName 是uuid

对于消费者
有两种,一种是广播,一种是集群

广播模式的消费者 消息不会保存在broken里面,直接下发到消费者中,所有的广播消费者都会消费消息。

集群模式,如果一组消费者的groupname 一致,就定义为是同一个消费集群。必须保证一台JVM 里面 消费者的instanceName 是唯一的。
同一组的集群消费者 平均消费 消息
并且,如果是集群消费,那么集群消费的所有消费者必须订阅相同的topic,否则会报错

### 回答1: Linux RocketMQ安装部署可以分为以下几个步骤: 1. 下载RocketMQ安装包,可以从官网或者GitHub上下载。 2. 解压安装包,可以使用tar命令进行解压。 3. 配置环境变量,将RocketMQ的bin目录添加到PATH环境变量中。 4. 配置RocketMQ的配置文件,包括namesrv和broker的配置文件。 5. 启动namesrv和broker,可以使用nohup命令将其作为后台进程运行。 6. 验证RocketMQ是否正常运行,可以使用命令行工具或者RocketMQ的Web控制台进行验证。 需要注意的是,在配置RocketMQ的配置文件时,需要根据实际情况进行配置,包括监听端口、存储路径、集群配置等。同时,在启动namesrv和broker时,也需要注意日志输出路径和日志级别的配置,以便于后续的问题排查和监控。 ### 回答2: RocketMQ是阿里巴巴开源的分布式消息队列系统,它具有高扩展性、高可用性和高性能,广泛应用于各种分布式系统中。本文将介绍在Linux系统中如何安装和部署RocketMQ。 1. 准备工作 在安装之前,需要准备好以下工具和环境: - JDK:要求JDK1.8及以上版本; - Maven:用于编译和打包RocketMQ源代码; - Git:用于下载和更新RocketMQ源代码; - CMake:用于构建RocketMQ Server和Client的C++代码; - 压缩工具:用于解压RocketMQ安装包。 2. 下载和编译源代码 在Linux系统中,使用以下命令下载和编译RocketMQ源代码: $ git clone https://github.com/apache/rocketmq.git $ cd rocketmq/ $ mvn -Prelease-all -DskipTests clean install -U 以上命令将下载RocketMQ源代码,并使用Maven编译和打包。编译完成后,在target目录下将生成如下文件: - bin目录:包含了rocketmq的启动脚本和配置文件; - conf目录:包含了rocketmq的配置文件; - distribution目录:包含了rocketmq的二进制文件和压缩包; - distribution/target目录:包含了rocketmq的编译结果。 3. 安装和部署 安装和部署RocketMQ需要进行以下步骤: 1. 下载和解压RocketMQ安装包 $ wget https://archive.apache.org/dist/rocketmq/4.9.0/rocketmq-all-4.9.0-bin-release.zip $ unzip rocketmq-all-4.9.0-bin-release.zip 2. 配置环境变量 $ export ROCKETMQ_HOME=/path/to/rocketmq-all-4.9.0-bin-release $ export PATH=$PATH:$ROCKETMQ_HOME/bin 3. 修改配置文件 RocketMQ的配置文件在conf目录下,包括broker.conf、namesrv.conf和logback_broker.xml等文件。可以根据实际需要进行修改。 4. 启动RocketMQ 启动NameServer: $ nohup sh bin/mqnamesrv & 启动Broker: $ nohup sh bin/mqbroker -n localhost:9876 & 以上命令将在后台启动NameServer和Broker。如果需要停止NameServer和Broker,可以使用以下命令: 停止NameServer: $ sh bin/mqshutdown namesrv 停止Broker: $ sh bin/mqshutdown broker 5. 测试RocketMQ 在启动RocketMQ后,可以使用RocketMQ的Java或C++ Client进行消息发送和消费的测试。例如,在Java Client中,可以使用以下代码发送和消费消息: public class ProducerTest { public static void main(String[] args) throws Exception { // 实例化生产者 DefaultMQProducer producer = new DefaultMQProducer("test-group"); // 设置NameServer地址 producer.setNamesrvAddr("localhost:9876"); // 启动生产者 producer.start(); // 发送消息 Message message = new Message( "test-topic", "test-tag", "Hello RocketMQ".getBytes(StandardCharsets.UTF_8) ); SendResult result = producer.send(message); System.out.println(result); // 关闭生产者 producer.shutdown(); } } public class ConsumerTest { public static void main(String[] args) throws Exception { // 实例化消费者 DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("test-group"); // 设置NameServer地址 consumer.setNamesrvAddr("localhost:9876"); // 订阅主题和标签 consumer.subscribe("test-topic", "test-tag"); // 注册消息监听器 consumer.registerMessageListener((MessageListenerConcurrently) (msgs, ctx) -> { for (MessageExt msg : msgs) { System.out.println(new String(msg.getBody())); } return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; }); // 启动消费者 consumer.start(); } } 以上代码将发送和消费一条消息。可以根据实际需要进行修改,测试消息发送和消费的功能。 总结 本文介绍了在Linux系统中安装和部署RocketMQ的步骤,包括下载和编译源代码、配置环境变量、修改配置文件、启动和停止RocketMQ以及测试RocketMQ的功能。RocketMQ是一款高性能、高可用性的分布式消息队列,应用广泛,具有较好的扩展性和稳定性。 ### 回答3: RocketMQ是一个分布式的消息中间件,具有高性能、高可靠、高可用等特点。在使用RocketMQ的过程中,需要对其进行安装部署。本文将介绍如何在Linux系统上安装和部署RocketMQ。 一、环境准备 在开始安装RocketMQ之前,需要先安装Java环境,如果已经安装可以跳过此步骤。 1. 安装Java 在Linux系统上安装Java的方法有很多种,这里介绍通过yum安装的方式。 ``` bash # 安装JDK yum install java-1.8.0-openjdk-devel.x86_64 -y ``` 安装完成后可以通过以下命令查看Java版本号 ```bash java -version ``` 如果正常输出则表示Java环境已经安装成功。 2. 安装RocketMQ RocketMQ官网提供了两种安装方式:二进制文件包和源码包。在此以二进制文件包的方式进行安装。 1. 下载RocketMQ 进入RocketMQ官网[http://rocketmq.apache.org/]下载页面, 下载最新版本的RocketMQ。选择一个版本并下载对应操作系统的二进制文件。 2. 解压文件 将下载的二进制文件解压到指定的目录。 ```bash tar -zxvf rocketmq-all-4.8.0-bin-release.tar.gz ``` 解压后将得到“rocketmq-all-4.8.0”的目录。 3. 配置环境变量 为了方便使用RocketMQ,需要将其添加到系统环境变量中,在终端中执行以下命令: ```bash # 配置环境变量 echo "export ROCKETMQ_HOME=`pwd`/rocketmq-all-4.8.0" >> ~/.bashrc echo "export PATH=$ROCKETMQ_HOME/bin:$PATH" >> ~/.bashrc ``` 4. 启动NameServer RocketMQ依赖于NameServer来管理主题和路由信息。在启动Broker之前,需要先启动NameServer。进入RocketMQ安装目录,执行如下命令: ```bash cd rocketmq-all-4.8.0 nohup sh bin/mqnamesrv & ``` 5. 启动Broker 启动Broker之前,需要在broker.conf配置文件中指定NameServer的地址,配置文件路径为: ```bash $ROCKETMQ_HOME/conf/broker.conf ``` 在终端中执行以下命令启动Broker: ```bash cd $ROCKETMQ_HOME nohup sh bin/mqbroker -n localhost:9876 & ``` 注意:启动Broker前,需要先启动NameServer。 到此,RocketMQ安装部署就完成了,可以使用RocketMQ的相关功能进行开发和测试。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值