生产者
DefaultMQProducer
发送消息失败,消息重试。
produce.send(msg,10)
可以指定重试的次数
producer,可以向多个主题发送消息
设置Tag,可以进行一些简单的过滤
不同模式的producer
NormalProducer(普通)
OrderProducer(顺序)
producer.send(msg,MessageQuequeSelector,0(对了序号))
当有多个consumer消费数据时(注意是同一个队列),数据1,2,3... 消费者a消费完数据1,才能去让其他消费者消费数据2。可以保证每个topic中的队列消费是顺序的
TransactionProducer
TransactionProducer(事务)https://www.cnblogs.com/happyflyingpig/p/8283525.html
注意:
一条完整的事务是2条消息,先发送到broker,然后callback回来,算是1条数据,在callback中确认或者回滚到broker是第二条数据。
状态:
LocalTransactionState.UNKNOW 不清的状态(msg数据会丢失)
LocalTransactionState.ROLLBACK_MESSAGE 提交回滚,消费者不能消费消息(但消息还是存在的)
LocalTransactionState.COMMIT_MESSAGE 提交成功,消费者可以消费消息
版本的区别:
当callback中发送确认消息时失败了,怎么知道消息处理处理失败的问题
之前的版本有提供,闭源的rocketmq也提供了(会定时检查broker中未成功的消息,会提供一个回调,告诉消息处理失败的消息)
可以通过先定时检查Consumer端的入库的数据,然后发送给Producer端,producer端匹配自己这边入库的数据,将没有发送出去的数据,重发。
消费者(先订阅服务,在发送消息)
DefaultMQPushConsumer
setConsumerMessageBatchMaxsize(10); 看情况,不会一次性拉取10条数据。如果生成者先生产数据,有数据积累,可能会部分10条,10条的拉取。
MessageModel
CLUSTERING 集群模式,多个consumer消费数据,会负载均衡的消费Topic中的数据
BROADCASTING 广播模式,多个consumer消费是同样的数据
消费数据失败,重试。(可以得到重试的次数 )
timeout重试(无限次数的重试)
exception重试(理论性的重试,指定重试策略)
消费群组
当有多个消费者组成一个组之后,当a消费者,消费b数据失败了,然后会将消息交给c消费者。
消费者默认有多个线程去消费,也可以设置线程数量(不需要再代码中去写多线程操作)
consumer.setConsumerThreadMin()
consumer.setConsumerThreadMax()
DefaultMQPullConsumer(自己去拉取数据)
消费位置要自己手动管理
MQPullConsumerScheduleService
Broker
多slave配置,主节点挂了,不会主从切换,slave节点主要用来提供消费数据(写入,同步数据是主节点干)
Topic
每个主题表示一个逻辑上的存储的概念,而在其MQ上,会有着与之对应的多个Queue队列
Filter
需要在配置文件中配置filter
broker可以指定多个filter
上传的filter不能加中文
分布式事务(https://www.jianshu.com/p/453c6e7ff81c)
使用消息队列避免事务
A系统处理事务后产生一个凭证E,将这个凭证E发送到消息系统,进行其他的系统处理。可以通过这个凭证(消息)完成最终的一致性
// 银行扣款
//1.封装消息,将银行扣款的事件封装成一个消息
//2.发送消息 send(msg,callback)
//3.在callback处理本地事务
update A set account=account-1000 where userid =1
//4.本地事务完成之后,(这个时候发送的消息,Consumer并不是可见的,要Commit之后,Consumer才可见)
成功(COMMIT)
失败(ROLLBACK)