首先配置pom.xml文件
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<scope>annotationProcessorscope>
dependency>
<dependency>
<groupId>org.apache.rocketmqgroupId>
<artifactId>rocketmq-spring-boot-starterartifactId>
<version>2.2.3version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<scope>testscope>
dependency>
其次在配置application.yml文件
spring:
application:
name: RocketMq
rocketmq:
name-server: 192.168.66.100:9876(自己的地址监听9876端口)
producer:
group: my-group
编写测试类
生产者
package com.jjy.rocketmq;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
//@RunWith(SpringRunner.class)
//@SpringBootTest(classes = {RocketMqApplication.class})
@SpringBootTest
class RocketMqApplicationTests {
@Autowired
private RocketMQTemplate rocketMQTemplate;
@Test
void testSendMessage() {
//向broker发送消息
//第一个参数是主题(当时自己创建的主题)
//第二个参数是消息内容
rocketMQTemplate.convertAndSend("topicWarning","hello,RocketMQ");
}
}
消费者(新建一个springboot项目)
pom.xml文件同producer工程
application.yml配置
spring:
application:
name: RocketMQConsumer(自己的项目名字)
rocketmq:
name-server: 192.168.66.100:9876
消息监听器
package com.jjy.rocketmqconumers.consumer;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;
@Slf4j
@Component
@RocketMQMessageListener(topic="topicWarning",consumerGroup="myconsumer")
//consumerGroup(里面的参数随便写就行自己编个名字)
public class Consumer implements RocketMQListener<String> {
@Override
public void onMessage(String message) {
//使用日志的形式写出来 也开始使用控制台
log.info("Received messsge:" + message);
//使用控制台
System.out.println(message);
}
}
RocketMQ中的负载均衡都在Client端完成,具体来说的话,主要可以分为Producer端发送消息时候的负载均衡和Consumer端订阅消息的负载均衡
Producer的负载均衡
如图所示,5 个队列可以部署在一台机器上,也可以分别部署在 5 台不同的机器上,发送消息通过轮询队列的方式 发送,x每个队列接收平均的消息量。通过增加机器,可以水平扩展队列容量。 另外也可以自定义方式选择发往哪个队列。
Consumer的负载均衡
如图所示,如果有 5 个队列,2 个 consumer,那么第一个Consumer 消费 3 个队列,第二consumer 消费 2 个队列。 这样即可达到平均消费的目的,可以水平扩展 Consumer 来提高消费能力。但是 Consumer 数量要小于等于队列数 量,如果 Consumer超过队列数量,那么多余的Consumer 将不能消费消息 。
Apache RocketMQ在4.3.0版中已经支持分布式事务消息,这里RocketMQ采用了2PC的思想来实现了提交事务消息,同时增加一个补偿逻辑来处理二阶段超时或者失败的消息,如下图所示。
事务消息发送步骤如下:
生产者将半事务消息发送至消息队列RocketMQ服务端。
消息队列RocketMQ服务端将消息持久化成功之后,向生产者返回Ack确认消息已经发送成功,此时消息为半事务消息。
生产者开始执行本地事务逻辑。
生产者根据本地事务执行结果向服务端提交二次确认结果(Commit或是Rollback),服务端收到确认结果后处理逻辑如下:
事务消息回查步骤如下:
消息有序指的是按照消息的发送顺序来消费(FIFO)。RocketMQ可以保证消息有序,消息有序分为部分有序和全局有序。全局有序是指某个Topic下的所有消息都要保证顺序;部分顺序消息只要保证每一组消息被顺序消费即可。
如果要实现全局顺序消息,那么只能使用一个队列,一个生产者,这会严重影响性能。
顺序消费的原理解析,在默认的情况下消息发送会采取轮询方式把消息发送到不同的分区队列;而消费消息的时候从多个queue上拉取消息,这种情况发送和消费是不能保证顺序。但是如果控制发送的顺序消息只依次发送到同一个queue中,消费的时候只从这个queue上依次拉取,则就保证了顺序。当发送和消费参与的queue
只有一个,则是全局有序;如果多个queue参与,则为分区有序,即相对每queue,消息都是有序的。