RocketMQ快速入门

RocketMQ快速入门_第1张图片

RocketMQ的发展历史

Apache RocketMQ 是一个开源的分布式消息中间件系统,最初由阿里巴巴集团开发并于2016年贡献给 Apache 软件基金会。以下是 RocketMQ 的发展历史的主要里程碑:

  1. 2012年:阿里巴巴内部项目

    • RocketMQ 最初是阿里巴巴内部的一个消息中间件项目,用于满足阿里巴巴集团内部的消息传递需求。

  2. 2016年5月:贡献给 Apache 软件基金会

    • 阿里巴巴宣布将 RocketMQ 开源并贡献给 Apache 软件基金会,成为 Apache 孵化器项目(Incubator)的一部分。

  3. 2017年11月:成为 Apache 顶级项目

    • RocketMQ 成为 Apache 顶级项目(Top-Level Project),标志着它已成为一个成熟的开源项目。

RocketMQ和Kafka

RocketMQ 和 Apache Kafka 都是开源的分布式消息中间件系统,它们用于实现高可靠性、高吞吐量的消息传递,RocketMQ的核心设计借鉴了Kafka,两者之间存在相似之处。

1. 发展历史:

  • RocketMQ 最初由阿里巴巴开发,后来贡献给 Apache 软件基金会。

  • Kafka 由LinkedIn开发,后来成为了Apache软件基金会的顶级项目。

2. 数据模型:

  • RocketMQ 使用主题(Topic)和标签(Tag)来组织消息。消息可以按主题进行分组,标签可以用来进一步过滤消息。

  • Kafka 使用主题(Topic)来组织消息。消息被发布到主题,消费者可以订阅主题来接收消息。

3. 存储机制:

  • RocketMQ 使用可定制的存储引擎来存储消息,默认使用的是 Apache RocketMQ Store。

  • Kafka 使用分布式文件系统(如 Apache Hadoop HDFS)来存储消息。

4. 消费模型:

  • RocketMQ 支持消息广播和集群模式。消息广播模式允许多个消费者同时接收相同的消息,而集群模式确保每个消息只有一个消费者接收。

  • Kafka 使用发布-订阅模型,其中每个主题的消息可以被多个消费者订阅。

5. 消费者偏移:

  • RocketMQ 使用消费者组概念,允许多个消费者协同消费消息。RocketMQ会跟踪每个消费者组的消费进度。

  • Kafka 使用偏移量(offset)来跟踪每个消费者的进度。消费者需要自己维护偏移量。

6. 消息保证:

  • RocketMQ 提供了严格有序消息传递的支持,可以用于需要严格的消息顺序性的场景。

  • Kafka 提供至少一次交付保证,但在某些情况下可能出现消息重复或乱序。

快速上手RocketMQ

简要介绍如何安装单机版的RocketMQ,以及简单地收发消息。

1.下载RocketMQ

地址下载 | RocketMQ,选择Binary下载的原因是Binary版本是一些编译好的jar和辅助的shell脚本。

RocketMQ快速入门_第2张图片

2.解压缩

使用FinalShell远程连接工具上传下载好的压缩包,存放路径在usr/local/rocketmq,把压缩包解压到目录下。

# 创建文件夹目录
cd /usr/local/
mkdir rocketmq
# 解压,我下上传是rocketmq-all-5.1.3-bin-release.zip
unzip rocketmq-all-5.1.3-bin-release.zip 

3.启动消息队列服务

单机的消息队列服务比较简单,不需要配置,一次启动NameServer和Broker就行。建议使用后台启动的方式。

RocketMQ快速入门_第3张图片

#进入RocketMQ的bin目录下
cd rocketmq-all-5.1.3-bin-release/bin/
#后台启动NameServer
zookeeper-server-start.sh
#查看NameServer启动日志
tail -f ~/logs/rocketmqlogs/namesrv.log
#后台启动Broker
zookeeper-server-stop.sh
#查看Broker启动日志
tail -f ~/logs/rocketmqlogs/broker.log

4.内存不足启动报错

查看Broker启动日志,提示找不到文件,那就查看当前目录下的nohup.out。

RocketMQ快速入门_第4张图片

如果报错“There is insufficient memory for the Java Runtime Environment to continue.”,那就是RocketMQ启动内存不足导致的。

RocketMQ快速入门_第5张图片

解决方案

找到 runserver.shrunbroker.sh 以及 tools.sh 修改下 JAVA_OPT 的参数,都在JVM Configuration下面

JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn125m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

对应参数说明

JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512g" 
Xms 是指设定程序启动时占用内存大小。一般来讲,大点,程序会启动的快一点,但是也可能会导致机器暂时
间变慢。
Xmx 是指设定程序运行期间最大可占用的内存大小。如果程序运行需要占用更多的内存,超出了这个设置值, 
就会抛出OutOfMemory异常。
xmn 年轻代的heap大小,一般设置为Xmx的3、4分之一

保存修改后,重新启动namesrv和broker就可以了。

5.停止服务,建议先停止broker,然后停止namesrv

  • 停止Broker

    sh mqshutdown broker
  • 停止NameSrv

    sh mqshutdown namesrv

RocketMQ快速入门_第6张图片

简单示例

以下是一个简单的 Java 示例,演示如何使用 Apache RocketMQ 发送和接收消息。在运行这个示例之前,确保已经设置好 RocketMQ 环境并正确配置了生产者和消费者。

发送消息的生产者示例:

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.common.message.Message;
​
public class RocketMQProducer {
    public static void main(String[] args) throws Exception {
        // 创建生产者实例
        DefaultMQProducer producer = new DefaultMQProducer("producer_group");
        producer.setNamesrvAddr("localhost:9876");
​
        // 启动生产者
        producer.start();
​
        // 创建消息
        Message message = new Message("topic_name", "tag_name", "Hello, RocketMQ".getBytes());
​
        // 发送消息
        producer.send(message);
​
        // 关闭生产者
        producer.shutdown();
    }
}

接收消息的消费者示例:

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.message.MessageExt;
import java.util.List;
​
public class RocketMQConsumer {
    public static void main(String[] args) throws Exception {
        // 创建消费者实例
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer_group");
        consumer.setNamesrvAddr("localhost:9876");
​
        // 订阅消息主题和标签
        consumer.subscribe("topic_name", "*");
​
        // 注册消息监听器
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List messages, ConsumeConcurrentlyContext context) {
                for (MessageExt message : messages) {
                    System.out.println("Received message: " + new String(message.getBody()));
                }
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
​
        // 启动消费者
        consumer.start();
​
        System.out.println("Consumer started");
    }
}

在上述示例中,生产者向名为 "topic_name" 的主题发送消息,而消费者订阅相同的主题,并通过消息监听器接收并处理消息。

你可能感兴趣的:(消息队列,rocketmq)