RocketMQ入门

#启动RocketMQ:

​ 1.启动NameServer
1.启动NameServer
nohub sh bin/mqnamesrv $
2.查看日志
tail -f ~/logs/rocketmqlogs/namesrv.log
2.启动Broker
1.启动Broker
nohub sh bin/mqbroker -n localhost:9876 &
2.查看日志
tail -f ~/logs/rocketmqlogs/broker.log

RocketMQ集群搭建

Producer集群发送消息前先去询问Name Server,然后Name Server给Producer一个Broker的地址,Producer根据得到的地址将消息发送给Broker.Broker暂存消息,传输消息,Broker和Name Server建立长连接,定时组测Topic信息到所有NameServer,Consumer先去连接Name Server得到一个Broker的地址,然后根据地址去Broker中获取消息.

集群启动后,Broker会给Name Server每个节点上报信息,节点之间不需要数据的同步,所以Name Server是无状态的.

Broker主从节点:主节点执行的是’写’操作,从节点执行的是’读’操作,"写"主要面对的是producer,consumer去查消息,从节点执行"读"的操作.

Master和Slave之间的消息同步可以是同步的也可以的异步的

NameServer 是无状态的,集群自减不需要数据的同步或者信息的同步

Broker分主从节点,一个Master可以对应多个Slaver,但是一个Slaver自能对应一个Master,通过BrokerName去顶是一组,通过BrokerId判断主从节点,0为主节点,非零为从节点,Broker和Name Server建立长连接,定时注册Topic信息到所有的Name Server,

Producer和N阿么server集群中随机一个节点建立长连接,定期从NameServer获取Topic路由信息,并向提供Topic服务的Broker建立长连接,且定时向Master发送心跳,让producer知道自己是启动还是关闭的状态,producer无状态,可以集群部署.

Consumer获取消息的方式有两种,一种是自己主动去拿,另外一种是Broker推送,Consumer和Name Server建立长连接获取Topic路由信息,并向提供Topic的Master,Slaver建立长连接,且定时向Master.Slaver发送心跳,当推送的消息的时候通过心跳判断Consumer是否还活着.Consumer即可以从Master订阅消息也可以从Slaver订阅信息,订阅规则由Broker配置决定

消息发送

基本样例

消息发送

1)发送同步消息:可靠性较高,应为一定会得到一个消息发送的结果,使用范围比较广泛,ey:重要的消息通知,短信…

1)发送异步消息:通常用于对等待时间敏感的场景,即不发送端不能容忍长时间等待Broker的相应

3)发送单向消息:这种方式常用于不注重发送结果的场景,ey:发送日志…

消费消息

DefaultMQProducer//这种是推的形式,Broker向Consumer推送消息
负载均衡模式

Consumer们共同消费了一段消息,ey:ConsumerA消费了a;ConsumerB消费了b,c

####广播模式

Consumer消费了同样的消息,也就是多个Consumer消费了同样的消息,ey:Broker中有a,b,c这个消息,ConsumerA消费了a,b,c;ConsumerB也消费了a,b,c

默认是负载均衡模式

DefaultMQPushConsumer defaultMQPushConsumer = new DefaultMQPushConsumer("group1");
defaultMQPushConsumer.setMessageModel(MessageModel.BROADCASTING);//广播模式
defaultMQPushConsumer.setMessageModel(MessageModel.CLUSTERING);//负载均衡模式

顺序消息

Producer发送多个消息,Broker虽然有多个队列,但是会采用轮询的方式依次将消息放在不同的队列中.

Consumer消费消息是多线程的方式

保证消息的顺序:

​ *全局消息顺序:Broker中所有的消息接受的时候按照发送的顺序

​ *局部消息顺序:接收的时候保证一部分消息的顺序;确认每段消息发送的序列固定,一个线程接收一个队列的消息,这样就能保证局部消息的顺序,ey:张三发送的消息只在A队列中,李四发送的消息只能在B队列中

延时消息

比如电商系统中,提交一个顶单可以发送一个延时消息,1h后检查这个订单的状态,如果还是未付款就取消订单的状态,恢复库存

设置延时级别从1开始,延时时间依次递增

Message message = new Message("ProducerDelay", "Tag1", ("helloDelayMessage" + i).getBytes());
message.setDelayTimeLevel(3);//一共1s~2h 十八个级别

批量消息

即使用Producer发送消息的时候一次发送多条,批量发送消息可以显著提升传递消息的性能,

限制就是这些批量消息应该有相同的topic,相同的waitStoreMsgOK,而且不能是延时消息,此外,一批消息的大小不能超过4MB;

过滤消息

1)tag过滤

2)sql过滤

message.putUserProperty("i", String);

事务消息

Producer发送的消息需要提交,否者不能被消费者消费;事务控制的 消息放在MQserver中短暂的对Consumer是不可见的,称之为半消息(Half Msg);

半消息发送完后MQ会返回一个结果告诉Producer已经收到了,然后Producer执行本地的事务,本地事务执行完后会对这条半消息执行commit或者rollback,commit即提交了,然后consumer就可以消费了,rolback那么就会进行消息的回滚,MQ就会将消息干掉,consumer就接受不到该消息;如果commit或者rollback失败,MQ会对消息进行回查(即事务消息的补偿流程)检查消息的状态(check back),然后经过本地的检查方法对消息进行处理(commit or rollback);

事务消息的状态

提交状态:消息被提交,可以被consumer消费

回滚状态:该消息将会被删除,不能被消费

中间状态:需要消息检查队列来确定消息的状态

总结

MQ特点:

1.流量削峰; 2.应用解耦; 3.数据分发;

缺点:降低系统的

集群

双主双从

基本样例

1)消息发送:异步;同步,单向

2)消费消息方式:负载均衡,广播模式

顺序消息

通常是局部顺序,将消息发送到一个队列

延时消息

设置延时时间,ey:订单…

延时级别:1s~2h 一共18个级别

批量消息

将Message放入list中批量发送,大小不能超过4MB;

大于4MB进行分割处理

过滤消息

1)根据tag

2)根据sql

事务消息

发送半消息到MQ,MQ返回发送成功结果,Producer接到信息后commit or rollback,commit or rollback失败或者既没有提交也没有回滚,会回查消息状态,调用本地方法从新commit or rollback

事务消息不支持批量消息和延时消息,为了避免消息的堆积,会默认检查次数限制十五次,也可以通过Broker的配置文件修改限制次数,如果超过15次就废弃该消息;

事务性消息可能不止一次被检查或者消费,所以Consumer做好消息重复性的检查

消息有可能会丢失,建议使用集群的方式防止消息丢失

事务消息的生产者ID不能和其他消息类型的ID重复,因为事务消息有反向查询机制,MQ能通过他们的生产者ID查询到消费者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值