一、消息队列
为什么:解耦、流量削峰、日志收集、事务一致性
二、消息协议
AMQP
MQTT
STOMP:文本
XMPP:xml
JMS:java 与平台无关;点对点/发布订阅两种模式
三、RabbitMQ(基于AMQP协议)
实例
异步处理:收到消息后才采取业务措施
实践建议
1、虚拟主机:服务器区分不同业务队列
2、消息保存
disk:主动声明要写入磁盘
内存:内存满写入
Queue、Message、Exchange持久化:通过响应速度判断是否开启
3、消息确认模式(发送->Broker的确认)
普通确认:串行
批量确认:多条消息
异步确认:通过回调 确认发送成功 返回的是消息id
4、消费者应答(到消费者的确认)
1、回执:自动:发送给消费者后把消息从Broker队列删除 手动:消费者发送主动ack
2、拒绝消息:消费者处理失败/不能处理,发送拒绝指令,删除/重新入队
3、消息预取:消费者预取多条消息数量
5、流控机制
通过信用组MoreCreditAfter控制生产者发送数量,进行阻塞
6、通道
不同线程配置不同通道。每个连接多个通道
总结:高可用高可靠;但是吞吐量不行
四 ActiveMQ(JMS)
基本概念
实例:基于主题
可创建多个主题消费者
基于ActiveMQ的分布式事务:需要操作不同服务器的数据库
解决方案:每个数据库添加事务表。可以理解为消息缓存在数据库事务表中,定时从中取事务,宕机只会事务回滚/重启会重新操作
实践建议
1、消息转发模式
持久化(可靠性好) 非持久化(性能好)
2、消息积压
1、设置过期时间
2、死信队列:一直不能处理的消息
3、消息事务
4、应答模式
自动确认、客户端手动确认、批量确认、单条确认
5、发送优化
同步/异步发送
流量控制如设置队列内存
6、消费优化
消息预取
慢速消费者:等待消息限制/消息丢弃策略
7、消息协议
8、消息持久化
五、Kafka
六、RocketMQ
整个下来通过网络资源整理学习,并且完善了一些代码,程序员挺累的
如果觉得不错可以点歌关注吧~