消息中间件_笔记

消息中间件

概念

https://www.jianshu.com/p/4b7865dbb19a
消息中间件满足:

  1. 利用高效可靠的数据传递机制,进行平台无关的数据交流。
  2. 基于数据通信来进行分布式系统的集成。
  3. 通过消息传递、队列模型,拓展分布式系统进程间通信。

程序=算法+数据结构;消息中间件可作数据缓冲、异步处理、应用解耦、消息通信。
核心:协议、持久化机制、消息分发机制、高可用设计、高可靠设计

  • 协议:AMQP、MQTT(无事务、持久化)、OpenMessage、Kafka(无事务)
  • 持久化:文件系统、数据库(仅rabbitmq支持)
  • 消息分发:发布订阅、轮询分发/公平分发、重发、消息拉取
  • 高可用(High Availability),正常运行时长/总运行时长;主从、集群。
  • 高可靠(High Reliability),发送错误、故障时维持软件系统功能的能力。

JMS抽象

https://blog.csdn.net/qq_29645505/article/details/81463718
jms消息模式:点对点Queue、发布订阅Topic
消息队列:内存队列、持久化队列。
消息持久化:声明exchange、queue为持久化,传递消息时声明需持久化。
消息处理级别:at most once(丢消息),at least once(重复),exactly once(性能)
类比数据库、ApplicationEvent理解。
消息队列技术:https://www.cnblogs.com/tianqing/p/7110468.html

AMQP

软件数据总线。

概念

https://www.jianshu.com/p/38b8cbb19673
broker;代理
virtual host;虚拟主机,一个broker多个virtual host。用户权限粒度为vhost
exchange;交换机,四种:direct、topic、fanout、headers。有一个默认交换机,derect。
binding;绑定,将queue绑定到exchange。不绑定的队列,交换机无法路由到。
queue;队列,存放消息。持久化队列、内存队列。FIFO。一个队列可有多个消费者。
connection;连接queue。tcp连接,nio复用。CS结构。
channel;信道,一个connection多个信道。nio。包含exchange、binding。每个消费者一个。
producer;生产者,通过exchange+routeKey连接到queue,发布消息。
consumer;消费者,pull、push。直接连queue。
message;消息,push模式只能被消费一次。
message acknowledgement;消息回执,删除消息:basic.ok、basic.ack
message attributes and payload;消息属性与载荷。

RabbitMQ

镜像队列,集群中同步数据,HA。https://blog.csdn.net/u011973222/article/details/86233541
镜像队列除publish操作外,都只能在master节点执行,而后同步到镜像队列。
镜像队列模式:all、exactly、nodes
节点类型:内存节点、磁盘节点。一个集群中至少一个磁盘节点;持久化queue、binding、exchange、virtual host元数据。消息数据由镜像队列备份。
界面管理插件
地址:localhost:15672
rabbitmq-plugins enable rabbitmq_management
启动rabbitmq后增加用户:

  • rabbitmqctl add_user test test
  • rabbitmqctl set_user_tags test administrator

授权

  • 语法: set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
  • rabbitmqctl set_permissions -p / uName .* .* .*

集群
https://blog.csdn.net/sswqzx/article/details/86038042
rabbitmq运行模式:单机、集群、镜像集群。
集群内同步queue、binding、exchange、virtual host元数据;用户访问任一节点,获取到的元数据都相同。类似redis寻址。
支持publisher.confirm、事务。

Spring AMQP

https://docs.spring.io/spring-amqp/docs/2.1.7.RELEASE/reference/html/

2 简介

2.1 快速使用
导包:org.springframework.amqp#spring-rabbit
核心类:ConnectionFactory、AmqpTemplate、AmqpAdmin
注册为bean的exchange、binding、queue,AmqpAdmin在消息中间件中自动新建。
2.2 新特性
1,需禁用RabbitConnectionFactory的自动恢复,防止与spring策略冲突。自动配置已禁用。

3 使用Spring AMQP

3.1 AMQP抽象
两个模块:spring-amqp、spring-rabbit
Message;消息抽象类,消息属性、消息内容(byte[])。Message.addWhiteListPatterns(String…),增加toString()时反序列化类,默认java.util/lang包反序列化。
Exchange;交换机接口,
Queue;消息队列
Binding;绑定交换机和队列。BindingBuilder。
3.2 连接和资源管理
接口:ConnectionFactory、Connection
CachingConnectionFactory,默认建立由应用程序共享的单个连接;缓存复用通道(channel),若通道为事务性则为通道维护单独的缓存。
CachingConnectionFactory#setCacheMode();设置缓存类型,CacheMode.CONNECTION(默认CHANNEL),缓存连接和通道,此时不支持自动声明交换机、绑定、队列。
CachingConnectionFactory#createConnection();从缓存中获取空闲连接,或新建连接
1,ConnectionNameStrategy
连接命名策略,用于在rabbitmq监视界面展示连接名。可重复。
2,连接阻塞和资源限制
BlockedListener,发布连接事件,ConnectionBlockedEvent、ConnectionUnblockedEvent。
3,底层连接工厂,RabbitConnectionFactory

springboot整合AMQP

https://www.jianshu.com/p/2c2a7cfdd38a
导包:spring-boot-starter-amqp
配置:ConnectionFactory、AmqpTemplate、AmqpAdmin、@RabbitListener+@RabbitHandler
其他类,自动绑定:
1,ConnectionNameStrategy;连接命名策略
2,RetryTemplate;重试,默认关闭。spring.rabbitmq.template.retry.enable.*配置
3,RabbitListenerContainerFactory;监听容器工厂
4,MessageConverter;消息转换器,默认jdk,可选Jackson2JsonMessageConverter
5,MessageRecoverer;消费失败消息覆盖,所有重试retry失败后覆盖策略,容器默认RejectAndDontRequeueRecoverer。

  • RecoveryCallback,发送retry失败回调

6,重试禁用时,消息消费失败会无限重发;两种方式修改:抛AmqpRejectAndDontRequeueException,RabbitListenerContainerFactory.setDefaultRequeueRejected(false)
7,异常处理,ErrorHandler/RabbitListenerErrorHandler
8,事务,支持ack、publish、reject操作;在Channel中执行,编程式事务,txSelect()、txCommit()、txRollback();显式获取Channel后必须close()关闭。ConnectionFactory、RabbitTemplate中可配置所有channel启用事务。
9,ConnectionListener、ChannelListener、BlockedListener、RecoveryListener;监听对应事件
10,RabbitTemplate.ReturnCallback/ConfirmCallback;发布回调
11,retry机制,网络不稳定时重发;发送者在connection中断时重试,exchange等不存在不重试;消费者在pull消费失败重试,push方式有ack机制。
12,发送者连接中断重试,confirm确认是否成功;短时中断重发(定时重发),长时中断记录消息。
13,消费者消息去重,通过messageId–MessageProperties
14,消息过期,MessageProperties–expiration
15,消费者、发送者使用不同连接,usePublisherConnection–true.
16,CorrelationData;发送者关联信息,可用于绑定message相关信息,在ConfirmCallback中处理。
17,rabbitmq ack默认为auto,取出消息就发出ack;改为手动确认。springboot中抛出异常则为noack

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值