パワーノード RocketMQ ノート 第 3 章 RocketMQ と SpringBoot の統合

22. Rocketmq は SpringBoot を統合します

22.1 rocketmq-Producer (メッセージプロデューサー) のビルド


22.1.1 プロジェクトの作成、pom.xml の完成

 _<?_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"](https://maven.apache.org/xsd/maven-4.0.0.xsd%22)
>    
<modelVersion>4.0.0</modelVersion>    
<parent>        
<groupId>org.springframework.boot</groupId>        
<artifactId>spring-boot-starter-parent</artifactId>        
<version>2.6.3</version>        
<relativePath/> 
_<!-- lookup parent from repository -->    _
</parent>    
<groupId>com.powernode</groupId>    
<artifactId>01-rocketmq-producer</artifactId>    
<version>0.0.1-SNAPSHOT</version>    
<name>rocketmq-producer</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>**        **
**_<!-- rocketmq的依赖 -->        _**
**<dependency>            **
**<groupId>org.apache.rocketmq</groupId>            **
**<artifactId>rocketmq-spring-boot-starter</artifactId>            <version>2.0.2</version>        **
**</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> 

22.1.2 構成ファイル application.yml を変更する

spring:
    application:
        name: rocketmq-producer
rocketmq:
    name-server: 127.0.0.1:9876     # rocketMq的nameServer地址
    producer:
        group: powernode-group        # 生产者组别
        send-message-timeout: 3000  # 消息发送的超时时间
        retry-times-when-send-async-failed: 2  # 异步消息发送失败重试次数
        max-message-size: 4194304       # 消息的最大长度

22.1.3 テストクラスでメッセージの送信をテストします

単純な文字列メッセージを powernode トピックに送信します

 /** * 注入rocketMQTemplate,我们使用它来操作mq */
@Autowiredprivate RocketMQTemplate rocketMQTemplate; 
/** * 测试发送简单的消息 * * @throws Exception */
@Testpublic void testSimpleMsg() throws Exception {
    
        
// 往powernode的主题里面发送一个简单的字符串消息    
SendResult sendResult = rocketMQTemplate.syncSend("powernode", "我是一个简单的消息");   
 // 拿到消息的发送状态    
System._out_.println(sendResult.getSendStatus());    
// 拿到消息的id    
System._out_.println(sendResult.getMsgId());
}

実行後にコンソールを確認してください

22.1.4 rocketMq コンソールの表示


メッセージの詳細を表示する

22.2 rocketmq-consumer (メッセージコンシューマー) のビルド


22.2.1 プロジェクトの作成、pom.xml の完成

_<?_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"](https://maven.apache.org/xsd/maven-4.0.0.xsd%22)
>    
<modelVersion>4.0.0</modelVersion>    
<parent>        
<groupId>org.springframework.boot</groupId>        
<artifactId>spring-boot-starter-parent</artifactId>       ** **
**<version>2.6.3</version>**        
<relativePath/> 
_<!-- lookup parent from repository -->    _
</parent>    
<groupId>com.powernode</groupId>    
<artifactId>02-rocketmq-consumer</artifactId>    
<version>0.0.1-SNAPSHOT</version>    
<name>rocketmq-consumer</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>   **     **
**_<!-- rocketmq的依赖 -->       _**
**_ _<dependency>            **
**<groupId>org.apache.rocketmq</groupId>            **
**<artifactId>rocketmq-spring-boot-starter</artifactId>**
**            <version>2.0.2</version>        **
**</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>  

22.2.2 設定ファイル application.yml を変更する

| 春:
アプリケーション:
名前: rocketmq-consumerrocketmq:
名前-サーバー: 127.0.0.1:9876
| — |

22.2.3 リスニングクラス SimpleMsgListener の追加

メッセージを消費するために、コンシューマーはリスナーを追加します

package com.powernode.listener; 
import org.apache.rocketmq.spring.annotation.MessageModel;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component; 
_/** * 创建一个简单消息的监听 * _
_1.类上添加注解@Component和@RocketMQMessageListener *      
@RocketMQMessageListener(topic = "powernode", consumerGroup = "powernode-group") *      
topic指定消费的主题,consumerGroup指定消费组,一个主题可以有多个消费者组,一个消息可以被多个不同的组的消费者都消费 * _
_2.实现RocketMQListener接口,**注意泛型的使用,可以为具体的类型,如果想拿到消息 * 的其他参数可以写成MessageExt** */_
@Component@RocketMQMessageListener(topic = "powernode", consumerGroup = "powernode-group",messageModel = MessageModel._CLUSTERING_)public class SimpleMsgListener implements RocketMQListener<String> {
    
         
_/**     * 消费消息的方法     *     * @param message     */    _
@Override    public void onMessage(String message) {
    
            
System._out_.println(message);   
 }
 }  

22.2.4 rocketmq-consumer の開始

コンソールをチェックして、メッセージを聞いていることを確認します。

23. RocketMQ はオブジェクト メッセージとコレクション メッセージを送信します

上記のプロジェクトでやってみましょう

23.1 オブジェクトメッセージの送信

主なことは、リッスンするときにオブジェクトの型をジェネリックに書き込むことです。

23.1.1 rocketmq-Producer を変更して Order クラスを追加する

package com.powernode.domain; 
import lombok.AllArgsConstructor;import lombok.Data;
import lombok.NoArgsConstructor; import java.util.Date; 
/** * 订单对象 */
@Data@AllArgsConstructor@NoArgsConstructorpublic class Order {
    
        
/**     * 订单号     */    
private String orderId;    
 /**     * 订单名称     */    
private String orderName;     
/**     * 订单价格     */    
private Double price;     
/**     * 订单号创建时间     */    
private Date createTime;     
/**     * 订单描述     */    
private String desc;
 } 

23.1.2 rocketmq-Producer を変更して単体テストを追加する

 _/** * 测试发送对象消息 * * @throws Exception */_
@Testpublic void testObjectMsg() throws Exception {
    
        
Order order = new Order();    
order.setOrderId(UUID._randomUUID_().toString());    
order.setOrderName("我的订单");   
 order.setPrice(998D);    
order.setCreateTime(new Date());    
order.setDesc("加急配送");    
_// 往powernode-obj主题发送一个订单对象    _
rocketMQTemplate.syncSend("powernode-obj", order);
}  

23.1.3 このメッセージを送信する

23.1.4 rocketmq-consumer を変更し、Order クラスを追加します (コピーします)。

23.1.5 rocketmq-consumer を変更して ObjMsgListener を追加する

package com.powernode.listener; import com.powernode.domain.Order;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component; 
/** * 创建一个对象消息的监听 
* 1.类上添加注解@Component和@RocketMQMessageListener 
* * 2.实现RocketMQListener接口,注意泛型的使用 */
@Component@RocketMQMessageListener(topic = "powernode-obj", consumerGroup = "powernode-obj-group")
public class ObjMsgListener implements RocketMQListener<**Order**> {
    
         
/**     * 消费消息的方法     *     * @param message     */    
@Override    public void onMessage(**Order **message) {
    
            
System._out_.println(message);   
 }} 

23.1.6 rocketmq-consumer の再起動後にコンソールを確認する

オブジェクトメッセージがリッスンされました

23.2 コレクションメッセージの送信

オブジェクトメッセージと同様に、Orders のコレクションを作成して送信しますが、リスナーはジェネリック型の型を Object に変更することに注意する必要があるため、ここでは繰り返しません。

24. RocketMQ は SpringBoot を統合して、さまざまなメッセージ モードを送信します

24.1 同期メッセージの送信

メッセージがコンシューマーからブローカーに送信された後、信頼性の高い確認が得られることが理解されており、
この信頼性の高い同期送信方法は、重要なメッセージの通知、SMS 通知などに広く使用されています。
上記のクイック スタートで示したメッセージは同期メッセージです。つまり、
rocketMQTemplate.syncSend()
rocketMQTemplate.send()
rocketMQTemplate.convertAndSend()
の 3 つのメッセージ送信メソッドで、最下層は syncSend を呼び出します。送信されたメッセージは同期メッセージです

24.2 非同期メッセージの送信

rocketMQTemplate.asyncSend()

24.2.1 rocketmq-Producer を変更して単体テストを追加する

/** * 测试异步发送消息 * * @throws Exception */
@Testpublic void testAsyncSend() throws Exception {
    
        
// 发送异步消息,发送完以后会有一个异步通知    
rocketMQTemplate.**asyncSend**("powernode", "发送一个异步消息", new SendCallback() {
    
     
       /**         * 成功的回调         * @param sendResult         */        
@Override        public void onSuccess(SendResult sendResult) {
    
                
System._out_.println("发送成功");       
}        
 /**         * 失败的回调         * @param throwable         */        
@Override        public void onException(Throwable throwable) {
    
                
System._out_.println("发送失败");       
 }    });   
 // 测试一下异步的效果   
 System._out_.println("谁先执行");    
// 挂起jvm 不让方法结束    
System._in_.read();
} 

24.2.2 実行してコンソールの効果を表示する

最初に送った人が先頭に印刷します

24.3 一方向メッセージの送信

この方式は主に送信結果を気にしないシナリオで使用され、スループットは高いですが、ログ情報の送信などメッセージロスのリスクがあります。

24.3.1 rocketmq-Producer を変更して単体テストを追加する

/** * 测试单向消息 * * @throws Exception */
@Testpublic void testOnWay() throws Exception {
    
        
// 发送单向消息,没有返回值和结果    rocketMQTemplate.**sendOneWay**("powernode", "这是一个单向消息");
} 

24.4 遅延メッセージの送信

24.4.1 rocketmq-Producer を変更して単体テストを追加する

 /** * 测试延迟消息 * * @throws Exception */
@Testpublic void testDelay() throws Exception {
    
        
// 构建消息对象    
Message<String> message = MessageBuilder._withPayload_("我是一个延迟消息").build();   
 // 发送一个延时消息,延迟等级为4级,也就是30s后被监听消费    
SendResult sendResult = rocketMQTemplate.syncSend("powernode", message, 2000, 4); 
   System._out_.println(sendResult.getSendStatus());
} 

24.4.2 実行後、コンシューマ側を確認すると、30 秒後に消費されます

RocketMQ は常に遅延をサポートしていないことに注意してください。サポートされるのは
次の固定遅延レベルのみです。レベル 1 は 1 秒に対応し、以下同様、最大 2 時間の遅延がサポートされます。private
String messageDelayLevel = “1s 5s 10s 30s 1メートル 2メートル 3メートル 4メートル 5メートル 6メートル 7メートル 8メートル 9メートル 10メートル 20メートル 30メートル 1時間 2時間」;

24.5 連続メッセージの送信

24.5.1 注文テーブルを変更して注文フィールドを追加する

/** * 注文処理シーケンス*/private Integer seq;

24.5.2 rocketmq-Producer を変更して単体テストを追加する

/** * 测试顺序消费 * mq会根据hash的值来存放到一个队列里面去 * * @throws Exception */
@Testpublic void testOrderly() throws Exception {
    
        
List<Order> orders = Arrays._asList_(            
new Order(UUID._randomUUID_().toString().substring(0, 5), "张三的下订单", null, null, null, 1),            
new Order(UUID._randomUUID_().toString().substring(0, 5), "张三的发短信", null, null, null, 1),            
new Order(UUID._randomUUID_().toString().substring(0, 5), "张三的物流", null, null, null, 1),            
new Order(UUID._randomUUID_().toString().substring(0, 5), "张三的签收", null, null, null, 1),             
new Order(UUID._randomUUID_().toString().substring(0, 5), "李四的下订单", null, null, null, 2),            
new Order(UUID._randomUUID_().toString().substring(0, 5), "李四的发短信", null, null, null, 2),            
new Order(UUID._randomUUID_().toString().substring(0, 5), "李四的物流", null, null, null, 2),            
new Order(UUID._randomUUID_().toString().substring(0, 5), "李四的签收", null, null, null, 2)    );    
// 我们控制流程为 下订单->发短信->物流->签收  hash的值为seq,也就是说 seq相同的会放在同一个队列里面,顺序消费    
orders.forEach(order -> {
    
            
rocketMQTemplate.syncSendOrderly("powernode-obj", order, String._valueOf_(order.getSeq()));    
});
} 

24.5.3 メッセージの送信

24.5.4 rocketmq-consumer の ObjMsgListener の変更

package com.powernode.listener; import com.powernode.domain.Order;
import org.apache.rocketmq.spring.annotation.ConsumeMode;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component; 
/** * @Author 武汉动力节点 * 创建一个对象消息的监听 * 
1.类上添加注解@Component和@RocketMQMessageListener * 
2.实现RocketMQListener接口,注意泛型的使用 * consumeMode 指定消费类型 *      CONCURRENTLY 并发消费 *      ORDERLY 顺序消费 messages orderly. one queue, one thread */
@Component@RocketMQMessageListener(topic = "powernode-obj",        
consumerGroup = "powernode-obj-group",        
**consumeMode = ConsumeMode._ORDERLY_**)public class ObjMsgListener implements RocketMQListener<Order> {
    
         
/**     * 消费消息的方法     *     * @param message     */    
@Override    public void onMessage(Order message) {
    
            
System._out_.println(message);    
}} 

24.5.5 rocketmq-consumer の再起動

コンソールを見ると、メッセージは入力した順序で消費されます。

24.6 トランザクションメッセージの送信

24.6.1 rocketmq-Producer を変更して単体テストを追加する

/** * 测试事务消息 * 默认是sync(同步的) * 事务消息会有确认和回查机制 * 事务消息都会走到同一个监听回调里面,所以我们需要使用tag或者key来区分过滤 * * @throws Exception */
@Testpublic void testTrans() throws Exception {
    
       
 // 构建消息体    
Message<String> message = MessageBuilder._withPayload_("这是一个事务消息").build();    
// 发送事务消息(同步的) 最后一个参数才是消息主题    
TransactionSendResult transaction = 
rocketMQTemplate.sendMessageInTransaction("powernode", message, "消息的参数");    
// 拿到本地事务状态    
System._out_.println(transaction.getLocalTransactionState());    
// 挂起jvm,因为事务的回查需要一些时间    
System._in_.read();
} 

24.6.2 rocketmq-Producer を変更してローカル トランザクション メッセージ モニター (ハーフ メッセージ) を追加する

 _/** * 事务消息的监听与回查 * 类上添加注解@RocketMQTransactionListener 表示这个类是本地事务消息的监听类 * 实现RocketMQLocalTransactionListener接口 * 两个方法为执行本地事务,与回查本地事务 */_
@Component@RocketMQTransactionListener(corePoolSize = 4,maximumPoolSize = 8)
public class TmMsgListener implements RocketMQLocalTransactionListener {
    
          
_/**     _
_* 执行本地事务,这里可以执行一些业务     _
_* 比如操作数据库,操作成功就return RocketMQLocalTransactionState.COMMIT;     _
_* 可以使用try catch来控制成功或者失败;     _
_* @param msg     * @param arg     * @return     */    _
@Override    public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) {
    
            
_// 拿到消息参数        _
System._out_.println(arg);        
_// 拿到消息头        _
System._out_.println(msg.getHeaders());        
_// 返回状态COMMIT,UNKNOWN        _
return RocketMQLocalTransactionState._UNKNOWN_;    
}     
_/**     _
_* 回查本地事务,只有上面的执行方法返回UNKNOWN时,才执行下面的方法 默认是1min回查     _
_* 此方法为回查方法,执行需要等待一会     _
_* xxx.isSuccess()  这里可以执行一些检查的方法     _
_* 如果返回COMMIT,那么本地事务就算是提交成功了,消息就会被消费者看到     *_
_     * @param msg     * @return     */    _
@Override    public RocketMQLocalTransactionState
 checkLocalTransaction(Message msg) {
    
            
System._out_.println(msg);        
return RocketMQLocalTransactionState._COMMIT_;    
}} 

24.6.3 送信トランザクションのテスト、ブレークポイントの開始の提案

  1. メッセージはまずトランザクション監視クラスの実行メソッドに到着します。
  2. 戻りステータスが COMMIT の場合、消費者は直接監視できます。
  3. 戻りステータスが ROLLBACK の場合、メッセージの送信に失敗し、直接ロールバックされます。
  4. 戻りステータスが UNKNOW の場合は、しばらくしてからクエリメソッドに戻ります。
  5. チェックバック メソッドの戻りステータスが UNKNOW または ROLLBACK の場合、メッセージの送信は失敗し、直接ロールバックされます。
  6. チェックバック メソッドの戻りステータスが COMMIT の場合、コンシューマーは直接監視できます。

25. RocketMQ は SpringBoot のメッセージ フィルタリングを統合します

25.1 タグフィルタリング (多くの場合、コンシューマ側でフィルタリング)

ソース コードのコメントから、タグが件名の後に使用されていることがわかります: to carry、コメントありがとうございます。

ソース コードを見て、
org.apache.rocketmq.spring の getAndWrapMessage メソッドの具体的な詳細を見てみましょう。 .support.RocketMQUtil、キーがメッセージ ヘッダーに含まれていることもわかっています

25.1.1 rocketmq-Producer を変更して単体テストを追加する

/** * タグ付きメッセージを送信します * * @throws Exception */
@Testpublic void testTagMsg() throws Exception { // Java データを含むタグを送信しますrocketMQTemplate.syncSend("powernode-tag:java", "私はタグ付きメッセージです"); }


25.1.2 メッセージの送信

25.1.3 rocketmq-consumer を変更して TagMsgListener を追加する

package com.powernode.listener; 
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.annotation.SelectorType;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component; 
/** * @Author 武汉动力节点 * 创建一个简单的标签消息的监听
 * 1.类上添加注解@Component和@RocketMQMessageListener *      selectorType = SelectorType.TAG,  指定使用tag过滤。(也可以使用sql92 需要在配置文件broker.conf中开启enbalePropertyFilter=true) *      selectorExpression = "java"     表达式,默认是*,支持"tag1 &#124;&#124; tag2 &#124;&#124; tag3"
 * 2.实现RocketMQListener接口,注意泛型的使用 */
@Component@RocketMQMessageListener(topic = "powernode-tag",        
consumerGroup = "powernode-tag-group",        
selectorType = SelectorType._TAG_,        
selectorExpression = "java")
public class TagMsgListener implements RocketMQListener<String> {
    
        
 /**     * 消费消息的方法     *     
* @param message     */    
@Override    public void onMessage(String message) {
    
            
System._out_.println(message);    
}} 

25.1.4 rocketmq-consumer を再起動してコンソールを表示する

25.2 キーフィルタリング(トランザクション監視のクラスで区別可能)

25.2.1 rocketmq-Producer を変更して単体テストを追加する

/** * 发送一个带key的消息,我们使用事务消息 打断点查看消息头 * * @throws Exception */
@Testpublic void testKeyMsg() throws Exception {
    
        
// 发送一个key为spring的事务消息    
Message<String> message = MessageBuilder._withPayload_("我是一个带key的消息")            **.setHeader(RocketMQHeaders._KEYS_, "spring")**            
.build();    
rocketMQTemplate.sendMessageInTransaction("powernode", message, "我是一个带key的消息");
} 

25.2.2 このメッセージを送信するブレークポイント、トランザクション内のメッセージ ヘッダーを確認する


mq コンソールでも確認できます

26. RocketMQ は SpringBoot メッセージ消費の 2 つのモードを統合します

Rocketmq メッセージ消費には、ロード バランシング モードとブロードキャスト モードの2 つのモードがあります。
ロード バランシング モードは、複数のコンシューマが同じトピック内のメッセージを交互に消費することを意味します。
ブロードキャスト モードは、各コンシューマがサブスクライブされたトピックのメッセージを 1 回消費することを意味します。

26.1 別のコンシューマ rocketmq-consumer-b をビルドします。依存関係と設定ファイルは rocketmq-consumer と一致しています。占有を避けるためにポートを変更することを忘れないでください。

26.2 rocketmq-consumer-b リスナーを追加する

 package com.powernode.listener; 
import org.apache.rocketmq.spring.annotation.MessageModel;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component; 
/** * messageModel  指定消息消费的模式 *      CLUSTERING 为负载均衡模式 *      BROADCASTING 为广播模式 */
@Component@RocketMQMessageListener(topic = "powernode",        
consumerGroup = "powernode-group",**        **
**messageModel = MessageModel._CLUSTERING_**)
public class ConsumerBListener 
implements RocketMQListener<String> {
    
         
@Override    public void onMessage(String message) {
    
            
System._out_.println(message);    
}} 

26.3 rocketmq-consumer の SimpleMsgListener を変更する

 _/** * 创建一个简单消息的监听 * 1.类上添加注解@Component和@RocketMQMessageListener * * @RocketMQMessageListener(topic = "powernode", consumerGroup = "powernode-group") * topic指定消费的主题,consumerGroup指定消费组,一个主题可以有多个消费者组,一个消息可以被多个不同的组的消费者都消费 * 2.实现RocketMQListener接口,注意泛型的使用 */_
@Component@RocketMQMessageListener(topic = "powernode",         
consumerGroup = "powernode-group",       ** **
**messageModel = MessageModel._CLUSTERING_**)
public class SimpleMsgListener
implements RocketMQListener<String> {
    
         
@Override    public void onMessage(String message) {
    
            
System._out_.println(new Date());        
System._out_.println(message);   
 }} 

26.4 2 つのコンシューマの起動

26.5 単体テストをプロデューサーに追加して実行する

| /** * テスト メッセージ消費モード * * @throws Exception */
@Testpublic void testMsgModel() throws Exception { for (int i = 0; i < 10; i++) { rocketMQTemplate.syncSend("powernode", "I はメッセージ" + i);

}}

26.6 2 つのコンシューマのコンソールを表示すると、負荷分散モードであることがわかります。


26.7 2 つのコンシューマのモードを BROADCASTING に変更する

テストを再開すると、結果はブロードキャスト モードになり、各コンシューマーがこれらのメッセージを消費します。

一般に、ポリモーフィック マシン コンシューマーはプロジェクトにデプロイされます 2-3 ビジネスに応じて、構成する特定のモードを選択できます

消費ポイントをリセットし、グループの消費ノードをこの時点から消費する前の特定の時点に設定します


蓄積をスキップ 蓄積をスキップするグループを選択します。その後、このグループ内のすべては消費されなくなります

27. メッセージの蓄積の問題を解決するにはどうすればよいですか?

一般に、単一のキュー メッセージの差が 10w 以上の場合、蓄積の問題があると考えられています。

27.1 どのような状況で蓄積が発生するか

  1. プロダクションが速すぎます。
    プロデューサーはビジネス フローを制限して
    コンシューマの数を増やすことができますが、コンシューマの数 <= キューの数であるため、コンシューマ スレッドの最大数を適切に設定します (IO(2n)/ による)。 CPU(n+1)) を使用して
    キューの量を動的に拡張し、コンシューマーの数を増やします。
  2. 消費者向けの消費に問題がある
    消費者向けプログラムの問題のトラブルシューティング

28. メッセージが失われないようにするにはどうすればよいですか?

  1. プロデューサは同期送信モードを使用し、 mq 戻り確認を受信した後、途中で
    msgId status(0) 時刻を自身のデータベースに書き込みます。
  2. コンシューマが消費後にデータを変更した後のメッセージのステータス = 1
  3. ステータス = 0 で時間 < day-2 の場合、2 日ごとにデータをクエリする時間指定タスクを作成します。
  4. mq のブラッシングメカニズムを同期ブラッシングに設定します。
  5. クラスター モードを使用し、アクティブ モードとスタンバイ モードを使用し、さまざまなハードウェアにメッセージを保持します。
  6. MQ トレース メカニズムとメッセージ追跡メカニズムを有効にすることができます

1. Broker.conf でメッセージ追跡を有効にします、
traceTopicEnable=true 2.
ブローカーを再起動します。 3.
プロデューサ設定ファイル
でメッセージ追跡を有効にします。enable-msg-
trace: true 4. コンシューマのメッセージ追跡機能を有効にします。単一のコンシューマに対して、
enableMsgTrace = trueを有効にします

rocketmq パネルでメッセージ トレースを表示できます。
デフォルトでは、メッセージ トレースのデータはトピック RMQ_SYS_TRACE_TOPIC に保存されます。

29. セキュリティ

  1. ACL の制御をオンにし、broker.conf で aclEnable=true をオンにします。
  2. アカウントのパスワードを設定し、plain_acl.yml を変更します。
  3. コントロール パネルの構成ファイルを変更し、52/53 行目を解放し、49 行目を true に変更して、サーバーの jar パッケージ レベルのディレクトリにアップロードします。

おすすめ

転載: blog.csdn.net/f5465245/article/details/130641058