rabbitMQ
1 参考文献
2 基本属性
- 语言:Erlang,Erlang语言天生具备分布式特性(通过同步Erlang集群各节点的magic cookie来实现),天然支持集群模式(Clustering)
- **关键名词:**producer、broker、exchange、queue、channel、consumer
- 消费模型:支持pull和push两种模型;spring中是对pull的封装**(kafka只支持pull模型)**
- 延时消息的方案
- 利用死信交换机&队列__dead-letter-exchange
- 建立一个有过期时间的queue(ttl)
- 无消费者,消息过期后进入死信队列
- 消费死信队列,则实现过期时间的延迟消息
- 利用插件:rabbitmq-delayed-message-exchange
- 利用死信交换机&队列__dead-letter-exchange
3 工作模型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bJwCiT3z-1608037246836)(D:\TyporaSource\picture\MQ-RabbitMQ-工作模型.png)]
-
直连dircet
-
主题topic
- 广播Fanout
4 消息可靠性
-
producer -> Exchange
-
实现接口 ConfirmCallback回调
/** * ConfirmCallback只确认消息是否到达exchange * 以实现方法confirm中ack属性为标准,true到达 * config : 需要开启rabbitmq得ack publisher-confirm-type */ @Override public void confirm(CorrelationData correlationData, boolean ack, String cause) { if(ack){ log.info("发送消息到exchange成功"); }else{ log.error("发送消息到exchange失败" + cause); } }
-
-
Exchange -> Queue
-
实现 ReturnsCallback回调
/** * ReturnCallback消息没有正确到达队列时触发回调,如果正确到达队列不执行 * config : 需要开启rabbitmq发送失败回退 publisher-returns 或rabbitTemplate.setMandatory(true);设置为true */ @Override public void returnedMessage(ReturnedMessage returned) { log.error("匹配queue失败:{}", returned.toString()); }
-
-
queue -> consumer
-
默认客户端接收到即确认
-
手动确认:配置中开启消费ack确认
/** * 手动ack * 配置config中配置项: * listener: * simple: * acknowledge-mode: manual #消费者手动确认消息 */ @RabbitListener(queues = "fanoutPythonQueue") public void receiveFanoutPythonQueue(Message message, Channel channel) throws IOException { String msg = new String(message.getBody(), StandardCharsets.UTF_8); log.info("fanoutPythonQueue received message:{}; properties:{}", msg, JSON.toJSONString(message.getMessageProperties())); //采用手动ack,multiple = false 确认本次消息,否则确认本次tag之前所有得消息 //配置中开启ack确认后,消费者未确认时消息阻塞,不会收到后续消息,断开连接后,未确认消息回到正常消息队列,被重复消费 channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); /* * 还可以拒绝消息 * 第三个参数是否重回队列 */ // channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,true); }
-
5 服务高可用
- Erlang语言天生具备分布式特性(通过同步Erlang集群各节点的magic cookie来实现),天然支持集群模式(Clustering)
- 各集群仅相互同步元数据,来保证数据一致性
- 具体暂不描述
6 demo验证
- 参考github项目:https://github.com/Mrliu-l/springboot-mq.git