草庐IT

SpringCloud Alibaba(五) - RocketMQ

xiaoqigui 2023-04-18 原文

1、 RocketMQ安装测试

1.1 下载解压

下载地址:https://rocketmq.apache.org/release-notes/

rocketmq-all-5.0.0-bin-release.zip

下载后上传到服务器;

解压命令# unzip rocketmq-all-5.0.0-bin-release.zip

1.2 启动 测试

RocketMQ默认配置是比较好的,这样可以直接应用于生产环境,所以如果机器内存较小,启动会因为内存不足失败,为了避免后面启动失败,选择先修改其内存大小,一般阿里云服务器是满足不了默认内存。

手动调整JVM的配置,单位从g改为m

1.2.1 启动nameserver

1.2.1.1 修改runbroker.sh和runserver.sh

1.2.1.2 runbroker.sh
 -server -Xms256m -Xmx256m -Xmn128m

1.2.1.3 runserver.sh
-server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m

1.2.1.4 启动nameserver
解压目录执行# nohup ./bin/mqnamesrv -n 1.117.75.57(自己的ip):9876 &

1.2.2 启动broker

1.2.2.1 修改broker.conf

添加namesrvAddr 和 brokerIP1:

1.2.2.3 启动 borker
解压目录执行# nohup ./bin/mqbroker -n 1.117.75.57:9876 -c ./conf/broker.conf &
1.2.2.4 查看启动情况
jps

1.2.3 测试

由于服务器内存可能比较小,建议先关闭其他应用,比如rabbitmq,docker的容器等;

还需要开启几个端口:9876,10909,10910,10911;

1.2.3.1 生产者
导出环境变量# export NAMESRV_ADDR=1.117.75.57:9876
发送消息# bin/tools.sh org.apache.rocketmq.example.quickstart.Producer

1.2.3.2 消费者
导出环境变量# export NAMESRV_ADDR=1.117.75.57:9876
消费消息# bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer

1.2.4 关闭命令

关闭nameserver# bin/mqshutdown namesrv

关闭broker# bin/mqshutdown broker

1.2.5 RocketMQ控制台

1.2.5.1 下载,解压,修改配置信息

1.2.5.2 访问控制台

localhost:9696

2、RocketMQ框架原理

2.1 框架

2.2 概念

整体可以分成4个角色,分别是:NameServer,Broker,Producer,Consumer:

  • Broker(邮递员):Broker是RocketMQ的核心,负责消息的接收,存储,投递等功能;
  • NameServer(邮局):消息队列的协调者,Broker向它注册路由信息,同时Producer和Consumer向其获取路由信息Producer(寄件人)消息的生产者,需要从NameServer获取Broker信息,然后与Broker建立连接,向Broker发送消息;
  • Consumer(收件人) :消息的消费者,需要从NameServer获取Broker信息,然后与Broker建立连接,从Broker获取消息;
  • Topic(地区):用来区分不同类型的消息,发送和接收消息前都需要先创建Topic,针对Topic来发送和接收消息Message Queue(邮件)为了提高性能和吞吐量,引入了Message Queue,一个Topic可以设置一个或多个Message Queue,这样消息就可以并行往各个Message Queue发送消息,消费者也可以并行的从多个Message Queue读取消息;
  • Message:Message 是消息的载体;
  • Producer Group:生产者组,简单来说就是多个发送同一类消息的生产者称之为一个生产者组。
  • Consumer Group:消费者组,消费同一类消息的多个 consumer 实例组成一个消费者组。

3、RocketMQ整合

3.1 rocketmq模块 发送消息

3.2.1.1 依赖
<!-- rocket -->
<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-spring-boot-starter</artifactId>
    <version>2.0.2</version>
</dependency>
3.2.1.2 配置
# rocketmq配置
rocketmq:
  #rocketMQ服务的地址
  name-server: 1.117.75.57:9876
  # 生产者组
  producer:
    group: kh96-sendsms-group
3.2.1.3 请求
@Autowired(required = false)
private RocketMQTemplate rocketMQTemplate;

/**
* @param : [phoneNo]
* @return : java.lang.String
* @author : huayu
* @date : 30/11/2022
* @description : 测试发送消息到用户中心,用户中心给手机号发信息
*/
@RequestMapping("/testRocketMQSendMsg")
public String testRocketMQSendMsg(@RequestParam String phoneNo) {
    log.info("------ 使用RocketMQ,测试给手机:{},发送消息 -------", phoneNo);

    //使用RocketMQ发送消息
    rocketMQTemplate.convertAndSend("rocketmq-send-sms-kh96", phoneNo);

    return "send msg success";

}

3.2 user模块 消费消息

1.添加加rocketmq的依赖;

2.用户服务,监听发送短信的请求发送消息:

/**
 * Created On : 30/11/2022.
 * <p>
 * Author : huayu
 * <p>
 * Description: 用户服务,监听发送短信的请求发送消息
 */
@Slf4j
@Component
@RocketMQMessageListener(consumerGroup = "rocketmq-user-sms-group", //组 随便写
        topic = "rocketmq-send-sms-kh96" //消息队列,发送的时候指定的
)
public class SendSmsListener implements RocketMQListener<String> {

    @Override
    public void onMessage(String message) {
        log.info("*****  接收发送信息的请求,给手机:{},发送消息 ******", message);
    }

}

3.3 测试

3.3.1 发送请求

3.3.2 发送消息模块日志

3.3.3 接收消息模块日志

3.3.4 控制台查看消息详情

4、发送不同类型的消息

4.1 发送可靠同步消息

4.1.1 请求

/**
* @param : [phoneNo]
* @return : java.lang.String
* @author : huayu
* @date : 30/11/2022
* @description : 测试roketmq-发送可靠同步消息
*/
@RequestMapping("/testRocketMQSendMsgSync")
public String testRocketMQSendMsgSync(@RequestParam String syncMsg) {
    log.info("------ 使用RocketMQ,发送可靠同步消息{} -------", syncMsg);

    //使用RocketMQ发送消息,拿到同步结果
    SendResult sendResult = rocketMQTemplate.syncSend("rocketmq-sync-msg-kh96", syncMsg);

    log.info("------ 使用RocketMQ,发送可靠同步消息结果:{} -------", sendResult);

    return "send sync msg success";

}

4.1.2 发送请求

4.1.3 同步结果

4.2 发送可靠异步消息

4.2.1 请求

/**
 * @param : [phoneNo]
 * @return : java.lang.String
 * @author : huayu
 * @date : 30/11/2022
 * @description : 测试roketmq-发送可靠异步消息
 */
@RequestMapping("/testRocketMQSendMsgAsync")
public String testRocketMQSendMsgAsync(@RequestParam String asyncMsg) {
    log.info("------ 使用RocketMQ,发送可靠异步消息:{} -------", asyncMsg);

    //使用RocketMQ发送消息
    rocketMQTemplate.asyncSend("rocketmq-sync-msg-kh96",
            asyncMsg,
            new SendCallback() {
                @Override
                public void onSuccess(SendResult sendResult) {
                    log.info("------  可靠异步发送成功回调  ------");
                }

                @Override
                public void onException(Throwable throwable) {
                    log.info("------  可靠异步发送失败回调  ------");
                }
            });

    return "send async msg success";

}

4.2.2 发送请求

4.2.3 回调结果

4.3 发送单向消息,只发不收结果

4.3.1 请求

/**
 * @param : [phoneNo]
 * @return : java.lang.String
 * @author : huayu
 * @date : 30/11/2022
 * @description : 测试roketmq-发送单向消息,只发不收结果
 */
@RequestMapping("/testRocketMQSendMsgOneWay")
public String testRocketMQSendMsgOneWay(@RequestParam String oneWayMsg) {
    log.info("------ 使用RocketMQ,发送单向消息给:{} -------", oneWayMsg);

    //使用RocketMQ发送消息
    rocketMQTemplate.sendOneWay("rocketmq-oneWay-msg-kh96", oneWayMsg);

    return "send oneWay msg success";

}

4.3.2 发送请求

4.3.3 日志查看

4.4 发送顺序消息

4.4.1 请求

/**
 * @param : [phoneNo]
 * @return : java.lang.String
 * @author : huayu
 * @date : 30/11/2022
 * @description : 测试roketmq-发送顺序消息
 */
@RequestMapping("/testRocketMQSendMsgOrderly")
public String testRocketMQSendMsgOrderly(@RequestParam String orderlyMsgs) {
    log.info("------ 使用RocketMQ,发送顺序消息:{} -------", orderlyMsgs);

    //使用RocketMQ发送顺序消息,必须要提供一个唯一的标识di,比如用户编号等
    String userId = UUID.randomUUID().toString().replace("-", "");

    //发送多条顺序消息,模拟iang消息分割成多个符号发送
    Arrays.asList(orderlyMsgs.split("")).
            forEach(orderlyMsg -> rocketMQTemplate.syncSendOrderly("rocketmq-orderly-msg-kh96", orderlyMsg, userId));

    return "send orderly msg success";

}

4.4.2 监听器

/**
 * Created On : 30/11/2022.
 * <p>
 * Author : huayu
 * <p>
 * Description: RocketMQ 监听顺序消息
 */
@Slf4j
@Component
@RocketMQMessageListener(consumerGroup = "rocketmq-orderly-sms-group",
        topic = "rocketmq-orderly-msg-kh96",
        consumeMode = ConsumeMode.ORDERLY)
public class RocketMQOrderlyMsgListener implements RocketMQListener<String> {

    @Override
    public void onMessage(String orderlyMsg) {
        log.info("------接收顺序消息 :{} ------", orderlyMsg);
    }


}

4.2.3 发送请求

4.2.4 消费消息

4.5 发送事务消息(重点)

4.5.1 发送事务消息流程

4.5.1.1 流程图

4.5.1.2 流程解析
  • 正常事务发送与提交阶段
  1. 生产者发送一个半消息给broker(半消息是指的暂时不能消费的消息);
  2. 服务端响应;
  3. 开始执行本地事务;
  4. 根据本地事务的执行情况执行Commit或者Rollback
  • 事务信息的补偿流程
  1. 如果broker长时间没有收到本地事务的执行状态,会向生产者发起一个确认会查的操作请求;
  2. 生产者收到确认会查请求后,检查本地事务的执行状态;
  3. 根据检查后的结果执行Commit或者Rollback操作 补偿阶段主要是用于解决生产者在发送Commit或者Rollbacke操作时发生超时或失败的情况;

4.5.2 RocketMQ事务流程关键

  • 事务消息在一阶段对用户不可见、

    ​ 事务消息相对普通消息最大的特点就是一阶段发送的消息对用户是不可见的,也就是说消费者不能直接消费.这里RocketMQ实现方法是原消息的主题与消息消费队列,然后把主题改成RMQ_SYS_TRANS_HALF_TOPIC.这样由于消费者没有订阅这个主题,所以不会消费;

  • 如何处理第二阶段的发送消息?

    ​ 在本地事务执行完成后回向Broker发送Commit或者Rollback操作,此时如果在发送消息的时候生产者出故障了,要保证这条消息最终被消费,broker就会向服务端发送回查请求,确认本地事务的执行状态.当然RocketMQ并不会无休止的发送事务状态回查请求,默认是15次,如果15次回查还是无法得知事务的状态,RocketMQ默认回滚消息(broker就会将这条半消息删除);

4.5.3 RocketMQ事务消息原理

  • 设计思想

    ​ 在RocketMQ事务消息的主要流程中,一阶段的消息如何对用户不可见。其中,事务消息相对普通消息最大的特点就是一阶段发送的消息对用户是不可见的。那么,如何做到写入消息但是对用户不可见呢?RocketMQ事务消息的做法是:如果消息是half消息,将备份原消息的主题与消息消费队列,然后改变主题为RMQ_SYS_TRANS_HALF_TOPIC。由于消费组未订阅该主题,故消费端无法消费half类型的消息。

  • 如何实现事务回查?

    ​ Broker会启动一个消息回查的定时任务,定时从事务消息queue中读取所有待反查的消息。针对每个需要反查的半消息,Broker会给对应的Producer发一个要求执行事务状态反查的RPC请求。然后根据RPC返回响应中的反查结果,来决定这个半消息是需要提交还是回滚,或者后续继续来反查。最后,提交或者回滚事务,将半消息标记为已处理状态【将消息存储在主题为:RMQ_SYS_TRANS_OP_HALF_TOPIC的主题中,代表这些消息已经被处理(提交或回滚)】。 如果是提交事务,就把半消息从半消息队列中复制到该消息真正的topic和queue中; 如果是回滚事务,则什么都不做。

参考博客1:https://blog.csdn.net/Weixiaohuai/article/details/123733518

参考博客2:https://blog.csdn.net/qq_42877546/article/details/125404307

4.5.4 实现代码

4.5.4.1 业务层
4.5.4.1.1 接口
/**
 * Created On : 30/11/2022.
 * <p>
 * Author : huayu
 * <p>
 * Description: 事务消息的业务 接口
 */
public interface RocketMQTxService {

    /**
     * @param : [kgcMallOrder]
     * @return : void
     * @author : huayu
     * @date : 30/11/2022
     * @description : 发送生成订单的半事务消息
     */
    void sendCreateOrderHalfTx(KgcMallOrder kgcMallOrder);


    /**
     * @param : [txId, kgcMallOrder]
     * @return : void
     * @author : huayu
     * @date : 30/11/2022
     * @description : 执行本地生成订单的事务操作
     */
    void executeCreateOrderLocalTx(String txId, KgcMallOrder kgcMallOrder);

}
4.5.4.1.2 实现类
/**
 * Created On : 30/11/2022.
 * <p>
 * Author : huayu
 * <p>
 * Description: 事务消息的业务 处理类
 */
@Service
@Slf4j
public class RocketMQTxServiceImpl implements RocketMQTxService {

    @Autowired(required = false)
    private RocketMQTemplate rocketMQTemplate;

    @Autowired
    private KgcMallOrderRepository kgcMallOrderRepository;

    @Autowired
    private KgcMallTxlogrepisitory kgcMallTxlogrepisitory;

    @Override
    @Transactional

    public void sendCreateOrderHalfTx(KgcMallOrder kgcMallOrder) {

        log.info("###### 1. 开始发送生成订单的半事务消息 到 rocketmq服务端   ######");

        //自定义事务编号
        String txId = UUID.randomUUID().toString().substring(0, 8);

        //发送半事务消息,返回发送结果
        TransactionSendResult transactionSendResult =
                rocketMQTemplate.sendMessageInTransaction("rocketmq-tx-msg-group", //组
                        "rocketmq-tx-msg-kh96",  //队列
                        MessageBuilder.withPayload(kgcMallOrder).setHeader("txId", txId).build(), // 消息体
                        kgcMallOrder); //发送内容

        log.info("###### 2. 开始发送生成订单的半事务消息rocketmq服务端成功,响应:{}   ######", transactionSendResult);

    }

    @Override
    @Transactional
    public void executeCreateOrderLocalTx(String txId, KgcMallOrder kgcMallOrder) {

        log.info("###### 3.1 本地开始执行生成订单的事务操作  ######");

        //开始插入订单
        kgcMallOrderRepository.save(kgcMallOrder);

        log.info("###### 3.2 本地执行生成订单的事务操作 成功  ######");

        // 模拟本地事务处理失败
//        int a = 10 / 0;

        log.info("###### 3.3开始生成用于事务回查的本地事务日志  ######");
        //创建事务对象
        KgcMallTxlog kgcMallTxlog = KgcMallTxlog.builder()
                .id(txId)
                .txDetail("本地事务日志")
                .txTime(new Date())
                .build();

        //事务日志入库
        kgcMallTxlogrepisitory.save(kgcMallTxlog);
        log.info("###### 3.4 生成用于事务回查的本地事务日志成功 ######");

    }


}

4.5.4.2 监听器
4.5.4.2.1 RocketMQExecuteLocalTxListener
/**
 * Created On : 30/11/2022.
 * <p>
 * Author : huayu
 * <p>
 * Description: 事务消息,本地执行事务监听,半事务消息发送成功后,此监听会收到本地事务处理的通知
 */
@Slf4j
@Component
@RocketMQTransactionListener(txProducerGroup = "rocketmq-tx-msg-group")
public class RocketMQExecuteLocalTxListener implements RocketMQLocalTransactionListener {


    @Autowired
    private RocketMQTxService rocketMQTxService;

    @Autowired
    private KgcMallTxlogrepisitory kgcMallTxlogrepisitory;

    //执行本地事务
    @Override
    public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) {

        try {
            //调用本地事务执行的业务处理接口
            log.info("###### 3 半事务消息发送成功, 执行本地事务  ######");
            rocketMQTxService.executeCreateOrderLocalTx((String) msg.getHeaders().get("txId"), (KgcMallOrder) arg);

            //响应本地事务执行成功结果给服务端,服务端接收到此提交结果,会投递消息
            log.info("###### 4 本地事务处理成功,响应事务处理结果给服务端 ######");
            return RocketMQLocalTransactionState.COMMIT;
        } catch (Exception e) {
            log.error("###### 本地事务执行异常:{} ######", e.getMessage());
        }

        //响应本地事务执行失败结果给服务端,服务端接收到此回滚结果,不会投递消息(缓存,并定期删除)
        log.info("###### 4 本地事务处理失败,响应事务处理结果给服务端 #######");
        return RocketMQLocalTransactionState.ROLLBACK;
    }


    //回查本地事务
    @Override
    public RocketMQLocalTransactionState checkLocalTransaction(Message msg) {

        log.info("###### 5 未收到第4步本地事务处理结果,回查事务状态 ######");
        //在网络闪断或者服务重启,没有及时通知服务断事务处理结果,进行会查操作
        //如果回查本地事务执行成功(看事物日志是否存在,如果存在就是处理成功如果不存在就是处理失败),通知服务端投递消息,否则不能投递
        log.info("###### 6 检查本地事务处理结果,响应事务处理结果给服务端 ######");
        if (kgcMallTxlogrepisitory.findById((String) msg.getHeaders().get("txId")).orElse(null) == null) {
            //本地事务入库失败,代表本地事务没有处理成功,步投递消息(缓存,并定期删除)
            log.info("###### 7 检查本地事务处理结果失败 ######");
            return RocketMQLocalTransactionState.ROLLBACK;
        }

        //本地事务入库成功,代表本地事务处理成功,投递消息
        log.info("###### 7 检查本地事务处理结果成功 ######");
        return RocketMQLocalTransactionState.COMMIT;
    }


}

4.5.4.2.2 RocketMQConsumerTxMsgListener
/**
 * Created On : 30/11/2022.
 * <p>
 * Author : huayu
 * <p>
 * Description: 事务消息,消费监听,如果本地事务处理成功,会收到投递的消息,如果失败,收不到消息
 */
@Slf4j
@Component
@RocketMQMessageListener(consumerGroup = "rocket-tx-msg-consumer-group",
        topic = "rocket-tx-msg-kh96"
)
public class RocketMQConsumerTxMsgListener implements RocketMQListener<Object> {

    @Override
    public void onMessage(Object message) {
        log.info("######  8 消费端,收到生成订单成功的事务消息:{} ###### ", message);
    }

}
4.5.4.3 控制器
/**
 * Created On : 30/11/2022.
 * <p>
 * Author : huayu
 * <p>
 * Description: RocketMQ 消息队列 测试消息入口
 */
@Slf4j
@RestController
public class RocketMQController {

    @Autowired(required = false)
    private RocketMQTemplate rocketMQTemplate;

    @Autowired
    private RocketMQTxService rocketMQTxService;


    /**
     * @param : [phoneNo]
     * @return : java.lang.String
     * @author : huayu
     * @date : 30/11/2022
     * @description : 测试发送消息到用户中心,用户中心给手机号发信息
     */
    @RequestMapping("/testRocketMQSendMsg")
    public String testRocketMQSendMsg(@RequestParam String phoneNo) {
        log.info("------ 使用RocketMQ,测试给手机:{},发送消息 -------", phoneNo);

        //使用RocketMQ发送消息
        rocketMQTemplate.convertAndSend("rocketmq-send-sms-kh96", phoneNo);

        return "send msg success";

    }

    /**
     * @param : [phoneNo]
     * @return : java.lang.String
     * @author : huayu
     * @date : 30/11/2022
     * @description : 测试roketmq-发送可靠同步消息
     */
    @RequestMapping("/testRocketMQSendMsgSync")
    public String testRocketMQSendMsgSync(@RequestParam String syncMsg) {
        log.info("------ 使用RocketMQ,发送可靠同步消息{} -------", syncMsg);

        //使用RocketMQ发送消息,拿到同步结果
        SendResult sendResult = rocketMQTemplate.syncSend("rocketmq-sync-msg-kh96", syncMsg);

        log.info("------ 使用RocketMQ,发送可靠同步消息结果:{} -------", sendResult);

        return "send sync msg success";

    }

    /**
     * @param : [phoneNo]
     * @return : java.lang.String
     * @author : huayu
     * @date : 30/11/2022
     * @description : 测试roketmq-发送可靠异步消息
     */
    @RequestMapping("/testRocketMQSendMsgAsync")
    public String testRocketMQSendMsgAsync(@RequestParam String asyncMsg) {
        log.info("------ 使用RocketMQ,发送可靠异步消息:{} -------", asyncMsg);

        //使用RocketMQ发送消息
        rocketMQTemplate.asyncSend("rocketmq-sync-msg-kh96",
                asyncMsg,
                new SendCallback() {
                    @Override
                    public void onSuccess(SendResult sendResult) {
                        log.info("------  可靠异步发送成功回调  ------");
                    }

                    @Override
                    public void onException(Throwable throwable) {
                        log.info("------  可靠异步发送失败回调  ------");
                    }
                });

        return "send async msg success";

    }


    /**
     * @param : [phoneNo]
     * @return : java.lang.String
     * @author : huayu
     * @date : 30/11/2022
     * @description : 测试roketmq-发送单向消息,只发不收结果
     */
    @RequestMapping("/testRocketMQSendMsgOneWay")
    public String testRocketMQSendMsgOneWay(@RequestParam String oneWayMsg) {
        log.info("------ 使用RocketMQ,发送单向消息:{} -------", oneWayMsg);

        //使用RocketMQ发送消息
        rocketMQTemplate.sendOneWay("rocketmq-oneWay-msg-kh96", oneWayMsg);

        return "send oneWay msg success";

    }

    /**
     * @param : [phoneNo]
     * @return : java.lang.String
     * @author : huayu
     * @date : 30/11/2022
     * @description : 测试roketmq-发送顺序消息
     */
    @RequestMapping("/testRocketMQSendMsgOrderly")
    public String testRocketMQSendMsgOrderly(@RequestParam String orderlyMsgs) {
        log.info("------ 使用RocketMQ,发送顺序消息:{} -------", orderlyMsgs);

        //使用RocketMQ发送顺序消息,必须要提供一个唯一的标识di,比如用户编号等
        String userId = UUID.randomUUID().toString().replace("-", "");

        //发送多条顺序消息,模拟iang消息分割成多个符号发送
        Arrays.asList(orderlyMsgs.split("")).
                forEach(orderlyMsg -> rocketMQTemplate.syncSendOrderly("rocketmq-orderly-msg-kh96", orderlyMsg, userId));

        return "send orderly msg success";

    }


    /**
     * @param : [phoneNo]
     * @return : java.lang.String
     * @author : huayu
     * @date : 30/11/2022
     * @description : 测试roketmq-发送事务消息
     */
    @RequestMapping("/testRocketMQSendMsgTx")
    public String testRocketMQSendMsgTx(@RequestParam String txmsg) {
        log.info("------ 使用RocketMQ,发送事务消息:{} -------", txmsg);

        //使用RocketMQ发送事务消息,模拟生成一笔订单
        KgcMallOrder kgcMallOrder = KgcMallOrder.builder()
                .userId(2)
                .userName("RocketMQ_tx")
                .prodId(2)
                .prodName(txmsg)
                .totalPrice(96.0)
                .build();

        //发送事务消息
        rocketMQTxService.sendCreateOrderHalfTx(kgcMallOrder);

        return "send tx msg success";

    }

}

4.5.5 测试

4.5.5.1 发送事务消息成功
4.5.5.1.1 发送请求

4.5.5.1.2 日志查看

4.5.5.2 发送事务消息失败(模拟异常)
4.5.5.2.1 发送请求

4.5.5.2.2 日志查看




有关SpringCloud Alibaba(五) - RocketMQ的更多相关文章

  1. 『赠书活动 | 第一期』《分布式中间件核心原理与RocketMQ最佳实践》 - 2

    💗wei_shuo的个人主页💫wei_shuo的学习社区🌐HelloWorld!『赠书活动|第一期』本期书籍:《分布式中间件核心原理与RocketMQ最佳实践》赠书规则:评论区:点赞|收藏|留言评论区留言:"人生苦短,我用Java"活动截止时间:4月23日赠书数量:1Tip:中奖后博主私信通知|三天内不回复将视为|自动放弃书籍介绍分布式中间件核心原理与RocketMQ实战技术一本通:实战案例+操作步骤+执行效果图,手把手教你吃透分布式中间件技术,轻松实现从小白到大牛的职业跃迁!分布式中间件核心原理与RocketMQ实战技术必修宝典!内容简介本书从分布式系统的基础概念讲起,逐步深入分布式系统中间

  2. Nginx生产环境配置、elasticsearch生产环境配置、rocketmq生产环境配置 (史上最全) - 2

    Nginx实现10万+并发在优化内核时,可以做的事情很多,不过,我们通常会根据业务特点来进行调整,当Nginx作为静态web内容服务器、反向代理或者提供压缩服务器的服务器时,期内核参数的调整都是不同的,概述:由于默认的linux内核参数考虑的是最通用场景,这明显不符合用于支持高并发访问的Web服务器的定义,所以需要修改Linux内核参数,让Nginx可以拥有更高的性能;注:本文以PDF持续更新,最新尼恩架构笔记、面试题的PDF文件,请从下面的链接获取:码云参考关键的Linux内核优化参数/etc/sysctl.conf修改/etc/sysctl.conf来更改内核参数修改好配置文件,执行sys

  3. RocketMQ事务消息 - 2

    文章目录事务消息RocketMQ事务流程概要RocketMQ事务流程关键事务消息的使用约束分布式事务场景分析场景案例RocketMQ事务消息设计分析消费事务消息事务消息RocketMQ事务流程概要RocketMQ的事务消息,是指Producer端消息发送事件和本地事务事件,同时成功或同时失败RocketMQ实现事务主要分为两个阶段:正常事务的发送及提交、事务信息的补偿流程(都是针对生产者因为事务只出现在DataBase中有些情况需要将消息存储在数据库中如果发生事务问题…)整体流程为:正常事务发送与提交阶段生产者发送一个半消息给broker(半消息是指的暂时不能消费的消息)服务端响应开始执行本地

  4. 主流消息队列RocketMq,RabbitMq比对使用 - 2

    首先整理这个文章是因为我正好有机会实战了一下rocketmq,阿里巴巴的一个开源消息中间件。所以就与以往中rabbitmq进行小小的比较一下。这里主线的根据常见面试问题进行整理。1.消息队列常用的场景1.1.削峰例如我们做得考试系统中,用户通过人脸识别登录系统,考虑到考试系统的特殊性,三万名考生参加考试,需要记录人脸识别登录照片。从考试完结果上看,用户最大并发数在4000,于是我们采用rocketMq来进行异步消费用户人脸识别图片,当时统计rocketMq每秒1000消费消息。及时反馈了考生人脸识别登录成功,对数据库写操作也起到很大的缓冲功能。1.2.解耦如常用ABCD系统中,BCD系统都需要

  5. Rocketmq、Rabbitmq、Kafka、Mongo、Elasticsearch、Logstash、Kibana、Nacos、Skywalking、Seata、Spark、Zookeeper安装 - 2

    提示:宝塔面板安装docker/docker-compose,一条命令搞定rabbitmq的安装与配置文章目录前言一、docker-compose.yml配置二、安全组规则添加端口三、通过浏览器访问rabbitmq的管控页面四、提供其他项目依赖总结前言已经安装好了宝塔面板、并且可以在Docker栏目,选择docker安装,会把docker和docker-compose都安装好了一、docker-compose.yml配置在任意一个目录下创建并编辑vimdocker-compose.yml配置粘贴version:'3.8'services:rabbitmq:image:rabbitmq:3.7.

  6. RocketMQ 消息重新投递 解析——图解、源码级解析 - 2

    ?Java学习:Java从入门到精通总结?深入浅出RocketMQ设计思想:深入浅出RocketMQ设计思想?绝对不一样的职场干货:大厂最佳实践经验指南?最近更新:2022年11月4日?个人简介:通信工程本硕?、Java程序员?。做过科研paper,发过专利,优秀的程序员不应该只是CRUD?点赞?收藏⭐留言?都是我最大的动力!文章目录死信队列重新投递定时重新投递死信队列重新投递当消息消费失败时,消息队列RocketMQ会自动进行消息重试,达到最大重试次数后,如果依然没有消费成功的话,说明消费者无法正常消费该消息了。在这种情况下,R

  7. 手把手教你搭建SpringCloudAlibaba之Nacos服务配置中心 - 2

       SpringCloudAlibaba全集文章目录:零、手把手教你搭建SpringCloudAlibaba项目一、手把手教你搭建SpringCloudAlibaba之生产者与消费者二、手把手教你搭建SpringCloudAlibaba之Nacos服务注册中心三、手把手教你搭建SpringCloudAlibaba之Nacos服务配置中心四、手把手教你搭建SpringCloudAlibaba之Nacos服务集群配置五、手把手教你搭建SpringCloudAlibaba之Nacos服务持久化配置六、手把手教你搭建SpringCloudAlibaba之Sentinel实现流量实时监控七、手把手教你

  8. docker部署RocketMQ - 2

    文章目录前言一、拉取镜像二、挂载目录三、启动服务总结前言docker部署RocketMQ服务一、拉取镜像mq镜像#拉取镜像dockerpullrocketmqinc/rocketmq:4.3.2#修改镜像名字dockertag【镜像id】rocketmq:4.3.2可视化平台镜像#拉取镜像dockerpullstyletang/rocketmq-console-ng:1.0.0#修改镜像名字dockertag【镜像id】rocketmq-console:1.0.0二、挂载目录注意:目录按照自己的实际路径来1、创建nameserver挂载目录mkdir-p/docker/rocketmq/dat

  9. RocketMQ 消费者Rebalance 解析——图解、源码级解析 - 2

    ?Java学习:Java从入门到精通总结?深入浅出RocketMQ设计思想:深入浅出RocketMQ设计思想?绝对不一样的职场干货:大厂最佳实践经验指南?最近更新:2023年4月15日?新专栏筹备中,还是熟悉的源码,还是熟悉的感觉!?点赞?收藏⭐留言?都是我最大的动力!文章目录什么是消息负载均衡?Rebalance的触发条件负载策略使用方法消息消费默认策略什么是消息负载均衡?Rebalance机制:将一个Topic下的多个队列在同一

  10. RocketMQ Push消息给消费者 解析——图解、源码级解析 - 2

    ?Java学习:Java从入门到精通总结?深入浅出RocketMQ设计思想:深入浅出RocketMQ设计思想?绝对不一样的职场干货:大厂最佳实践经验指南?最近更新:2022年9月9日?个人简介:通信工程本硕?、Java程序员?。做过科研paper,发过专利,优秀的程序员不应该只是CRUD?点赞?收藏⭐留言?都是我最大的动力!文章目录概述Push消息消费流程开启消息消费接收消息概述RocketMQ中消费者有两种方式获得消息来消费:Push模式和Pull模式Push模式&#x

随机推荐