中间件
RabbitMQ
核心的五个概念
- Queue:正真存储数据的地方
- Exchange:接受请求后,转存数据
- Bind:收到请求后存储到那里
- 消息生产者:发送数据的应用
- 消息消费者:取出数据处理的应用
前言–分布式事务的几种解决方案
- 基于数据库XA/JTA协议的方式;需要数据库厂商的支持,Java组件有atomikos等;
- 异步校对数据的方式 支付宝,微信支付 主动查询支付状态、对账单等形式;
- 基于可靠消息(MQ)的解决方案 异步场景;通用性较强;拓展性高
- TCC编程式解决方案 严选、阿里、蚂蚁金服自己封装的DTX
分布式事务的解决方案,业务针对性很强,重要的是思路
接口调用成功或者失败,都会产生分布式事务问题:
- 接口调用成功,订单系统数据库事务提交失败,运单系统没有回滚,产生数据;
- 接口调用超时,订单系统数据库事务回滚,运单系统接口继续执行,产生数据;
以上两种情况,都会导致数据不一致问题。
实现分布式事务的5个步骤
步骤1-可靠消息生产-记录消息发送
步骤2-可靠消息生产-修改消息发送状态
利用Rabbitmq发布确认机制(confirm)
开启确认发布确认机制后,MQ准确受理消息返回回执。
步骤3-可靠消息处理-正常处理
开启手动ACK模式。由消费者控制消息的重发/清除/丢弃
幂等性。防止重复处理,一次用户操作,只应对一次数据处理
一定要记录该条消息的处理次数,防止重发多次,导致死循环(redis内存数据库记录每条消息的处理次数)
生产环境,重要数据出现异常,人工干预
如果不给回复,就等这个consumer断开连接后,mq-server会继续推送
步骤4-可靠消息处理-消息丢弃
消费者处理失败,直接丢弃或者转移到死信队列(DLQ)
重试次数过多,消息内容格式错误等情况,通过线上预警机制通知运维人员。
优缺点
优点:
通用性很强
扩展性强
方案成熟
缺点:
1.基于消息中间件,只适合异步场景
2.消息处理会有延迟,需要业务上能够容忍
尽量避免分布式事务
尽量将非核心事务做成异步
分布式事务解决方案的理论依据
CAP理论
BASE理论
2PC协议
3PC协议
Paxos算法
Raft一致性协议
分布式消息中间件设计专题
单体架构
分布式架构
系统间耦合度太高
通过消息中间件解耦
消息中间件概述
什么是消息中间件
- 利用高效可靠的消息传递机制进行平台无关的数据交流
- 并基于数据通信来进行分布式系统的集成
- 通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信
消息中间件的应用场景
跨系统数据传递、高并发流量削峰、数据异步处理等
常用的消息中间件
ActiveMQ RabbitMQ Kafka RocketMQ
消息中间件核心设计
本质
一种具备接收请求、保存数据、发送数据等功能的网络应用
和一般网络应用程序的区别是它主要负责数据的接收和传递,所以性能一般高俞普通程序
5大核心组成
协议:计算机之间通信时共同遵循的一组约定,都遵循相同的约定,计算机之间才能相互交流。
是对数据格式和计算机之间交换数据时必须遵循的规则的正式描述
协议三要素:
- 语法:及数据与控制信息的结构和格式
- 语义:即需要发出何种控制信息,完成何种动作以及做出何种响应
- 时序(同步):即事件实现顺序的详细说明
http协议三要素举例
语法:http规定了请求报文和响应报文的具体格式
语义:客户端总动发起的操作成为请求
时序:一个请求对应着一个响应
消息中间件常用的协议:OpenWire 、AMQP、MQTT、Kafka、OpenMessage
为什么消息中间件不直接使用Http协议?
内容多,格式复杂(),中间件需要高性能,简洁
Http短链接,不利于消息中间件长期获取信息的需求
AMQP协议(RabbitMQ,active MQ)
AMQP是高级消息队列协议 04年摩根大通公司联合其他公司共同设计
特性:事务支持,持久化设计,出生在金融行业,在可靠性消息处理上具备天然的优势。
MQTT协议
MQTT消息队列遥感传输 是IBM开发的一个即时通讯协议,物联网系统架构中重要组成部分。
特性:
轻量、结构简单、传输快、没有事务支持,没有持久化相关设计
适用场景:
适用于计算能力有限,低带宽,网络不稳定的场景。
Open Message协议(Apache RocketMQ)
OpenMessage是近一两年由阿里发起,与雅虎、滴滴出行、Streamlio等公司共同参与创立的分布式消息中间件、流处理领域的应用开发标准。是国内首个在全球范围内发起的分布式消息领域国际标准。
特性
结构简单、解析快、有事务设计、有持久化设计
Kafka协议(开发出来就是用于日志处理)
kafka协议是基于TCP的二进制协议。消息内部是通过长度来分隔,由一些基本数据类型组成。
特性
结构简单、解析快、无事务设计、由持久化设计
持久化
持久化是什么?
简单来说就是将数据存入磁盘,而不是存在内存中随服务器重启而消失。使数据能够永久保存叫做持久化。
持久化机制
消息分发机制
高可用设计
高可靠设计