初始 RocketMQ 消息队列

一、MQ是什么?

MQ:Message Queue 中文译为消息队列,是一种FIFO的数据结构。消息由生产者发布并加入到消息队列中,然后按照顺序由消息的消费者进行处理,QQ和微信就是典型的MQ。

二、MQ的作用

  1. 异步

    例如:快递员将快递直接上门给客户,效率比较低(一次只能服务一个客户)。引入菜鸟驿站后,快递员只需将快递放到菜鸟驿站后,就可以继续发送其它快递了。同时客户可以根据自己的时间去菜鸟驿站取快递。

    作用:异步可以提高系统的响应速度和吞吐量。

  2. 解耦合

    例如:菜鸟驿站将快递员和客户进行了分离(解耦),客户每次去取快递直接找到对应的菜鸟驿站即可,而无需具体的快递员。而快递员只需将对应的地区的快递存放到指定区域的菜鸟驿站,无需考虑客户的(是否在家等)情况。

    作用:

    • 通过服务之间的解耦,减少相互之间的依赖,从而提高系统整体的稳定性和扩展性。

    • 通过解耦可以实现数据的分发,一个消息可以有多个消费者进行接收,并且相互之间没有影响。

  3. 流量消峰

    例如:同时有多个客户对同一个快递员取快递,办不到,此时如果有菜鸟驿站,快递员先将快递已经存放到了对应的货架上,多个客户根据取货码找到对应的快递就可以快速的完成取件。

    作用:以稳定的系统资源应对突发的流量冲击。

    综上所述:菜鸟驿站就是我们所说的MQ,而快递就是各个消息,快递员是生产者,客户是消费者。

    MQ的缺点:

    1. 系统可用性降低:

      系统引用的依赖越多,系统的稳定性就越差,一旦MQ宕机,对业务产生影响,这就需要考虑如何保证MQ的高可用性。

    2. 系统复杂度提高

      如何保证消息不丢失,消息被复用、消息的顺序性等问题?

    3. 消息一致性问题

      A系统处理业务发送消息给B和C、B处理成功、C如果处理失败,就需要考虑消息处理的一致性问题?

三、常用的消息队列:

常用的消息队列有kafka、RabbitMQ、RocketMQ。

区别kafkaRabbitMQRocketMQ
优点吞吐量非常大、性能好、集群高可用可靠性高、功能全高吞吐、高性能、高可用、功能全
缺点功能单一,会丢失数据吞吐量低、消息积累影响性能开源弱、客户端只支持java
适用场景日志分析、数据采集小规模全场景

四、RocketMQ的安装和配置:

官网: RocketMQ · 官方网站 | RocketMQ

 下载后,推荐解压到英文且不包含空格的目录下。

   进入/home/rocketmq-5.0.0/bin, 修改runserver.sh

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

修改runbroker.sh JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m"

 配置环境变量:

 执行/bin目录下的mqnamesrv 文件(双击该文件),如图所示 :

 启动后,不要关闭。再打开一个cmd窗口,执行如下命令。

mqbroker.cmd -n localhost:9876 autoCreateTopicEnable=true

 

五、SpringBoot的整合

创建spring boot项目,并导入以下依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.tonysong</groupId>
    <artifactId>rocketmq-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>rocketmq-demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.22</version>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

 application.yaml文件:

rocketmq:
   name-server: 192.168.31.55:9876
   producer:
     group: my_Group
     send-message-timeout: 3000
     retry-times-when-send-async-failed: 3
     retry-times-when-send-failed: 3

控制器:

@RestController
public class RocketController {

   
    @Resource
    private RocketMQTemplate rocketMQTemplate;

    @GetMapping("/user")
    public String hello(){
        User user= new User();
        user.setAge(23);
        user.setName("张三");
        this.rocketMQTemplate.convertAndSend("first-topic",user);
        return JSON.toJSONString(user);
    }

  
}

浏览器测试:localhost:8080/user

创建生产者:

@Slf4j
@Component
public class ProduceService {

    @Value("${rocketmq.producer.send-message-timeout}")
    private Integer timeout;

    private static final String topic = "RLT_TEST_TOPIC";

    @Resource
    private RocketMQTemplate rocketMQTemplate;

    public void send(User user){
         this.rocketMQTemplate.convertAndSend(topic+":tag1",user);
    }
}

创建消费者:

@Slf4j
@Component
public class CustomerService {

    @Service
    @RocketMQMessageListener(consumerGroup ="Group_One" ,topic = "RLT_TEST_TOPIC", selectorExpression = "tag1")
    public class CustomerSent implements RocketMQListener<User> {

        @Override
        public void onMessage(User message) {
            log.info("监听到消息:user{}", JSON.toJSONString(message));
        }
    }
}

控制器:

 @Resource
    private ProduceService produceService;
    @Resource
    private RocketMQTemplate rocketMQTemplate;

  
    @GetMapping("/hello")
    public String test1(){
        User user= new User();
        user.setAge(23);
        user.setName("八戒");
        this.produceService.send(user);
        return JSON.toJSONString(user);
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值