cjay_fighting
这个作者很懒,什么都没留下…
展开
-
rmq 主备自动切换模式
有2种方式检测到broker不可用:1、netty层检测到与broker连接断开,比如触发disconnect、close、连接读写空闲(IdleStateEvent)、异常事件时,执行DefaultBrokerHeartbeatManager#onBrokerChannelClose。提交:只确保leader一定会在响应之前执行提交逻辑,follower同步到最新日志时执行提交逻辑,选举时,新当选的leader一定具有所有已提交的日志,并且会在当选时提交一条空日志来确保提交。broker相关类图。原创 2023-01-03 20:42:02 · 696 阅读 · 0 评论 -
rmq DLedger集群
日志本地写入后,开始同步给Follower,为了实现超时判断,日志同步是在单独的线程中执行的,每条日志在本地写入成功后,会在缓存一个AppendFuture,它是CompletableFuture的可超时的子类,当这条日志过半同步成功并且提交后,执行CompletableFuture.complete,这时才给客户端返回写入成功或超时的响应。如果存在,从截断日志的结束偏移量开始截断。日志的同步分为4个阶段,依次是:比较,截断,追加,提交(COMPARE,TRUNCATE ,APPEND,COMMIT)原创 2023-01-03 20:38:05 · 649 阅读 · 1 评论 -
rmq集群同步复制、异步复制
当没有开启DLeger集群或Controller模式时,rmq集群类型分为多主和多主多从,多主多从又分为异步复制和同步复制。多主多从通过brokerRole配置角色,ASYNC_MASTER、SYNC_MASTER、SLAVE,master的brokerId一定是0,slave的brokerId必须大于0再谈broker的注册在启动和心跳时会向name server发送注册broker请求(REGISTER_BROKER,BrokerController#doRegisterBrokerAll),name原创 2022-12-03 17:19:17 · 536 阅读 · 0 评论 -
rmq批量消息
因为它在broker端的存储是单条tagsCode为0的消息存储的,如果消费者指定了tags过滤,只要指定的tags的hashcode不为0,所有的消息将在broker端过滤掉,一条都拉取不到。批量消息对生产者来说就是可以一次性发送多条消息,支持同步、异步发送,不支持单向发送,主题和waitStoreMsgOK必须相同,tags可以不同,并且不支持延时消息和事务消息。,而不是先拆分成多条,因此发送结果中也只有一个消息id。最终返回多个消息id,原创 2022-11-27 16:58:12 · 403 阅读 · 0 评论 -
rmq文件清理策略
DefaultMessageStore在启动时,会开启一个每隔cleanResourceInterval=10s执行一次的文件清理定时任务,检测当前小时是否是deleteWhen=4,来判断是否进行清理,可以配置多个小时数,分号分割,比如"4;CleanConsumeQueueService,索引文件头记录了最大物理偏移量,因此可以清理该值小于最小物理偏移量的文件。CleanConsumeQueueService,根据日志文件的最小物理偏移量来清理消费队列。原创 2022-11-26 17:03:24 · 651 阅读 · 0 评论 -
rmq nameserver
broker在启动时会执行BrokerController#registerBrokerAll向每台nameserver发起注册broker(RequestCode.REGISTER_BROKER)请求,注册信息包括:brokerClusterName、brokerName、brokerAddr、brokerId、主题配置信息,创建主题时也会发送该请求,nameserver端由DefaultRequestProcessor处理。,如果broker只向其中1台注册,而客户端使用另一台,会找不到主题。原创 2022-11-20 16:37:26 · 212 阅读 · 0 评论 -
rmq消费者-推模式
每隔20s,获取一次当前消费组订阅的主题队列和clientId,执行队列分配策略得到当前消费者分到的队列,与上一次重平衡的队列RebalanceImpl.processQueueTable进行比较,对新增的队列,创建PullRequest,加入到PullMessageService的阻塞队列messageRequestQueue中,让PullMessageService线程轮询这个队列处理;单个进程,消费端可以创建多个消费组不同的消费者,发心跳时每个消费者对应一个ComusemrData。原创 2022-11-16 19:58:02 · 381 阅读 · 0 评论 -
rmq-dashboard消息查询
和msgId查询一样,也是RequestCode.QUERY_MESSAGE请求,但是请求的MixAll.UNIQUE_MSG_QUERY_FLAG字段为false,但是可以得到最多64条消息。QueryMessageProcessor负责处理RequestCode.VIEW_MESSAGE_BY_ID和RequestCode.QUERY_MESSAGE请求。生产者也是通过RequestCode.GET_ROUTEINFO_BY_TOPIC请求获取主题的broker和队列的。原创 2022-11-07 19:49:12 · 411 阅读 · 0 评论 -
rmq发送消息-服务端
并不是直接fileChannel.force,而是创建一个刷盘请求放到写集合,唤醒刷盘线程,刷盘线程交换空的读集合与写集合,遍历读集合中的刷盘请求进行刷盘,而且最少刷盘数是0,这样如果同一时刻有多个刷盘请求,这些请求会在同一批次进行处理,底层只会进行最多2次刷盘。文件结尾处理:如果消息长度+8大于剩余位置长度(文件大小-写入偏移量),则到达结尾,这时写入一条长度为剩余长度的空消息,魔数为BLANK_MAGIC_CODE,普通消息的魔数是MESSAGE_MAGIC_CODE。原创 2022-11-03 08:42:39 · 600 阅读 · 0 评论 -
rmq创建主题
创建主题时,其实可以不需要指定nameserver,只需要指定broker,并且只会在指定的broker上创建主题,通过nameserver来维护主题到broker的映射关系。使用mqAdmin脚本执行rocketmq的管理命令时,执行的主类是MQAdminStartup,mqAdmin的子命令则对应SubCommand接口的实现类。原创 2022-11-01 21:07:38 · 246 阅读 · 0 评论 -
rocketmq启动流程
根据配置文件和命令行参数,创建4个配置类:BrokerConfig、NettyServerConfig、NettyClientConfig、MessageStoreConfig,配置文件通过-c参数指定,如果没指定,使用默认配置。用于判断进程上一次是否强制退出,启动时会创建,目录是${user.home}/store/abort,启动失败、或正常退出执行shutdownhook时删除该文件,强制退出执行kill -9时不会删除该文件。创建完4个配置类后,根据配置类创建brokerController,原创 2022-11-01 20:26:57 · 1315 阅读 · 0 评论 -
rocketmq生产者
不管是同步、异步还是单向发送,都会根据主题先从nameserver获取对应队列所在的broker地址,保存到DefaultMQProducerImpl的topicPublishInfoTable中。远程调用之前报的,比如建立连接失败,发送之前超时了,有几个子类,原创 2022-10-23 20:47:22 · 377 阅读 · 0 评论 -
RocketMQ广播消息
广播消息是消费者可以设置一个消费模式,集群模式和广播模式,默认的集群模式处于同一消费组的消费者,只会收到订阅主题的一部分消息,实现了消费者负载均衡;而广播模式的消费者会收到所有消息。consumer.setMessageModel(MessageModel.BROADCASTING);生产者发送3条消息,处于同一消费组的2个消费者都收到了3条消息去掉设置广播模式的代码,起2个消费者,再发送一个收到2条,一个收到1条,而原来广播模式的收到全部的3条...原创 2021-03-24 09:36:07 · 346 阅读 · 0 评论 -
RocketMQ事务消息
半消息在普通消息的基础上增加了2个属性:半消息标志位PROPERTY_TRANSACTION_PREPARED=true,生产者组PROPERTY_PRODUCER_GROUP,broker端将半消息真实主题和队列号保存到属性中,修改主题为RMQ_SYS_TRANS_HALF_TOPIC,队列号固定为0,保存。发送的半消息实际上先存到了broker的一个内部主题RMQ_SYS_TRANS_HALF_TOPIC中,这样对消费者是不可见的,事务提交后,再将消息转存到真正要发送的主题,这样对消费者就可见了。原创 2021-03-23 21:50:54 · 271 阅读 · 0 评论 -
RocketMQ延时消息
消息在DefaultMessageStore#putMessage时,首先会执行PutMessageHook#executeBeforePutMessage,默认的扩展点中,会将延时级别大于0的消息的主题替换成SCHEDULE_TOPIC_XXXX,队列号替换成延时级别-1(0~17),原主题放入REAL_TOPIC属性,原队列号放入REAL_QID属性。RocketMQ延时消息就是生产端发送时,可以为消息指定一个延迟级别DELAY的消息属性,指定该条消息在指定时间后才能被消费端收到。原创 2021-03-23 14:48:11 · 371 阅读 · 0 评论 -
RocketMQ过滤消息
TAGS过滤tags是一个消息属性,存储在消息属性properties,对应key是TAGS,代码如下public class Message implements Serializable { private String topic; private int flag; private Map<String, String> properties; private byte[] body; private String transactionId;原创 2021-03-23 11:18:59 · 98 阅读 · 0 评论 -
RocketMQ顺序消息
rocketmq顺序消息指的是消费者接收顺序和生产者发送顺序一致,生产者在发送消息时,会发送到主题的多个队列,对应不同服务器的broker上,因为服务器处理速度的差异和网络通信延迟,这一批消息在消费时无法保证按照发送顺序接收;生产者的发送方法传入队列选择器和消息的shardingKey,通过将shardingKey与队列总数取模得到队列,使得相同shardingKey的消息分到同一队列。因此解决消息顺序问题要从2个角度出发,首先是生产端,需要保证顺序的同一批消息发到同一队列上。原创 2021-03-23 10:04:48 · 350 阅读 · 0 评论 -
RocketMQ消息发送方式,消费组,推模式拉模式
生产rocketmq生产者通过构造方法创建,先学习2个构造方法,无参的和带生产者组的,无参的默认生产者组是DEFAULT_PRODUCER,另外生产者组好像跟事务消息有关,后面再学DefaultMQProducer producer = new DefaultMQProducer("myProducer");DefaultMQProducer producer1 = new DefaultMQProducer();消息生产需要指定name server地址,不然会报org.apache.rocke原创 2021-03-22 16:22:35 · 1298 阅读 · 0 评论 -
rocketmq单机搭建
主要步骤安装jdk1.8下载安装包,rocketmq4.7.1安装包,解压按需修改nameserver JVM堆大小按需修改brokerserver JVM堆大小,编辑broker.conf,配置nameSrvAddr和brokerIP启动nameserver和brokerserver服务端验证消息生产与消费,客户端验证消息生产与消费操作流程配置解压之后放到/opt/rocketmq4.7.1目录,编辑bin/runserver.sh,nameserver启动脚本是bin/mqname原创 2021-03-19 17:13:06 · 136 阅读 · 0 评论