分布式架构三大剑客:消息中间件、缓存中间件、RPC调用机制
消息中间件
消息中间件能做什么?
- 异步:将系统串行任务异步化
- 解耦:将系统解耦
- 销峰:通过消息队列的队列长度限制同时来临的订单数量,减少大流量对系统的冲击,实现销峰限流。取决于流量大小,流量大选择kafka或RocketMQ,流量适中选择RabbitMQ
- 跨系统数据传递(通讯):实现RPC进行通讯,实际上不会用MQ实现通讯,而是使用Netty
- 海量数据同步方案:首先kafka,一般用于log日志传输,类似mysql的binlog数据同步
- 任务调度:通过mq的延迟队列实现,首先RabbitMQ
- 分布式事务之最终一致性:RabbitMQ本身不支持事务消息,但是利用其特性confirm + ack机制可以实现分布式事务;RocketMQ本身支持事务消息。
- 事件驱动编程:时效性要求低的可以使用定时任务,时效性高的就可以使用消息中间件
- 高内聚低耦合
- 顺序保证
- 可靠传递
消息中间件的本质?
- 一种具备接收请求、保存数据、发送数据等功能的网络应用。
- 和一般网络应用的区别是它只负责数据的接收和传递,所以性能高于普通程序。
消息中间件核心组成?
- 协议:程序通过什么协议与消息中间件沟通
- 持久化:什么技术支持MQ消息持久化存储
- 消息分发:MQ收到消息后,怎么处理,如何发给其他人,如果发送失败,是否重试?
- 高可用:保证消息中间件可用、不当机,通过集群部署保证高可用
- 高可靠:消息发送成功,通过重试保证高可靠
消息中间件常用协议:
OpenWire(很少用):路由器会使用此协议。- AMQP:标准的协议。RabbitMQ使用此协议。
- MQTT:车载系统监控使用此协议。轻量、结构简单、传输快、没有事务、无持久化设计。适用于计算能力有限,低带宽,网络不稳定的场景。
- Kafka:基于TCP的二进制协议,消息内部通过长度来分割。结构简单、解析快、无事务设计,有持久化设计。Kafka使用此协议。
- OpenMessage:阿里开发的。结构简单,解析快,有事务设计,有持久化设计。RocketMQ使用此协议。
消息中间件为什么不用Http作为协议?
- Http中有header和cookie,太笨重,性能不高
- Http一次请求一次响应
消息中间件分发策略
高可用
规定的条件和时间内处于可执行可用状态,当业务量大时,一台消息中间件服务器可能无法满足需求,这时需要集群部署,来达到高可用目的。
Master-Slave主从共享数据部署方式
主从共享数据,但是客户端只能通过主节点获取数据。当master节点挂掉,会切换到slave节点,将slave节点转换成master节点。
mysql、redis、mongodb也使用的此种部署方式。
Broker-Cluster多主集群同步部署方式
集群分片部署,不同的节点部署存储不同的数据,但是客户端可以从所有的节点上读取数据。
Master-Slave与Broker-Cluster结合
客户端调用负载均衡服务器,返回对应master节点的IP和port,然后客户端发送消息给master节点,master节点将消息同步到对应的slave节点,从而保证主从节点数据一致。
高可靠
系统无故障地持续运行,从来不崩溃、不报错,或者崩溃、报错几率很低。
消息传输可靠:通过协议来保证系统间数据解析的正确性。
消息存储可靠:通过持久化来保证消息的存储可靠性。
分布式系统:
将一个系统按照业务模块拆分(拆分原则)为多个独立的子系统
优点:
- 业务模块相互独立,某一个业务模块升级,不用升级整个系统
- 开发方便,不需要代码合并
- 如果某个业务模块压力大,只需要对该业务模块单独进行水平扩展(集群部署),其他业务模块不收影响,可以充分合理利用资源
缺点:
- 系统之间交互变得复杂,需要RPC/rest/MQ来实现相互调用
- 当一个业务特别大时,可能会出现业务系统崩溃的问题,可以通过自动化水平扩容解决这个问题
消息中间件带来的风险?
- 系统可用性风险:为了解决MQ挂掉带来的可用性风险,需要考虑高可用,使用集群部署
- 系统复杂度提高:
- 数据一致性保证:将串行任务解耦成异步任务,有可能某个子任务执行失败导致结果不一致
常用的消息中间件
ActiveMQ:处理能力最低,老牌的基于Java JMS规范来设计的- RabbitMQ:如果系统没有高并发高性能要求,首选RabbitMQ。RabbitMQ是用Er lang语言实现AMQP(Advanced Message Queue Protocol)协议的消息中间件,支持多语言。
- RocketMQ:如果需要高并发高性能,选择RocketMQ。是Alibaba开源项目,贡献给了Apache。在Alibaba内部称为MetaQ,是SpringCould技术组成部分。使用的OpenMessage协议。结构简单,解析快,有事务处设计,有持久化设计。
- Kafka:Apache开源产品,追求高吞吐量,如果需要超大高并发高性能,对消息处理能力要求很高,并且需要整合大数据流式框架,选择Kafka。Kafka是采用pull的方式来进行消息的获取,底层采用0拷贝技术,减少了用户空间和内核空间的IO操作,从而大大提高了消息读写性能。
消息获取有两种方式:pull和push
pull:消费者主动去broker中拿取数据进行消费
push:broker一旦拿到消息后主动推送给相应的消费者