rocketmq

参考资料:https://blog.csdn.net/m0_59849460/article/details/124115627

1.相关概念

       1.1 基本概念

              MQ:消息队列,Message Queue,保存消息数据的队列

              调用:web层代码调用service层代码

              消息:调用者发送给被调用者,需要后者处理的内容

              队列:一种数据结构,先进先出

              MQ系统中包含以下角色和概念:生产者、消费者、代理服务器(Broker-临时保存生产者发送消息的服务器)

       1.2 作用/优点

              应用解耦:发送方为生产者,接受方为消费者,异步发送消息,异步请求响应

              应用快速变更维护:方便增删业务(生产者、消费者节点),同样依赖消息的异步发送、处理

              削峰填谷:接收到大量请求,在MQ处排队,等待后台服务器慢慢处理,同样依赖消息的异步发送、处理

              所有实现都是基于异步的大前提。

       1.3 缺点

              系统复杂度提高;系统可用性降低;异步消息机制(消息顺序性、消息丢失、消息一致性、消息重复消费)

              以上缺点都可补强

       1.4 MQ产品对比

              RocketMQ、RabbitMQ、ActiveMQ、Kafka

              ActiveMQ:产品较老,成熟度高,产品文档较多

              RabbitMQ:并发能力强、性能极高、管理界面丰富、社区活跃

              RocketMQ:功能强大、扩展性强

              Kafka:功能少、大数据领域产品

       1.5 RocketMQ角色和概念

              消息生产者:生产消息 producer

              消息服务器:broker 实现接收、提供、持久化、过滤消息

              消息消费者:consumer 消费消息

              监听器:监听broker,消费者监听broker,有消息则进行消费

              偏移量:消费者从代理服务器消费完数据并没有删除,而是打上已经消费过的标签;偏移量记录的是已经消费过的数据的编码

              命名服务器:NameServer[Cluster]统筹管理生产者、服务器、消费者。broker注册进入Cluster;生产者和消费者从broker发送和接收消息;

                                   nameserver通过心跳检测取人三者存活。(三者30/S向命名服务器发送次心跳)

              消息组成:主题(topic)、标签(tag子主题)、消息体(body)

              broke组成:包含多个不同主题,每个topic包含多个队列(默认4个)

       1.6 安装及启动

              安装二进制版本,无需编译等操作。前提是安装JDK,版本大于等于8,并且配置号JAVA_HOME

              启动nameserver,操作及命令为:进入bin目录,执行 sh mqnamesrv

              修稿broker配置文件broker.conf 指定本地ip地址,方便生产者和消费者连接

              启动broker,操作及命令为:进入Bin目录,执行 mqbroker -n 要连接的nameserver的ip:端口 ../conf/broker.conf。

              校验是否启动成功,可通过内置测试脚本或rocket-console图形化界面查看

              注意:学习期间启动broker调整内存需求为256M/128M/128M ,默认为8G/4G/4G

    2.快速入门

              pom.xml中配置jdk1.8版本,引入rocketmq-client依赖

              一对一消费模式

              一对多消费模式

                     消费者消费模式有两种:

                     负载均衡模式(同一个消费者组的多个CLUSTERING模式的消费者之间会竞争;不同消费者组之间的消费者不竞争,类似广播模式)

                     广播模式(消息通过广播模式传递给所有消费者,每个消费者都会消费所有的消息)

              多对多同步消息(生产者的分组对消费者不会产生影响,多个生产者发送的消息只需要属于同一个topic,就可被订阅该主题的消费者消费)

    3.消息类别

              同步消息(及时性强,必须有回执)、异步消息(及时性弱、无需回执)、单向消息(无需回执的消息)

              业务要求实时返回,选用同步消息。业务及时性不高,选用异步消息;只需操作不负责后续的选用单项消息。工作优先选用异步,目的为了提高效率

    4.延时消息

              只支持固定延迟,1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h,通过msg.setDelayTimeLevel(int index),索引从0开始,0代表1s,1代表5s

              应用场景:下单后,发送1个延时消息,1个小时后执行该延时消息,检查订单是否支付,如未支付,取消订单,释放库存

    5.批量发送消息

              创建多条消息,放入List中,一次性发送

              一次性发送的消息不得超过4M,总共包括topic(字符串字节数)、body(字节数组长度)、property(消息追加属性,key-value对应字符串字节数)、log(固定20字节)

    6.消息过滤

              消费者根据不同的规则选择性的消费符合要求的消息,过滤规则有以下几种

              主题过滤:只消费指定topic的消息

              标签过滤:只消费指定topic下指定tag的消息,生产者创建消息对象,指定tag

              SQL过滤:消费者按照属性过滤,只消费指定topic下含有指定属性的消息。

                            生产者创建消息对象后,为消息对象添加属性;消费时,通过属性过滤,类似SQL中的语法,例如=,>=,<=,or,and,in,不支持模糊查询;

                            需要在配置文件中开启enablePropertyFilter=true

    7.消息有序性

              保证消息有序性的方法

              某业务的所有消息只能存入1个队列,因为一旦存入多个队列,无法保证消费时按照顺序消费

              某个队列只能被1个消费者线程消费。一旦1个队列被多个消费者消费,则可能A消费者正在消费某队列,还未消费完,B消费者就进行消费,顺序可能会被打乱

              有序性包含:存入有序,消费有序。

              存入有序:同一个任务的多个消息有序的存入1个队列

              消费有序:只有1个确定的消费者线程消费当前队列

    8.消息原子性

              可能存在的原子性问题:例如A业务的三个子业务需要分别向broker发送消息,如果第三个子业务失败,则前面的事务已经发送消息无法撤回

              初步解决方案:在子业务提交之前,先在本地创建对象将消息保存起来,而非直接发给broker,对象中保留本地事务的状态,提交为commit,回滚为rollback,其他情况为unknown

                                          异步定时检查对象中的status属性,值为commit就真发送,否则不发送

              rocketmq解决方案:rocketmq也考虑到了初步解决方案,区别在于消息临时保存点转移到了broker中,在确认本地producer本地事务提交之前,consumer不能被consumer消费,

                                          从rocketmq4.3版本开始,定义了事务消息实现该功能

                                          普通消息:生产者发送消息到Broker之后,立即存入目标队列无法撤回

                                          事务消息:生产者发送消息到broker之后,并不会立即存入目标队列,等生产者确认无误后再存入目标队列等待消费                       

    9.常见问题

              找不到topic,大概率连接不上broker,常见原因如代码中NameServer中地址不对,linux防火墙启动,启动broker未指定NameServer地址和端口

              解决办法:代码中修订NameServer地址;关闭linux防火墙;启动broker通过-n指定NameServer地址和端口

             

              请求超时:broker启动,选择错误网卡

              解决办法:配置实现启动指定使用的ens33网卡。修改broker.conf(配置文件中通过brokerIP1指定ens33网卡的ip),重启broker,指定broker.conf

       参考资料:

              RocketMQ从零开始使用:https://blog.csdn.net/m0_59849460/article/details/124115627

              RocketMQ快速入门:https://blog.csdn.net/u022812849/article/details/125600649

              spring boot 集成RocketMQ:https://blog.csdn.net/zxl646801924/article/details/105659481

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值